一、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); }
原文链接:https://www.f2er.com/ajax/164984.html