DWR框架

        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://jibbering.com/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" });

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章