`

DWR框架学习之<二>返回对象处理

    博客分类:
  • AJAX
阅读更多

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中。 
 
======================================================================================

Scripting Introduction

DWR根据dwr.xml生成和Java代码类似的Javascript代码。

相对而言Java同步调用,创建与Java代码匹配的Ajax远程调用接口的最大挑战来至与实现Ajax的异步调用特性。

DWR通过引入回调函数来解决这个问题,当结果被返回时,DWR会调用这个函数。

有两种推荐的方式来使用DWR实现远程方法调用。可以通过把回调函数放在参数列表里,也可以把回调函数放到元数据对象里。

当然也可以把回调函数做为第一个参数,但是不建议使用这种方法。因为这种方法在处理自动处理http对象时(查看"Alternative Method")上会有问题。这个方法主要是为向下兼容而存在的。

简单的回调函数

假设你有一个这样的Java方法:

public class Remote {    public String getData(int index) { ... }}

我们可以在Javascript中这样使用:

<script type="text/javascript"    src="[WEBAPP]/dwr/interface/Remote.js"> </script><script type="text/javascript"    src="[WEBAPP]/dwr/engine.js"> </script>...function handleGetData(str) {  alert(str);}Remote.getData(42, handleGetData);

42是Java方法getData()的一个参数。

此外你也可以使用这种减缩格式:

Remote.getData(42, function(str) { alert(str); });

调用元数据对象(Meta-Data)

另外一种语法时使用"调用元数据对象"来指定回调函数和其他的选项。上面的例子可以写成这样:

Remote.getData(42, {  callback:function(str) { alert(str); }});

这种方法有很多优点:易于阅读,更重要的指定额外的调用选项。

超时和错误处理

在回调函数的元数据中你可以指定超时和错误的处理方式。例如:

Remote.getData(42, {  callback:function(str) { alert(str); },  timeout:5000,  errorHandler:function(message) { alert("Oops: " + message); }});

查找回调函数

有些情况下我们很难区分各种回调选项(记住,Javascript是不支持函数重载的)。例如:

Remote.method({ timeout:3 }, { errorHandler:somefunc });

这两个参数之一是bean的参数,另一个是元数据对象,但是我们不能清楚的告诉DWR哪个是哪个。为了可以跨浏览器,我们假定null == undefined。 所以当前的情况,规则是:

  • 如果第一个或最后一个是一个函数,那么它就是回调函数,没有元数据对象,并且其他参数都是Java的方法参数。
  • 另外,如果最后一个参数是一个对象,这个对象中有一个callback成员,并且它是个函数,那么这个对象就是元数据对象,其他的都是Java方法参数。
  • 另外,如果第一个参数是 null ,我们就假设没有回调函数,并且其他的都是Java方法参数。尽管如此,我们会检查最后一个参数是不是null,如果是就发出警告。
  • 最后如果最后一个参数是null,那么就没有callback函数。
  • 另外,发出错误信号是个糟糕的请求格式。

创造一个与Java对象匹配的Javascript对象

假设你有这样的Java方法:

public class Remote {  public void setPerson(Person p) {    this.person = p;  }}

Person对象的结构是这样的:

public Person {  private String name;  private int age;  private Date[] appointments;  // getters and setters ...}

那么你可以在Javascript中这样写:

var p = {  name:"Fred Bloggs",  age:42,  appointments:[ new Date(), new Date("1 Jan 2008") ]};Remote.setPerson(p);

在Javascript没有出现的字段,在Java中就不会被设置。

因为setter都是返回'void',我们就不需要使用callback函数了。如果你想要一个返回void的服务端方法的完整版,你也可以加上callback函数。很明显DWR不会向它传递任何参数。

评论

相关推荐

    DWR 框架学习之<一>入门

    **DWR框架学习入门** Direct Web Remoting (DWR) 是一个开源的Java库,它允许JavaScript在浏览器中与服务器端的Java对象进行交互,从而实现动态Web应用程序的开发。DWR通过AJAX(Asynchronous JavaScript and XML)...

    DWR框架配置学习教程

    ### DWR框架配置学习教程 #### 一、DWR框架简介与配置 DWR(Direct Web Remoting)是一个用于简化Ajax应用开发的框架,它可以让客户端JavaScript代码直接调用服务器端Java方法,从而大大简化了前端与后端的交互...

    DWR框架学习demo

    **DWR(Direct Web Remoting)框架学习指南** DWR,全称为Direct Web Remoting,是一种在Web应用程序中实现客户端与服务器端之间直接通信的技术。它允许JavaScript在浏览器端直接调用Java方法,实现了真正的Ajax...

    DWR框架学习资料...

    DWR(Direct Web Remoting)框架是一个开源的Java库,它允许Web应用程序在客户端和...通过学习这两个PPT,你可以全面了解DWR框架,掌握其核心概念和使用技巧,从而在实际项目中更好地运用DWR实现高效、动态的Web应用。

    DWR框架学习总结

    ### DWR框架学习总结 #### 一、DWR框架简介 DWR(Direct Web Remoting)是一个开源项目,遵循Apache许可证发布。它提供了一种简便的方法来实现远程调用服务器端Java方法的能力,并且能够在客户端JavaScript中直接...

    DWR教程

    &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ``` 这样,所有以`/dwr/`开头的URL请求都会被DWRServlet处理。 #### 1.2 调试模式 如果想要启用DWR的调试模式,可以在Servlet配置中添加`debug`参数: ```...

    JSF中配置dwr

    这些库提供了DWR所需的数据结构、JSON处理和对象转换等功能。 ```xml &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;uk.org.webcompere&lt;/groupId&gt; &lt;artifactId&gt;dwr&lt;/artifactId&gt; &lt;version&gt;3.x.x&lt;/version&gt; &lt;/...

    Dwr配置详解.doc

    &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ``` 二、配置dwr.xml文件 dwr.xml文件是DWR的核心配置文件,用于定义 remotable对象、转换器和签名信息。 ```xml &lt;dwr&gt; &lt;allow&gt; &lt;!-- 使用new关键字...

    DWR框架的应用

    在"很轻松理解配置"这一描述中,我们关注的是如何简单高效地设置和使用DWR框架。DWR的配置主要包括以下几个关键步骤: 1. **添加依赖**:首先,你需要在你的项目中引入DWR的JAR文件,通常通过Maven或Gradle等构建...

    DWR实现Ajax的配置过程

    &lt;artifactId&gt;dwr&lt;/artifactId&gt; &lt;version&gt;3.0.4&lt;/version&gt; &lt;/dependency&gt; ``` 如果手动添加jar包,则需要下载DWR的相关jar包并将其放置在项目的`WEB-INF/lib`目录下。 ##### 2. 创建并配置`dwr.xml` 接着,在`...

    DWR+入門與應用

    2. **请求处理**:DWR框架捕获这些调用,并将其转换为HTTP请求发送到服务器。 3. **服务器端处理**:服务器端接收到请求后,根据DWR配置文件解析请求,执行相应的Java方法。 4. **响应处理**:Java方法执行完毕后,...

    一个简单的DWR入门例子

    在这个简单的DWR入门例子中,我们将探讨如何设置和使用DWR框架,以便在客户端和服务器之间进行高效的数据交换。 首先,我们需要了解DWR的基本概念。DWR的核心是它提供的远程调用机制,通过AJAX(Asynchronous ...

    dwr课件、讲课和备课使用最好

    总之,DWR作为一款强大的Ajax框架,提供了便捷的前后端交互方式,对于初学者来说是一个很好的学习资源,可以帮助快速构建具备Ajax功能的Web应用。通过深入理解和实践DWR,开发者可以更有效地提升Web应用的用户体验和...

    dwr框架资料(主要是关于dwr配置文件的说明)

    在DWR框架中,配置文件起着至关重要的作用,它是连接客户端和服务器端的关键桥梁。通常,DWR的配置文件是`dwr.xml`,这个文件位于Web应用的WEB-INF目录下。通过这个文件,我们可以定义哪些Java类和方法可以被远程...

    Dwr最简单例子(2.0)

    &lt;script type="text/javascript" src="/dwr/interface/myService.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="/dwr/engine.js"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt; dwr.engine....

    Spring与DWR结合

    &lt;script type="text/javascript" src="/dwr/interface/UserService.js"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt; UserService.getUserInfo(function(userInfo) { // 处理返回的数据 }); &lt;/script&gt; ``` ...

    DWR框架资料

    学习DWR框架,你需要理解HTTP基础、AJAX原理,以及基本的Java和JavaScript编程。同时,熟悉MVC架构和相关Web开发框架(如Spring、Struts等)也会对使用DWR有所帮助。通过DWR提供的文档和示例,你可以快速上手并创建...

    DWR学者能够很快的学会

    - `&lt;convert converter="bean" match="dwr.sample.Apartment"/&gt;`:指定对`dwr.sample.Apartment`类的对象使用Bean转换器。 - `&lt;create&gt;`标签用于创建可由JavaScript访问的Java对象。 - `creator="new"`:表示使用...

    Ajax实例-dwr实现

    Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新...通过这个实例,我们可以学习到Ajax的核心概念,以及DWR框架如何将Java方法暴露给前端,从而实现实时的、无刷新的用户界面交互。

    DWR学习与DWR.xml配置说明

    **DWR.xml配置文件**是DWR框架的核心配置,它定义了哪些Java类和方法可以被客户端JavaScript访问。以下是一些关键配置元素的解释: 1. **&lt;dwr&gt;`根元素**:这是配置文件的起点,通常包含其他所有配置元素。 2. **`...

Global site tag (gtag.js) - Google Analytics