DWR(direct web remote)直译就是“直接web远程调用”, 是一个基于服务器端的ajax框架。通过该框架,我们可以使用js来直接调用java方法。[c1]
以前面试时,有人要我向他解释什么是dwr,那时候对ajax还没有深入骨子那种理解,夸夸说了一通,其实dwr也是ajax技术的一种。不过现在在网上看到别人帖子里有说,“dwr非常好,比ajax好用都了”,此时再回头想想自己,会心一笑。
其他ajax框架: Prototype.js是一个基于浏览器其端的ajax框架,其实prototype.js只是一个封装好的js文件,只需要引入prototype.js即可使用。现在还一个用的比较的的ajax框架就是jQuery,jQuery也是一种基于浏览器的ajax框架。现在我们项目中用的比较多的是ExtJs,它是一种用于创建前端用户界面,与后台技术无关的ajax框架。
使用步骤
1. 引入jar包到WEB-INF/lib
2. web.xml中写入:

    <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>true</param-value>
       </init-param>
    </servlet>
    <servlet-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>


3. 建立java类(普通java类即可,不是servlet)TestClass
public class TestClass {
        public void testMethod1(){
           System.out.println("hello dwr!");
        }
       public String testMethod2(String name,int a){
           return "hello " + name + a;
        }
}


4. 在/WEB-INF[p2] /dwr.xml[p3] 中配置java类:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
   <allow>
      <create creator="new" javascript="testClass" >
          <param name="class" value= "com.dwr.TestClass" />
       </create>[p4]       
   </allow>
</dwr>



注解: 一个<create/>标签对应一个java类的配置,可以是多个。
5. 在dwr.jsp中使用,需要首先引入:(需要保证dwr这个目录位于web应用的根目录)
        <script src='dwr/interface/testClass.js'></script>
        <script src='dwr/engine.js'></script>
        <script src='dwr/util.js'></script>
[p5]       


注:engine.js和util.js不需要引入,因为在dwr.jar包中已经包含了,dwr默认在Webroot的根目录下,所以可以通过web.xml中配置的映射名找到,如果你的页面jsp在webroot的子目录中可以通过../dwr/xxx.js来找到。
6. 在javascript方法中调用后台java类方法:
           function test() {
              testClass.testMethod1();
           }
用dwr调用有参数的java方法,有返回值:
    function test(){
       testClass.javaMethod2("bbb","5",parseInfo[p6] ); //若java方法需要传参,处理响应数据的函数名放到参数列表后面。
                                                                  //dwr会进行自动类型转换,这些类型都是基本数据类型
}
    function parseInfo (data){
       document.getElementById("div1").innerHTML=data;
    }


DWR调用的简单顺序:
1. js调用相应的方法发送请求。/dwr/td.test1
2. DWRServlet处理相关请求。根据dwr.xml配置内容,调用相应的java类的方法。
3. DWRServlet将处理完的数据返回给客户端。


其他知识点:
1.dwr中的得到request对象:
HttpServletRequest req = WebContextFactory.[c7] get().getHttpServletRequest();
2. javascript顺序执行的问题:
function test8(data){
// DWrengine.setAsync(false); //将ajax改成同步方式,可以实现顺序执行。
testClass.testMethod7({
function(a){
alert(a);
}
});
alert("ttt");
}
4. javabean转化成js中的对象:
    public Address test6(){
       return new Address("中国","北京","海淀区");
}
        <convert match="com.pk.beans.Address" converter="bean">
        <param name="include"  value="country,province" ></param>[c8] 
    </convert>
           td.test6(function(data){
              alert(data.country);
        });


5. 集合中的对象为javabean时,如何使用:
    public List test7(){
       List list = new ArrayList();
       for(int i=0;i<5;i++){
           list.add(new Address("中国","北京"+i,"海淀区"));
       }
       return list;
    }
    public List test8(){
       List list = new ArrayList();
       for(int i=0;i<5;i++){
           list.add(new User("a",3,new Address("中国","海淀区")));
       }
       return list;
    }
        <convert match="com.pk.beans.Address" converter="bean">
        <param name="include"  value="country,province" ></param>
        </convert>
        <convert match="com.pk.beans.User" converter="bean">
    </convert>
    <signatures>
       <![CDATA[
           import java.util.*;
           import com.pk. beans.*;
           import com.pk. ajax.TestDwr;
           TestDwr.test7(List<Address>);
           TestDwr.test8(List<User>);
       ]]>
</signatures>
[c9] 
           td.test7(function(data){
              alert(data.length);
              alert(data[3].province); //dwr中:java的List,Set会自动转化为js中的数组
           });
           td.test8(function(data){
              alert(data[0].addr.country);
              alert(data[0].name);
        });
 


[c1]本质上仍然是请求响应模式
[p2]位置
[p3]名字是固定的,必须是:dwr.xml
[p4]配置一个类,增加一个create元素就可以了。
[p5]这两个js必须加上。
[p6]通常所调用的java方法返回的是字符串,所以要用parseInfo来获取响应数据
[c7]Dwr1.0引入:uk开头的包。
Dwr2.0引入:org开头的包。
[c8]不写的话,所有属性都转化。
写的话,只转化value指定的属性。
[c9]该元素置于<allow>外,<dwr>中。




转载地址:http://www.webspherechina.net/home/space.PHP?uid=28038&do=blog&id=51948

DWR学习一使用步骤的更多相关文章

  1. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. 如何使用Firebase在iOS上验证用户的电子邮件地址?

    我坚持使用firebase进行电子邮件验证.我四处寻找指导但没有帮助.在用户验证他的电子邮件后,我的代码仍然打印出用户尚未验证.我还在尝试习惯firebase的语法.这是我的代码:这是我注册部分的代码:解决方法您在签名之前检查了用户电子邮件是否已经过验证.这对我有用.

  10. xcode – UIAlertController Segue到不同的页面(Swift)

    我能够为我的按钮编写一个UIAlertController,它工作正常,但是当我按下YES或OK按钮时,我不知道如何切换到不同的页面.目前,YES或OK按钮无处可去.解决方法您可以在故事板中创建一个segue,控制从场景顶部的黄色视图控制器拖动到新的视图控制器.然后在检查器中为该segue指定一个标识符.您可以从代码中的处理程序中调用它.

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部