使用DWR框架,可以将java组件的方法直接暴露给js客户端,即客户端js代码直接调用远程的java方法,类似于java的远程方法调用。
DWR可以和spring整合,直接调用spring容器中的bean。也可以访问servlet API。
DWR框架包括两部分:
a、客户端的js。使用它们可以直接调用远程服务器的java方法。此外,DWR还提供了一些工具函数简化DOM操作。
b、服务器上运行的servlet负责处理用户请求,并将用户请求委托到实际java对象进行处理,并负责把处理结果返回客户端。
DWR根据java类动态生成js代码。
基本原理是:当开发者直接调用远程java方法时,DWR会负责将这种调用转换成对应的ajax请求,并使用XMLHttpRequest将请求发送到远程服务器端。当服务器处理完成后,DWR负责将处理结果传回客户端的js代码。
java的RMI调用是同步的。而DWR是ajax调用,是异步的。使用DWR调用远程java方法时,应增加一个js的回调函数。当远程调用的结果成功返回时,此回调函数会自动执行,回调函数负责将服务器返回的数据显示在当前页面上。
当处理远程方法返回值时,利用了DWR提供的工具对象dwr.util,这个js对象主要用于简化DOM操作。完全可以在同一项目中混合使用DWR和JQuery等。既可利用DWR的RPC风格,又可利用JQuery的工具函数。
1、DWR in Action
(1)下载和安装DWR
登陆http://directwebremoting.org/dwr/download,下载DWR最新版本。如:dwr-2.0.rcl-src.zip。然后解压缩。
dwr.jar:DWR框架的jar包。
demo:
jar:DWR框架编译和运行时所依赖的第三方类库。
java:DWR框架的源代码。
javadoc:DWR框架的API文档。
web:DWR框架的示例应用。将该文件夹直接复制到web服务器的部署目录,即可运行该示例应用。
(2)将dwr.jar文件复制到web应用的WEB-INF/lib下。(DWR运行时依赖于commons-logging-1.0.4.jar,故也需将其复制到web应用的WEB-INF/lib下)
注:在web应用的lib中添加dwr.zip里面的WEB-INF/lib里面所有的jar包。
(3)修改配置文件
a、先修改web.xml文件,保证请求转发给DWR的核心servlet处理,dwr.xml文件负责定义java类和js对象之间的对应关系。
<!–配置DWR的核心servlet–>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<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>
当debug状态时,DWR会提供一个调试页面,DWR会为每一个远程调用类生成一个测试页面;若作为产品发布,该属性设置为false。
b、增加一个dwr.xml文件,放置到WEB-INF下面。该文件负责定义java类和js对象之间的对应关系。DWR可以将任何java类转换成一个js对象。
类中的方法名不要使用javascript关键字,也不要使用方法重载。
若需要在应用中使用多个dwr.xml文件,可以在配置DWR核心servlet时增加如下配置片段:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>config***</param-name>
<param-value>WEB-INF/dwr.xml</param-value>
</init-param>
</servlet>
DWR可以使用JAAS的安全机制,将不同DWR核心servlet的URL与特定用户权限关联起来,从而提供权限控制。
(4)使用
一旦在web应用中安装了DWR,就可以编写java类了。
完成了处理类的定义,就可通过DWR配置文件定义类和js对象之间的关系。然后DWR负责将java类导出成js对象,给客户端调用。
dwr.xml文件中没有定义<allow />元素或<allow />元素为空,则DWR将什么都干不了。
<allow>元素里两个常用的元素是<create/>和<convert/>。为类指定一个create,为方法参数指定一个convert。
当使用<create/>元素创建一个js对象,首先应创建java对象。这个创建的java对象可以被放入如下几个范围:script、page、request、session、application。若指定scope=”script”,表示该java对象仅被创建成js对象。
若java方法的参数、返回值不是基本数据类型,也不是字符串类型时,DWR无法识别这种自定义类型的数据,必须在配置文件中定义转换器。
对于基本数据类型,无需在dwr.xml中<allow>元素中使用<convert>元素定义。
DWR默认支持Date转换器,负责在js的Date类型与java中的Date类型(java.util.Date、java.sql.Date、java.sql.Times、java.sql.Timestamp)之间进行转换。
js的Date.parse()将字符串解析成js的Date类型。
DWR默认关闭了Bean和Object转换器。
为某个类打开一个Bean转换器,如:<convert converter=”bean” match=”lee.Person”/>
为所有类打开一个Bean转换器,如:<convert converter=”bean” match=”*”/>
推荐使用JavaBean作为远程java方法的参数和返回值。
默认情况下,数组转换器已经是打开的。不管远程java方法中的参数是数组,还是java方法返回值是数组,都不需在dwr.xml文件中增加额外配置。
2、TIPS
(1)使用DWR annotation
DWR允许使用annotation来代替dwr.xml文件。
a、必须在配置DWR核心servlet时增加额外的配置参数:classes,该参数指定DWR自动加载哪些java类——该属性值不仅需要列出所有服务器端的java类,还需要列出所有作为DTO使用的java类。该属性值为多个java类的全名,多个类名之间以英文逗号隔开。(classes属性不支持使用通配符。若要列出内部类使用:lee.Person$Name,表示lee.Person的Name内部类)
如:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>lee.HelloDwr,lee.Person</param-value>
</init-param>
</servlet>
b、使用@RemoteProxy用于标注一个java类应转换成js对象,@RemoteMethod用于标注一个方法应暴露成可远程调用的方法。
如:
(2)反向Ajax
通常都是由浏览器发送请求,服务器响应。服务器不会主动向浏览器发送任何响应。
在反向ajax模型里,服务器的java方法可以“直接修改”浏览器里的web页面,即服务器可以主动将最新的信息发送给浏览器。
反向ajax技术实质:浏览器每隔一段时间就向服务器发送一次请求(这种请求在后台以异步方式发送),当服务器响应到达之后,DWR负责将服务器响应通过HTML页面显示出来。
使用反向ajax,需修改两个地方启动反向ajax:
a、修改web.xml文件中DwrServlet的配置,指定启动反向ajax;如:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
b、修改HTML页面代码,指定该页面启用反向ajax技术。
(3)原理
客户端引擎发出http请求后,会被DWR的服务端引擎(其实就是个Servlet)截获到,这个servlet会按照dwr.xml里面的配置去获取相应的类实例。
3、PS
(1)dwr.util.getValues(user):作用是把页面元素的值赋值到user这个对象里面去;
dwr.util.setValues(data):作用是把data表示的对象里面的值设置到页面对应的元素中去;
(2)
(3)
今天的文章DWR总结分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9415.html