DWR完全笔记

DWR(Direct Web Remoting )
一、介绍
DWR(直接Web远程控制)是一种AJAX(Asynchronous JavaScript and XML)的JAVA实现,它提供了一种能在web浏览器端采用JavaScript语言直接调用后台业务商业组件的解决方案。DWR通过JavaScript直接调用远程组件可以减少Web开发的时间,特别对于那些具有和用户频繁交互的Web应用程序。DWR使得浏览器不用刷新页面就可以从远程Web服务器取得用户需的数据,这种无刷新页面的交互方式大大提高Web页面的响应时间。至少用户不会感觉到刷新页面带来的等待响应心理感觉。DWR采用浏览器端采用纯JavaScript实现,并且会自动根据浏览器类型采用最高效率的远程组件调用机制。
  DWR项目是在Apache许可下的一个开源的解决方案,它供给那些想要以一种简单的方式使用AJAX和XMLHttpRequest的开发者。它具有一套Javascript功能集,它们把从HTML页面调用应用服务器上的Java对象的方法简化了。它操控不同类型的参数,并同时保持了HTML代码的可读性。
  DWR不是对一个设计的插入,也不强迫对象使用任何种类的继承结构。它和servlet框架内的应用配合的很好。对缺少DHTML编程经验的开发者来说,DWR也提供了一个JavaScript库包含了经常使用的DHTML任务,如组装表,用item填充select下拉框,改变HTML元素的内容,如<div>和<span>
  

二、简单使用
1. 导入DWR的jar文件
2. 在web.xml中增加一个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>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</init-param> 这个参数DWR默认是False。如果选择True,我们可以通过http://localhost:port/app/dwr看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为False
3. 创建DWR的配置文件dwr.xml, 放在/WEB-INF/下.(这里省略配置文件,后面有详细讲解).
  4. 配置完成后,就可以启动你的Web应用了,这时DWR会为从你的HTML或Java服务器端页面(JSP)上调用所需方法作好准备,并不需要你创建JavaScript文件。在jsp文件中, 我们必须增加由DWR提供的JavaScript接口,还有DWR引擎,加入以下三行到我们的代码中:
    <script src='dwr/interface/类名.js'></script>
   <script src='dwr/engine.js'></script>
   <script src='dwr/util.js'></script>
  JS代码:
SendMailAction.getAgentByCity(agentid, func_callback);
Function func_callback(data)
{
//data就是从服务器返回的值
}
  5. 安全因素:
DWR暴露了所有公共方法给所有的HTML页面调用。出于安全的原因,像这样暴露你的数据访问层是不明智的。我们可以创建一个门面来集中所有JavaScript函数与底层业务组件之间的通信,这样就限制了过多暴露的功能。


三、返回参数处理
1. 返回值为Map时(当key,value中有一个是复杂对象时,可参考List的处理方式)
Function fun_callback(data){
for(var i=0;i<data.length;i++)
{
for(var property in data)
{
alert("property:"+property);
alert(property+":"+data[property]);
}
}
}
2. 返回值为List时
function callBackFortestMethod(data){
//其中date接收方法的返回值 ,其中List中放的是复杂对象
for(var property in data)
{
var person = data[property];
alert(person. name);
alert(person. age);
}
}
3. 返回值为复杂对象时
继续往后看就知道了。


四、dwr.xml配置文件详解
1. DWR文件的个数可能会出现以下几种情况:
a) dwr文件之最小配置
b) 一个servlet, 多个dwr.xml配置文件;
c) 多个servlet,每个servlet对应一个或多个dwr.xml;

第一种情况配置方法:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>

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

第二种情况配置方法:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>
在这种配置下,param-name的值必须以config开头。param-name可以有>=0个。如果没有param-name,那么将会读取 WEB-INF/dwr.xml。如果有大于零个param-name,那么WEB-INF/dwr.xml文件将不会被读取。

第三种情况配置方法:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<!--用classes/dwr.xml-->
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
在这种情况下,我们可以根据J2EE security来控制权限,针对不同url,加不同的角色。

2. dwr.xml文件中的详细配置
dwr.xml 文档的根元素是 dwr。在这个元素内是 allow 元素,它指定 DWR 进行远程的类。allow 的两个子元素是 create 和 convert。

<allow>标签中包括可以暴露给javascript访问的东西。 <create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator= "new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器 Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。 <param>标签指定要公开给javascript的java类名。 <include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。 <exclude>标签指定要防止被访问的方法。

a) 与spring结合使用
<allow>
<!-- 移分兑换平台 移动兑换产品唯一性校验 -->
<create creator="spring" javascript="ProductAction">
<param name="beanName" value="/ProductAction" />
<include method="verifyProduct"/>
</create>
…….//多个<create></create>
</allow>
该action有一个校验方法,并且有附带的方法参数和String 类型的返回值。

b) 通过默认构造方法调用
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value="com.dwr.TestClass" />
<include method="testMethodName"/> </create>
</allow>

五、解决复杂参数和复杂返回值
1. 原理分析
ajax作为前后台通信的一种技术,涉及到复杂数据结构的内容传输,一般采用json进行编码。
json是一种字符串数据,类似于xml,但比Xml简单很多, 实用json的最大优势在于: java object <-- --> json string <-- --> Javascript object
这三种格式互转都有现成的API支持。 这就意味着,ajax的后台代码生成的java object数据,直接转成字符串, 通过ajax传到前台,然后在前台转成javascript对象使用,结构基本保持一致。

2. 开始解决
这里需要介绍到一个标签元素convert 元素, creator 负责公开用于 Web 远程的类和类的方法,convertor 则负责这些方法的参数和返回类型。convert 元素的作用是告诉 DWR 在服务器端 Java 对象表示和序列化的 JavaScript 之间如何转换数据类型。
DWR 自动地在 Java 和 JavaScript 表示之间调整简单数据类型。这些类型包括 Java 原生类型和它们各自的类表示,还有 String、Date、数组和集合类型。DWR 也能把 JavaBean 转换成 JavaScript 表示,但是出于安全性的原因,做这件事要求显式的配置。
示例如下:
<convert converter="bean" match="developerworks.ajax.store.Item">
<param name="include"
value="id,name,description,formattedPrice"/>
</convert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值