Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring & DWR. Общие вопросы


Автор: Старовъръ 13.6.2009, 18:28
Было SpringMVC приложение. Возникла необходимость добавить AJAX-функционал. Насколько я понял, DWR - одно из лучших решений.
Я добавил в web.xml
Код
    <servlet>
        <servlet-name>dwr</servlet-name>
        <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>
<servlet-mapping>
        <servlet-name>dwr</servlet-name>
        <url-pattern>*.dwr</url-pattern>
    </servlet-mapping>
Создал я applicationContext-dwr.xml, который прописал в contextConfigLocation в том же web.xml.
Правильно ли я это организовую? Будет ли работать такая структура? Не будут ли обычные запросы мешать dwr-запросам?

Автор: ecologist 14.6.2009, 13:58
А dwr.xml ты написал ?

Автор: Старовъръ 14.6.2009, 14:12
Эээ.. нет... В тех примерах, что я смотрел, не было его вроде.. Можешь сюда выложить из своего проекта пример? 
А также место, где его прописывать? Или его в том же contextConfigLocation?

Автор: MisterCleric 15.6.2009, 09:39
надо вот так:
web.xml
Код

  <servlet>
        <servlet-name>dwr</servlet-name>
        <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>exposeInternals</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>scriptCompressed</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>initApplicationScopeCreatorsAtStartup</param-name>
            <param-value>true</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dwr</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>


А в applicationContext-dwr.xml должен быть типа такого конфиг:
Код

<beans:beans xmlns="http://www.directwebremoting.org/schema/spring-dwr"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:aop="http://www.springframework.org/schema/aop"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<beans:bean class="mycompany.web.spring.AuthorizationPinger">
        <remote javascript="Authorization"/>
        <aop:scoped-proxy/>
    </beans:bean>
  <configuration>
        <create type="new" javascript="validator" class="com.opensymphony.webwork.validators.DWRValidator"/>

        <create type="new" javascript="dwraction" class="org.directwebremoting.webwork.DWRAction"/>
          
        <convert type="bean" class="com.opensymphony.xwork.ValidationAwareSupport"/>

        <convert type="bean" class="org.directwebremoting.webwork.ActionDefinition"/>

        <convert type="bean" class="org.directwebremoting.webwork.AjaxResult"/>
        <convert type="bean" class="com.opensymphony.xwork.ActionSupport"/>

        <convert type="bean" class="com.cs.lisa.web.fileupload.UploadInfo"/>


        <signatures>
            <![CDATA[
        import java.util.Map;
        import com.opensymphony.webwork.validators.DWRValidator;
        import org.directwebremoting.webwork.ActionDefinition;
        import org.directwebremoting.webwork.DWRAction;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import javax.servlet.ServletContext;

        DWRValidator.doPost(String, String, Map<String, String>);
        DWRAction.execute(ActionDefinition, Map<String, String>, HttpServletRequest, HttpServletResponse, ServletContext);
        ]]>
        </signatures>
    </configuration>

</beans:beans>


Ну это я привел свой конфиг, но у тебя должны быть свои определения для того, что бы ты мог пользоваться в своем приложении AJAX от DWR

Автор: Старовъръ 15.6.2009, 18:12
Брр... что-то совсем туго( Можно тогда уже и ажакс-часть на клиенте? Не пойму чем является значение атрибута remote...

Автор: MisterCleric 15.6.2009, 18:18
Цитата

Не пойму чем является значение атрибута remote... 


Код

<remote javascript="Authorization"/>


А это как раз тот виртуальный js-файл который сгенерит DWR
Цитата

Можно тогда уже и ажакс-часть на клиенте


вот так на клиенте
Код

<script language="JavaScript" type="text/javascript"
        src='<%=<%=request.getContextPath()%>/dwr/interface/Authorization.js'></script>

Автор: Старовъръ 15.6.2009, 22:32
Хех, я изначально неправильно понял технологию DWR! Нужно читать сначала теорию, а потом только за практику браться %) Теперь все стало на свои места, большое спасибо, буду читать документацию с оф. сайта smile

Автор: Старовъръ 17.6.2009, 12:15
Сделал так:
Код
<!DOCTYPE dwr PUBLIC
        "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
        "http://getahead.org/dwr/dwr20.dtd">
<dwr>
    <allow>
        <create creator="spring" javascript="ajaxGameController">
            <param name="beanName" value="ajaxGameController"/>            
            <param name="location" value="beans.xml"/>
        </create>
    </allow>
</dwr>
В bean.xml есть бин с id="ajaxGameController":
Код
    <bean id="ajaxGameController"
          class="ru.javatalks.jtchess.web.controller.ajax.AjaxGameController">
        <property name="gameController" ref="gameController"/>
    </bean>
Когда перехожу по ссылке /dwr/ - ни одного класса из доступных не показывает... В чем проблема?

Автор: MisterCleric 17.6.2009, 13:55
что пишет на странице? Что в логах?

Автор: Старовъръ 17.6.2009, 13:59
На странице пишет:
Цитата
Classes known to DWR:
и ни одного класса нет(
Если заходить на dwr/interface/, то пишет:
Цитата
Script names may only contain Java Identifiers 
Кстати, а что здесь должно писаться?

Автор: MisterCleric 17.6.2009, 14:05
как замэплен сервлет dwr
ну строчки из web.xml

Автор: Старовъръ 17.6.2009, 14:07
Если делаю так:
Код
        <create creator="new" javascript="JDate">
            <param name="class" value="java.util.Date"/>
        </create>
То на /dwr/index отображается JDate (java.util.Date)

Добавлено через 34 секунды
Это значит, что проблема именно в связке со Спрингом...

Автор: MisterCleric 17.6.2009, 14:14
так, у меня
показывает нормально:

Classes known to DWR:

    * validator (com.opensymphony.webwork.validators.DWRValidator)
    * Authorization (mycompany.web.spring.AuthorizationPinger)
    * UploadMonitor (mycompany.web.fileupload.UploadMonitor)
    * dwraction (org.directwebremoting.webwork.DWRAction)

Что собственно надо сделать? В чем задача? А то ты уже наразмножал тем по этому поводу: то не получается, это...
Может надо исходить от первоначальной бизнес-задачи. Вроде как бы уже ж писал, что получилось.

Собственно, я на эти вот 
Цитата

Classes known to DWR


смотрю как на компоненты удаленных сервисов. Я их замепил в Spring провел тот, который мне нужен DI. Сказалу DWR сделать их RemoteProxy ну собственно и усе - зову себе со страницы javascript этих сервисов и усе. Зачем куда-то какой-то там меппинг? Все запросы на сервер через эти javascript идут через контекст /dwr
Зачем на него меппиться, если и так есть сервлет, которой все это перехватывает: DwrServlet и делает то, что его попросили - делегирует вызовы в те Java-сервисы, на которые замепплины эти javascript-интерфейсы. Может тебе не меппинг на УРЛы нужен. а AOP навернуть на методы этих сервисов? @Aspect какой-нибудь...

Автор: Старовъръ 17.6.2009, 16:19
Просто хотел создать бин в одном файле, а в ДВР лишь ссылку на него поместить..

Автор: MisterCleric 17.6.2009, 16:32
Ты который сервлет используешь?

Код

<servlet>
        <servlet-name>dwr</servlet-name>
        <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
        <!--<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>-->


Если ты создал dwr.xml то нужен второй

Автор: Старовъръ 17.6.2009, 16:33
Угу, второй..

Автор: kez 23.7.2009, 17:17
решил не плодить тем. внедряю dwr в spring mvc
web.xml
Код

<servlet>
    <servlet-name>dwr</servlet-name>
    <servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dwr</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

бин
Код

public class ContractDwr {
    public String test() {
        return "test";
    }
}

action-servlet-dwr.xml
Код

<beans:beans xmlns="http://www.directwebremoting.org/schema/spring-dwr"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:aop="http://www.springframework.org/schema/aop"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <beans:bean class="dwr.ContractDwr">
        <remote javascript="ContractDwr" />
        <aop:scoped-proxy/>
    </beans:bean>
    
    <configuration />
</beans:beans>

на jsp
Код

<script type='text/javascript' src='/cms/dwr/interface/ContractDwr.js'></script>
<script type='text/javascript' src='/cms/dwr/engine.js'></script>

вызов удаленной функции
Код

alert(ContractDwr.test());


при входе в дебаг, класс видно в списке, видно его метод test(), замечательно отрабатывает. Но при вызове из яваскрипта ContractDwr.test() возвращается undefined

что я упустил?

Автор: Старовъръ 23.7.2009, 17:35
Функция не может просто так вернуть значение. Для этого последним аргументом в нее передается callback-функция. Документацию по этому поводу можно найти http://directwebremoting.org/dwr/introduction/scripting-dwr.html.

Автор: kez 24.7.2009, 08:32
Старовъръ, большое спасибо! странно что я это упустил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)