Direct Web Remoting 的简称

1. 简介
DWR 是Direct Web Remoting 的简称.可以通过脚本直接调用java方法.
和其他代理框架相比,DWR后台严格限制必须以java为后台.
有相当完善的文档支持
网址: http://getahead.ltd.uk/dwr/
2. 环境搭建与配置
1. 从 http://getahead.ltd.uk/dwr/ 下载dwr.jar
2. web.xml 文件中 DWR Servlet的配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
uk.ltd.getahead.dwr.DWRServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

DWRServlet 的 debug参数的选项:
1.true : 可以通过我们就可以http://server:port/webapp/dwr/ 查看,当前有哪些类可以供javascript调用
2.false :部属到实际应用时记得要设置为false
3. 编写后台的java类

package com.rbi.stady;
public class DwrTestServiceImpl {
public String getMessage(String name){
return "Hello "+name;
}
}
4. DWR配置文件
默认文件: WEB-INF\下的dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="dwrTest">
<param name="class" value="com.rbi.stady.DwrTestServiceImpl" />
</create>
</allow>
</dwr>
5. HTML添加DWR的js和自动生成的后台代码
1.<script type="text/javascript"
src="<%=request.getContextPath()%>/dwr/engine.js"></script>
2.<scripttype="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/dwrTest.js"></script>
6. js的调用
dwrTest.getMessage(‘Jack’,getDataFun)
function getDataFun(data){
…………
}

3. DWR配置文件
1. 类的配置:
1.远程调用类的配置
<create creator="new" javascript="dwrTest" scope="request">
<param name="class" value="com.rbi.stady.DwrTestServiceImpl" />
<include method="checkUser" />
<!--<exclude method="..."/>-->
</create>
<create>标签:
creator (必须项)值范围:new,spring,scripted
1.1x 版本后新增 none, jsf,struts,pageflow
scope (可选项)值范围 : "application", "session"(*1), "request" 和"page"。默认page
<param>标签:
<create>标签为”new”时值为“class” value值为类路径
“spring”时值为“beanName” value值为bean的配置名称
<include>和<exclude>标签:method=”方法名”
有此标签或二者选其一
无: 所有方法都可访问
<include>:此列表的方法可访问,不在其内的不可访问
<exclude>:此列表的方法不可访问,不在其内的可访问
安全上比较好的设计是使用" include "而不是" exclude"。
2.Bean的配置
<convert
converter="bean"
match="example.Fred"/>
<param
name="include"
value="property1, property2"/>
<!--<param
name="exclude"
value="property1, property2"/> -->
</convert>
<param>标签设定限制属性同方法只不过用逗号隔开.
如果要允许转换一个包或者子包下面的所有类,可以这样写:
<convert converter="bean" match="your.full.package.*"/>
显而易见,这样写是允许转换所有的JavaBean:
<convert converter="bean" match="*"/>
2. 返回的变量:
1. 基本的类型:
boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String
2. 日期类型:与javascript里的Date对应.包括: java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp
3. 自定义的Bean
<convert converter="bean" match="com.rbi.entity.User"/>
4. List,Set类型.
返回客户端为数组.若返回的为对象数组,该对象必须在配置文件中有定义Bean
5. Map 类型.
返回的类型如同对象
如: 服务器 返回的Map内容如下:Map map = new HashMap();
map.put(“no1”,user1);map.put(“no2”,user2);
客户端js对取得的data取内容里的值:
var data1 = data[‘no1’]; var data2 = data.no2;
6. 返回void类型时回调函数无参数
3. 传入参数:
1. 基本类与日期型自定义Bean同上.
2. List,Set类型
Bean的属性还是,远程调用类的方法都要通过<signatures>标签,有其他的参数要有逗号隔开

<signatures>
<![CDATA[
import java.util.List;
import com.rbi.stady.DwrTestServiceImpl;
import com.rbi.entity.User;
import com.rbi.entity.Address;

DwrTestServiceImpl
.getUsersNames(List<User>);
User.setAddresses(List<Address>);
]]>
</signatures>
4. Servlet参数传递
做web应用的时候,常常要取得用户身份,或者取得一些Servlet上下文变量和应用环境等. 我们通常获取ServletContext,request, response等来取得这些值。DWR提供了两个办法解决这些问题
1、使用DWR的一个静态的API,不推荐。
2. DWR会自动注入这些servlet变量,这些变量只包括以下的五个:
HttpServletRequest
HttpServletResponse
HttpSession
ServletContext
ServletConfig
5. 与公司框架结合的问题
1. Spring 与 struts 集成的方式
方法1
1.1. 通过struts 配置文件的 plug-in 初始化spring实例
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property
property="contextConfigLocation" value="/../application-….xml " />
</plug-in>
1.2. 两种方式配置action
(a). action 继承 org.springframework.web.struts.DispatchActionSupport
配置文件采用struts的配置方式.通过getWebApplicationContext()方法取得 WebApplicationContext 再通过WebApplicationContext方法
getBean(“beanName”);
(b)action继承
org.springframework.web.struts.ActionSupport
配置文件采用spring的配置方式.
<bean name=”/actionName.do”
class=” package.className”>
<property name=”propertyName”>
<ref bean=”springBeanName”/>
</property>
</bean>
方法2
2.1 通过web.xml初始化spring实例
<servlet>
<servlet-name>context</servlet-name>
<servlet-class> org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<listener>
<listener-class>
org.springframework.web.context
.ContextLoaderListener
</listener-class>
</listener>

配置context-param
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/…/application-….xml,
</param-value>
</context-param>
2.2 action 继承
org.springframework.web.struts.DispatchActionSupport

2. 公司项目采用的方式: 方法1à 1.1+1.2(a)
问题 : 通过 plug-in 标签的方式,在其他监听器,过滤器的访问成问题
dwr 配置spring Bean无法生成
解决办法:采取 方法 2.1+1.2(a)
6. engine.js
1.超时的处理(设置的单位为豪秒):
a.全局的设置: DWREngine.setTimeout(1000);默认为0,为0时就是超时不处理
b.单个远程调用的设置:
remoteClass
. Method (参数,{callback:jsfun,timeout:100000})
2.错误的处理:
a. 全局的设置:DWREngine.setErrorHandler(jsfun);
b. remoteClass
.method(参数, {
callback: jsfun,
errorHandler:function(errorString, exception) { ... }
});
3.批量的处理:
一次性提交到服务器
DWREngine.beginBatch();
remoteClass1.method (参数, jsfun);
remoteClass2.method (参数, jsfun);
DWREngine.endBatch();
4. 异步调用:
DWREngine.setOrdered(boolean)默认为false;
严格按照发送的顺序返回。DWR在旧的请求安全返回以后才去发送新的请求。把这个设置为true会减慢你的应用程序,如果一个消息丢失,浏览器就会没有响应。
5. 请求前处理
DWREngine.setPreHook(jsfun)
在DWR调用之前设置执行一个函数(但是这个函数无参数)例如让按钮不可用.
6. 请求后处理
DWREngine.setPostHook(jsfun) 在DWR调用之后要执行的函数.如按钮可用.  

你可能感兴趣的:(spring,Web,bean,servlet,DWR)