DWR
学习笔记
内容目录
1.
简介
2.
环境搭建与配置
3.
DWR
配置文件
4.
Servlet
参数传递
5.
与公司框架结合的问题
6.
配置选项
7.
DWRUtil
1.
简介
DWR 是
Direct Web Remoting 的简称.可以通过脚本直接调用java方法.
和其他代理框架相比
,DWR后台严格限制必须以java为后台.
有相当完善的文档支持
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
<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调用之后要执行的函数.如按钮可用.
7.
DWRUtil
8.
备注
1. DWR和HttpSessionBindingListeners
DWR1.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的
setAttribute()方法。就是说,如果一个Bean在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR都会执行一次 session.setAttribute(yourBean)。这看上去没有什么危害,但是如果你要使用servlet的事件机制的,就是说用了HttpSessionBindingListener接口,你就会发现valueBound和valueUnbound事件在每次调用时都会发生,而不是你想像的在bean被创建时以及session过期时。
DWR2 只在第一次创建对象时调用
setAttribute()。