DWR的使用—ajxa的改进版

来源:互联网 发布:mfcsocket编程 编辑:程序博客网 时间:2024/06/03 19:32

DWR是Direct Web Remoting 的缩写。

DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.

DWR 是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR servlet 以及 JavaScript 库。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了许多有用的功能。
从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。
DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。生成的 JavaScript 包含存根函数,代表 Java 类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数

 

 

DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。

    网上有不少DWR的例子,但大都只是某种方法的调用,本文只在使用层面上介绍DWR,并不涉更多的技术与设计,其目的是让初学者能够很快的学会各种java方法在javascript中是如何调用的。

    本文以DWR 1.1 为基础,对于DWR 2.0,因为还没有正式发布版,故不做介绍。

一、 dwr配置篇之web.xml
   1 、最小配置
<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>

2、当我们想看DWR自动生成的测试页(Using debug/test mode)时,可在servlet配置中加上
<init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
</init-param>
这个参数DWR默认是false。如果选择true,我们可以通过 http://localhost:port/app/dwr看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false。
3、多个dwr.xml文件的配置
可能有几种情况,我们一一列举。一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml配置文件。
3.1、一个servlet,多个dwr.xml配置文件
<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文件将不会被读取。
3.2 、多个 servlet ,每个 servlet 对应一个或多个 dwr.xml
<servlet>
   <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</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, 加不同的角色。
 
 
二、 dwr使用篇
1、调用没有返回值和参数的JAVA方法
1.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod1"/>
</create>
</allow>
</dwr>
<allow> 标签中包括可以暴露给 javascript 访问的东西。
<create> 标签中指定 javascript 中可以访问的 java 类,并定义 DWR 应当如何获得要进行远程的类的实例。 creator="new" 属性指定 java 类实例的生成方式, new 意味着 DWR 应当调用类的默认构造函数来获得实例,其他的还有 spring 方式,通过与 IOC 容器 Spring 进行集成来获得实例等等。 javascript=" testClass " 属性指定 javascript代码访问对象时使用的名称
<param> 标签指定要公开给 javascript java 类名。
<include> 标签指定要公开给 javascript 的方法。不指定的话就公开所有方法。
<exclude> 标签指定要防止被访问的方法。
1.2、javascript中调用
首先,引入 javascript 脚本
<script src='dwr/interface/ testClass.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中 TestClass.js dwr 根据配置文件自动生成的, engine.js util.js dwr 自带的脚本文件。
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod1(){
      testClass.testMethod1();
}
2、调用有简单返回值的java方法
2.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod2"/>
</create>
</allow>
</dwr>
2.2、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod2(){
      testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
     // 其中 date 接收方法的返回值
     // 可以在这里对返回值进行处理和显示等等
alert("the return value is " + data);
}
其中 callBackFortestMethod2 是接收返回值的回调函数
3、调用有简单参数的java方法
3.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod3"/>
</create>
</allow>
</dwr>
3.2、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod3(){
                 // 定义要传到 java 方法中的参数
      var data;
      // 构造参数
      data = “test String”;
      testClass.testMethod3(data);
}
4、调用返回JavaBean的java方法
4.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod4"/>
</create>
<convert converter="bean" match=" "com.dwr.TestBean">
                  <param name="include" value="username,password" />
</convert>
</allow>
</dwr>
<creator> 标签负责公开用于 Web 远程的类和类的方法, <convertor> 标签则负责这些方法的参数和返回类型。 convert 元素的作用是告诉 DWR 在服务器端 Java 对象表示和序列化的 JavaScript 之间如何转换数据类型。 DWR 自动地在 Java JavaScript 表示之间调整简单数据类型。这些类型包括 Java 原生类型和它们各自的封装类表示,还有 String Date 、数组和集合类型。 DWR 也能把 JavaBean 转换成 JavaScript 表示,但是出于安全性的原因,要求显式的配置, <convertor> 标签就是完成此功能的。 converter="bean" 属性指定转换的方式采用 JavaBean 命名规范, match=""com.dwr.TestBean" 属性指定要转换的 javabean 名称, <param> 标签指定要转换的 JavaBean 属性。
4.2 javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod4(){
      testClass.testMethod4(callBackFortestMethod4);
}
Function callBackFortestMethod4(data){
     // 其中 date 接收方法的返回值
// 对于 JavaBean 返回值,有两种方式处理
             // 不知道属性名称时,使用如下方法
           for(var property in data){
              alert("property:"+property);
              alert(property+":"+data[property]);
           }
// 知道属性名称时,使用如下方法
           alert(data.username);
           alert(data.password);
}
其中 callBackFortestMethod4 是接收返回值的回调函数
5、调用有JavaBean参数的java方法
5.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod5"/>
</create>
<convert converter="bean" match=" com.dwr.TestBean">
                  <param name="include" value="username,password" />
</convert>
</allow>
</dwr>
5.2 javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod5(){
                 // 定义要传到 java 方法中的参数
      var data;
      // 构造参数, date 实际上是一个 object
      data = { username:"user", password:"password"  }
      testClass.testMethod5(data);
}
6、调用返回List、Set或者Map的java方法
6.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod6"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
注意:如果 List Set 或者 Map 中的元素均为简单类型(包括其封装类)或 String Date 、数组和集合类型,则不需要<convert>标签。
6.2 javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod6(){
      testClass.testMethod6(callBackFortestMethod6);
}
Function callBackFortestMethod6(data){
     // 其中 date 接收方法的返回值
// 对于 JavaBean 返回值,有两种方式处理
             // 不知道属性名称时,使用如下方法
           for(var i=0;i<data.length;i++){
for(var property in data){
                  alert("property:"+property);
                  alert(property+":"+data[property]);
               }
}
// 知道属性名称时,使用如下方法
for(var i=0;i<data.length;i++){
               alert(data.username);
               alert(data.password);
}
}
7、调用有List、Set或者Map参数的java方法
7.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod7"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>
<signatures> 标签是用来声明 java 方法中 List Set 或者 Map 参数所包含的确切类,以便 java 代码作出判断。
7.2 javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod7(){
// 定义要传到 java 方法中的参数
      var data;
      // 构造参数, date 实际上是一个 object 数组,即数组的每个元素均为 object
data = [
                      {
                         username:"user1",
                         password:"password2"
                      },
                      {
                         username:"user2",
                         password:" password2"
                      }
                  ];
      testClass.testMethod7(data);
}
注意:
1、 对于第 6 种情况,如果 java 方法的返回值为 Map ,则在接收该返回值的 javascript 回调函数中如下处理:
function callBackFortestMethod(data){
           // 其中 date 接收方法的返回值
           for(var property in data){
                  var bean = data[property];
                  alert(bean.username);
                  alert(bean.password);
              }
}
2、 对于第 7 种情况,如果 java 的方法的参数为 Map (假设其 key String value TestBean ),则在调用该方法的 javascript 函数中用如下方法构造要传递的参数:
function callTestMethod (){
              // 定义要传到 java 方法中的参数
              var data;
              // 构造参数, date 实际上是一个 object ,其属性名为 Map key ,属性值为 Map value
              data = {
                         "key1":{
                             username:"user1",
                            password:"password2"
                         },
                         "key2":{
                            username:"user2",
                            password:" password2"
                         }
                     };
              testClass.testMethod(data);
}
并且在 dwr.xml 中增加如下的配置段
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>
3、 由以上可以发现,对于 java 方法的返回值为 List(Set) 的情况, DWR 将其转化为 Object 数组,传递个 javascript ;对于 java 方法的返回值为 Map 的情况, DWR 将其转化为一个 Object ,其中 Object 的属性为原 Map key 值,属性值为原 Map 相应的 value 值。
4、 如果 java 方法的参数为 List(Set) Map 的情况, javascript 中也要根据 3 种所说,构造相应的 javascript 数据来传递到 java 中。

    

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吸完甲醛的绿萝怎么办 如果公务员复检不合格有异议怎么办 国考公务员政审没有毕业证怎么办 打针硬块4年不消怎么办 外墙补起来难看不好卖怎么办 杠精现实中应该怎么办 发现记者报道假新闻怎么办 2018消防兵转制到期士官怎么办 小孩睡觉老想着军训怎么办 1岁宝宝太老实了怎么办 上课小孩很调皮不听话怎么办 初中学生上课爱说话调皮怎么办 8个月婴儿疝气怎么办 头部疤痕不长发怎么办呢 有纹身想去当兵怎么办 在部队干活的钱怎么办 新兵5公里超过标准时间怎么办 17个月婴儿裹手怎么办 7个月婴儿裹手怎么办 俩月孩子裹手怎么办 婴儿 3个月 裹手怎么办 一岁宝宝裹手怎么办 5个月宝宝裹手怎么办 不想让孩子裹手怎么办 四个月宝宝裹手怎么办 开车撞狗了跑了怎么办 母螃蟹抱卵了怎么办 我能怎么办我也想睡觉 一个人的微信群找不到了怎么办 一个人的微信被删了找不到了怎么办 不想回对方微信怎么办 喜欢我的人太多怎么办 假如战争今夜打响我们该怎么办 约客户客户说忙怎么办 第一天来姨妈痛怎么办 痛经痛的很厉害怎么办 工作第一天被辞怎么办 第一天练车紧张怎么办 到新公司第一天怎么办 我妈上班别人欺负怎么办 欺负别人他妈来找了怎么办