DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把
Ajax 的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest
对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax
请求调整成对 Java 域对象的调用。 DWR 是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个
DWR servlet 以及 JavaScript 库。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC
工具包,但是它是最成熟的,而且提供了许多有用的功能。 DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个
servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。生成的
JavaScript 包含存根函数,代表 Java 类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给
DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成
JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数。
在web.xml中添加: <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>
dwr.xml
<dwr> <!-- init is only needed if you are extending DWR --> <init> <creator id="..." class="..."/> <converter id="..." class="..."/> </init> <!-- without allow, DWR isn‘t allowed to do anything --> <allow> <create creator="..." javascript="..."/> <convert converter="..." match="..."/> </allow> <!-- you may need to tell DWR about method signatures --> <signatures> ...//signatures 为了识别Collections 里数据类型 </signatures> </dwr>
在页面中引用动态生成的javascript
<script type="text/javascript" src="[WEBAPP]/dwr/interface/Remote.js"> </script> <script type="text/javascript" src="[WEBAPP]/dwr/engine.js"> </script> 如何引用方法: function callBack(str) { alert(str); } Remote.method(param, callBack); //从远程方法中返回的数据在页面反映出来
如何利用回调函数处理远程方法返回的而外数据?( Passing extra data to callbacks )
The solution is to use a Javascript closure.
参考站点:http:///faq/faq_notes/closures.html 闭
包简单的解释是,ECMAScript允许inner
functions(嵌套函数):函数可以定义在另外一个函数里面(关于嵌套函数可以看看<javascript权威指南>)。这些内部的函
数可以访问outer
function(父函数)的local变量,参数,其它内部函数。当内部函数被构造,并可以在函数外被获得(函数当成返回值),这个内部函数被在
outer
function返回后被执行(在outer函数外执行),那一个闭包形成了。(简单的理解,function被当成数据类型传递或动态执行)。
inner function还有权利访问 那些outer function(父函数)的local变量,参数,其它内部函数。那些outer
function(父函数)的local变量,参数,其它内部函数在outer function返回前就有值,并返回的inner
function需要改变这些值。
Javascript closure例子 function createAClosure() { var local = 0; return function(){return ++local;}; } var c1 = createAClosure(); //第一个闭包,嵌套函数返回的值保存在c1 var c2 = createAClosure(); //第二个闭包 document.write(c1() + "<br/>"); //1 document.write(c1() + "<br/>"); //2 document.write(c1() + "<br/>"); //3 document.write(c2() + "<br/>"); //1 document.write(c2() + "<br/>"); //2
Remoting Options (设置同步或异步) To set the synchronisity on a global level: DWREngine.setAsync(true); Or to set it on a call level: Remote.method(params, { callback:function(data) { ... }, async:true }); Or to set it on a batch level: 涉及修改或者添加,更新数据库时,要添加如下代码,保持数据的实时性. DWREngine.beginBatch();
Remote.method1(params, callback1); Remote.method2(params, callback2);
DWREngine.endBatch({ async:true });
DWREngine.setVerb(verb)(设置动作POST/GET) For example, to set the remoting verb on a global level: DWREngine.setVerb("GET"); Or to set it on a call level: Remote.method(params, { callback:function(data) { ... }, verb:"GET" }); Or to set it on a batch level: DWREngine.beginBatch();
Remote.method1(params, callback1); Remote.method2(params, callback2);
DWREngine.endBatch({ verb:"GET" });
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=813631
|