обмен данными между Java и JavaScript
От: Shanga  
Дата: 09.04.09 12:15
Оценка:
Есть такая задача в которой просто не обойтись без сабж.

JavaScript:
Нужно вызывать методы Java передавая им данные и получая от них.
В единой сессии, т.е. DWR отпадает


Java: (элементарный пример класса)
class CContainer{

public void      setParam(ANY_TYPE Param);
public ANY_TYPE  getParam();

}


Дайте пример plz.
Re: обмен данными между Java и JavaScript
От: Donz Россия http://donz-ru.livejournal.com
Дата: 09.04.09 12:38
Оценка:
Здравствуйте, Shanga, Вы писали:

S>Есть такая задача в которой просто не обойтись без сабж.


S>JavaScript:

S>Нужно вызывать методы Java передавая им данные и получая от них.
S>В единой сессии, т.е. DWR отпадает


S>Java: (элементарный пример класса)

S>
S>class CContainer{

S>public void      setParam(ANY_TYPE Param);
S>public ANY_TYPE  getParam();

S>}
S>


Используем библиотеку Zkoss (http://zkoss.org), но это полноценный AJAX со всей фигней. К тому же болото, и работа с яваскриптом не всегда очевидна, иногда через полную Ж.
Re: обмен данными между Java и JavaScript
От: mazurkin http://mazurkin.info
Дата: 09.04.09 12:39
Оценка: +1
Shanga wrote:

> В единой сессии, т.е. DWR отпадает


Что означают ваши слова и как их понять?

Session session =
org.directwebremoting.WebContextFactory.get().getSession();
Posted via RSDN NNTP Server 2.1 beta
Re[2]: обмен данными между Java и JavaScript
От: Shanga  
Дата: 09.04.09 13:03
Оценка:
Здравствуйте, mazurkin, Вы писали:
>> В единой сессии, т.е. DWR отпадает

M>Что означают ваши слова и как их понять?


M>
M>Session session =
M>org.directwebremoting.WebContextFactory.get().getSession();
M>


Это значит, что должен быть один объект для всех обращений к методам,
а DWR это:
<html>
<head>
  <script src='dwr/interface/CContainer.js'/>
  <script src='dwr/engine.js'/>
  <script src='dwr/util.js'/>
  
  <script type="text/javascript"> 

        function getParameters(){
            ...
            CContainer.getParamCount(...);
            ...
        }

        function setParameters(){
            ...
            CContainer.setParam(...);
            ...
        }
  ...
  </script>

</head>

<body onload="something();">
...



В данном случае занося данные в CContainer мы не можем вновь к ним обратиться(теряются),
DWR предназначен для работы с DB, а не с переменными класса...
Re[3]: обмен данными между Java и JavaScript
От: leith  
Дата: 09.04.09 13:28
Оценка:
S>В данном случае занося данные в CContainer мы не можем вновь к ним обратиться(теряются),
S>DWR предназначен для работы с DB, а не с переменными класса...

Так сделайте его синглтоном (со Spring для этого ничего не придется делать особенного, без него — немного написать своего кода).
Кажется так
Re[4]: обмен данными между Java и JavaScript
От: Shanga  
Дата: 09.04.09 14:18
Оценка:
Здравствуйте, leith, Вы писали:

Это не тот случай, он будет глючить(проверено на опыте).
К проекту дофига всего прикручено...

S>>В данном случае занося данные в CContainer мы не можем вновь к ним обратиться(теряются),

S>>DWR предназначен для работы с DB, а не с переменными класса...

L>Так сделайте его синглтоном (со Spring для этого ничего не придется делать особенного, без него — немного написать своего кода).

L>Кажется так
Re[3]: обмен данными между Java и JavaScript
От: Oboltus  
Дата: 09.04.09 16:12
Оценка:
Здравствуйте, Shanga, Вы писали:

В моём проекте DWR вызывает java beans, которые имеют session-scope (управление через Spring). Время жизни таких bean'ов равно времени жизни сессии. Нужно только корректно обеспечить мультипоточный доступ к bean.
Re[4]: обмен данными между Java и JavaScript
От: Shanga  
Дата: 10.04.09 06:41
Оценка:
Здравствуйте, Oboltus, Вы писали:

Можешь дать примерчик, я что-то нормальной документации не нахожу...

O>Здравствуйте, Shanga, Вы писали:


O>В моём проекте DWR вызывает java beans, которые имеют session-scope (управление через Spring). Время жизни таких bean'ов равно времени жизни сессии. Нужно только корректно обеспечить мультипоточный доступ к bean.
Re[5]: обмен данными между Java и JavaScript
От: Oboltus  
Дата: 10.04.09 07:23
Оценка:
Здравствуйте, Shanga, Вы писали:
S>Можешь дать примерчик, я что-то нормальной документации не нахожу...

Не знаю, каковы ваши знания в Spring и DWR, так что извините за банальные вещи.

Шаг 0. Интегрируем DWR в Spring. На эту тему есть документация. В минимальном варианте нужно добавить тэг <dwr:configuration> в конфигурационный файл Spring.

Шаг 1. Cоздадим класс нашего бина:
package MyPackage;

class MyBean implements BeanInterface {
  private String someProp;

  @Override
  public synchronized String getSomeProp() {
    return someProp;
  }

  @Override
  public synchronized void setSomeProp(String someProp) {
    this.someProp = someProp;
  }
}


Обратите внимание на две вещи:

1) Класс реализует интерфейс BeanInterface (я не стал писать его код), который содержит в себе объявления всех методов, которые Вы хотите использовать в JavaScript. Без использования интерфейса связка Spring-DWR не будет работать.

2) Методы класса объявлены synchronized. Этим я хотел показать, что доступ к объекту может осуществляться из разных потоков. В реальном объекте синхронизация может быть реализована более красиво и эффективно.

Шаг 2. Объявим наш класс в Spring. Ниже — фрагмент из конфигурационного файла Spring:

<bean id="myBean" class="MyPackage.MyBean" scope="session">
  <dwr:remote javascript="MyBean" />
  <aop:scoped-proxy proxy-target-class="false" />
</bean>


Обратите внимание на следующее:

1) Время жизни объекта определено в session, то есть он будет создан при первом обращении и будет существовать до конца сессии. В принципе, время жизни может быть любым (и длиннее и короче жизни сессии), у Spring на этот счёт много возможностей. Важно то, что DWR об этом ничего не знает и знать не должен.

2) Тэг <dwr:remote> объявляет, что данный объект будет управляться DWR. В данном примере тэг пустой, но может содержать доп. информацию.

3) Тэг <aop:scoped-proxy> гарантирует правильность создания объекта (то есть его времени жизни) при работе с DWR. Имейте в виду, что реально DWR будет работать не с экземпляром класса MyBean, а с proxy-классом, созданным автоматически. Вот почему важно, чтобы вся функциональность была объявлена в интерфейсе.

Шаг 3. Работаем с объектом из JavaScript:

// в рамках одной сессии будет обращения к одному и тому же объекту
var s = MyBean.getSomeProp();
s = "<b>" + s + "</b>";
MyBean.setSomeProp(s);
Re[6]: обмен данными между Java и JavaScript
От: mazurkin http://mazurkin.info
Дата: 10.04.09 08:19
Оценка:
>
> <bean id="myBean" class="MyPackage.MyBean" scope="session">
>   <dwr:remote javascript="MyBean" />
>   <aop:scoped-proxy proxy-target-class="false" />
> </bean>
>


Как вариант для ниасиливающих: просто получаем в методе DWR текущую
сессию через уже указанный мной код

Session session =
org.directwebremoting.WebContextFactory.get().getSession();


И сохраняем в сессии объект с состоянием, а потом также через аттрибуты
сессии запрашиваем его.
Posted via RSDN NNTP Server 2.1 beta
Re: обмен данными между Java и JavaScript
От: Shanga  
Дата: 10.04.09 10:20
Оценка:
как на счет AJAX-а?

как это реализовать?!
Re[2]: обмен данными между Java и JavaScript
От: zubr Россия  
Дата: 10.04.09 11:07
Оценка:
Здравствуйте, Shanga, Вы писали:

S>как на счет AJAX-а?


S>как это реализовать?!


хм... создаешь XmlHttpRequest на стороне браузера, пишешь нужный урл, сессию сам браузер должен проставить
говоришь пост, гет, или что там у тебя... и ждешь...
а урл твой указывает на Controller какой нибудь, который умеет обрабатывать запросы от JS, дальше ты делаешь все что тебе нужно, и респонс рисуешь с помощью кастомного какого нибудь JSON view... вот и вся магия...
Re[3]: обмен данными между Java и JavaScript
От: Shanga  
Дата: 10.04.09 12:34
Оценка:
Все заработало Thanks!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.