DWR总结

DWR总结使用DWR框架,可以将java组件的方法直接暴露给js客户端,即客户端js代码直接调用远程的java方法,类似于java的远程方法调用。DWR可以和spring整合,直接调用spring容器中的bean。也可以访问servletAPI。 DWR框架包括两部分:a、客户端的js。使用它们可以直接调用远程服务器的java方法。此外,DWR还提供了一些工具函数简化DOM操作。b、服

使用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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注