---------
第一步:讓DWR可以訪問Spring的上下文
爲了整合DWR與spring,DWR需要訪問Spring的上下文。這裏有兩個選擇:
1. 使用Spring MVC
2. 使用DWRSpringServlet
使用Spring MVC
如果使用Spring MVC,那麼我們的web.xml配置就像這樣:
- <servlet>
- <servlet-name>springDispatcher</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value> classpath:yourSpringContext.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springDispatcher</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>springDispatcher</servlet-name>
- <url-pattern>/dwr/*</url-pattern>
- </servlet-mapping>
使用DWRSpringServlet
如果你不使用SpringMVC,那麼可以使用DwrSpringServlet。這個Servlet獲得在你的web.xml中配置的Spring上下文。web.xml的配置如下:
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- classpath:yourSpringContext.xml
- </param-value>
- </context-param>
- <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>
第二步:配置DWR的遠程訪問
配置DWR的遠程訪問在這裏有多個選項,我們平常使用dwr.xml文件,在文件中使用創建器與轉換器完成的。然而,spring2.X中引入了新的功能(命名空間),在DWR2.X或更高的版本中,我們可以使用這個配置來整合DWR與spring,並定義遠程訪問(注意:spring的版本必須要2.5以上):
第一種方式:使用命名空間
在使用命名空間時,也有兩種方式,一種普通的聲明方式,另一種註解聲明的方式
首先在Spring的xml配置文件中加入DWR的命名空間的頭
- <beans
- ...
- xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
- xsi:schemaLocation="....
- http://www.directwebremoting.org/schema/spring-dwr
- http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
控制器標籤(springMVC)
如果你不使用SpringMVC,可以跳過這節,控制器標籤只適用於SpringMVC的配置。
如果你使用springMVC,你必須聲明一個:
- <dwr:controller id="dwrController" debug="true"/>
另外,你可以指定你自己的SimpleUrlHandlerMapping。DWR需要下面這些URL的映射:/engine.js,/interface.js,/call/**,/interface/**,如例:
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property value="true" name="alwaysUseFullPath"></property>
- <property name="mappings">
- <props>
- <prop key="/dwr/**/*">dwrController</prop>
- </props>
- </property>
- </bean>
<dwr:configuration/>是用來模擬在dwr.xml配置的行爲。這個標籤是可選的。它可能是嵌套標籤(init,creator,signatures,...),這些嵌套標籤模仿那些在dwr.xml的行爲。如例:
- <dwr:configuration>
- <dwr:convert type="bean" class="org.uk.ltd.dwr.dev.model.Address" />
- </dwr:configuration>
你可以在每個bean裏包含<dwr:remote javascript="...">標籤,在這裏,你可以指定被代理的方法或不允許被代理的方法,如:
- <bean id="timeConvert" class="com.mycompany.ui.util.TimeConvert">
- <dwr:remote javascript="AjaxTimeConvert">
- <dwr:include method="convert" />
- </dwr:remote>
- </bean>
<dwr:annotation-scan>: 註解掃描,允許DWR掃描classpath,檢測Bean的@RemoteProxy與@RemoteMethod註解,
註冊他們併爲他們創建構建器代理。這個元素包括一些可用的屬性:
base-package: 被掃描的包
regex: 一個正則表達式,將在classpath的掃描中使用
scanRemoteProxy: DWR的遠程代理掃描,默認爲true
scanDataTransferObject: DWR的轉換器掃描,默認爲true,掃描帶有@DataTransferObject註解的類,表示要轉換的類。
scanGlobalFilte: 默認爲true
<dwr:annotation-config>: 允許DWR掃描spring的上下文,檢測帶有@RemoteProxy與@RemoteMethod的註解,併爲他們註冊創建器代理。
(上面兩個配置,好像是兩選一!!!???)
關於java類上的註解使用說明
@RemoteProxy註解(用於類上)說明這個類可以被遠程訪問,@RemoteMethod註解(用於方法上)說明這個方法可以被調用。這個類中任何沒有被註解的方法將不能被DWR使用。如果希望使用與當前類不同的其他javascript對象名,需要給@RemoteProxy註解添加一個name屬性,如下:
- @RemoteProxy(name="SomeClassName")
- @DataTransferObject
- public class MyBean{
- @RemoteProperty
- private String firstName;
- public String getFirstName(){
- return firstName;
- }
- }
第二種方式: 在dwr.xml文件中使用spring的創建器
如果你不喜歡使用註解的方式,我們可以使用傳統的dwr.xml配置,使用基於spring的創建器。 創建器將查找spring的bean配置文件,並依賴spring實例化它們。如例:
- <allow>
- ...
- <create creator="spring" javascript="Fred">
- <param name="beanName" value="Shiela"/>
- </create>
- ...
- </allow>