DWR使用详解

来源:互联网 发布:哪个剪辑软件最快 编辑:程序博客网 时间:2024/04/30 01:19
一、DWR是什么

  DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
介绍
  它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容.
  DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码.这样WEB开发人员就可以在JavaScript里使用Java代码就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用.
  这个从JAVA到JavaScript的远程功能方法给DWR的用户带来非常像传统的RPC机制,就像RMI或者SOAP一样,而且拥有运行在WEB上但是不需要浏览器插件的好处.
  DWR不认为浏览器/WEB服务器协议是重要的,而更乐于保证编程界面的简单自然.对此最大的挑战就是把AJAX的异步特性和正常JAVA方法调用的同步特性相结合.在异步模式下,结果数据在开始调用之后的一段时间之后才可以被异步访问获取到.DWR允许WEB开发人员传递一个回调函数,来异步处理Java函数调用过程.
  另处 .dwr还是文件的一种格式: 比如以Dreamweaver软件里有查找和替换,经常用的查找和替换内容可以保存,保存的文件就是以 .dwr结尾的文件。这种文件用记事本打开后可以看到它的内容。

二、DWR与Ajax的区别

1. Ajax可以说是一种创建交互式网页应用的网页开发技术,实现局部刷新等功能,采用客户端脚本与Web服务器交换数据

 

2.Dwr是一种框架,并且它是基于Ajax的基础之上,所以Ajax的功能Dwr也具有了,能够在javaScript直接调用java方法,实现局部刷新,也可以说Dwr是对Ajax的java封装。

三、DWR的部署

3.1 dwr.xml的配置   

--------------------------------------------------------------------

<dwr>   

  <allow>   

    <create creator="new" javascript="testClass" >   

        <include method="testMethod1"/>

        <include method="testMethod2"/>

        <include method="testMethod3"/>

    </create>   

  </allow>   

</dwr>

--------------------------------------------------------------------  

<allow>标签中包括可以暴露给javascript访问的东西。   

<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。标签指定要公开给javascript的java类名。   

<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。   

<exclude>标签指定要防止被访问的方法。

3.2 javascript中调用
首先,引入javascript脚本

<script src='/[WEB-APP]/dwr/interface/ testClass.js'></script>
<script src='/[WEB-APP]/dwr/engine.js'></script>
<script src='/[WEB-APP]/dwr/util.js'></script>
其中TestClass.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
其次,编写调用java方法的javascript函数
Function callTestMethod1(){
    testClass.testMethod1();
}

3.3有返回值的调用

首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod2(){
       testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
      //其中data接收方法的返回值
      //可以在这里对返回值进行处理和显示等等
      alert("the return value is " + data);
}
其中callBackFortestMethod2是接收返回值的回调函数

3.4调用有简单参数的java方法

首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod3(){
    //定义要传到java方法中的参数
    var data;
    //构造参数
    data = “test String”;
    testClass.testMethod3(data);
}

四、DWR的使用

五、Ajax之Dwr同步与异步

设置dwr的javas

cript:dwr.engine.setAsync(false);将dwr的通信方式改成同步的.(既dwr会等待服务器.将数据接受完毕后.再继续进行.)
javascript:dwr.engine.setAsync(false);的作用域.是当前的整个页面.既是javascript:dwr.engine.setAsync(false)在同一张页面上有用.既设置了以后这张页面上的所有dwr方法都是同步的.但是其他的页面如果用到了dwr调用远程方法还是异步的.

具体测试:
在dwr中,由于请求都被封装起来了,就没有办法通过上面方法设置同步执行了。

解压dwr.jar,可以发现里面有engine.js,在它的里面有一个方法

DWREngine.setAsync = function(async){
   DWREngine._async = async;
};

这个async默认值为true.

如果需要同步执行的话,就可以在执行的方法加上上面这个设置例如:

DWREngine.setAsync(false);
var _data = false;
Messages.getConfrimMessage(function(data){
    _data= data ;
});

alert(_data);

//再设置成异步执行
DWREngine.setAsync(true);

由此可以看到,如果不设置同步就会出现alert出来的数据总会是false,所以有同步一下就没问题了。

项目中的应用

// 通过监测类型id和区域名称 获取对应的取样点
   functiongetQydAndJcxm(){
    var jclxid =document.getElementByIdx_x("value(jclxmc)").value;
    var jcqymc =document.getElementByIdx_x("value(jcqymc)").value;
    // Dwr同步通信方式
   DWREngine.setAsync(false);
   hjhbDwrService.getQyd(jclxid,jcqymc,{
     callback:function(data){
     
     for(var i=0;i<data.length;i++){        
    var xh=jcxx.rows.length;         
    var qyid = data[i].id;// 取样点id
    var qydname = data[i].tymc;//取样点  
    hjhbDwrService.getAllJcxm(data[i].id,{
    callback:function(data2){
    var td = 0;
    var oTR = jcxx.insertRow(jcxx.rows.length);
    oTD=oTR.insertCell(td);
    oTD.innerHTML = qydname;
    for(var j=0;j<data2.length;j++){           
    oTD=oTR.insertCell(++td);
    oTD.width = "30px";
    oTD.innerHTML= data2[j].tymc+":<inputid='jcz"+xh+"' type='text'name='ass1Value(jcz"+xh+")'> <inputid='qyd"+xh+"' type='hidden' name='ass1Value(qyd"+xh+")'value='"+qydname+"'> <inputid='jcxm"+xh+"' type='hidden' name='ass1Value(jcxm"+xh+")'value='"+data2[j].tymc+"'><inputid='jcqymc"+xh+"' type='hidden' name='ass1Value(jcqymc"+xh+")'value='"+jcqymc+"'><inputid='jclxmc"+xh+"' type='hidden' name='ass1Value(jclxmc"+xh+")'value='"+jclxid+"'><inputid='xmzb"+xh+"' type='hidden' name='ass1Value(xmzb"+xh+")'value='"+data2[j].xmzb+"'><inputid='xmjldw"+xh+"' type='hidden' name='ass1Value(xmjldw"+xh+")'value='"+data2[j].xmjldw+"'><inputid='ysf"+xh+"' type='hidden' name='ass1Value(ysf"+xh+")'value='"+data2[j].ysf+"'>";
        
    }         
    }
    });
    }
    }
    });
    // Dwr异步通信方式
    DWREngine.setAsync(true);
    }
0 0
原创粉丝点击