下面是從一個實例的構建過程進行分析。
1、DWR 介紹
?????DWR是一個可以允許你去創建AJAX WEB 站點的JAVA 開源庫。它可以讓你在瀏覽器中的Javascript代碼調用Web服務器上的Java 代碼,就像在Java代碼就在瀏覽器中一樣。?
???? DWR包含 2個主要部分:?
(1) 一個運行在服務器端的Java Servlet,它處理請求并且向瀏覽器發回響應。
(2) 運行在瀏覽器端的JavaScript,它發送請求而且還能動態更新網頁。?
???? DWR工作原理是通過動態把Java類生成為Javascript。它的代碼就像Ajax魔法一樣,你感覺調用就像發生在瀏覽器端,但是實際上代碼調用發生在服務器端,DWR負責數據的傳遞和轉換。這種從Java 到JavaScript的遠程調用功能的方式使DWR用起來有種非常像RMI或者SOAP的常規RPC機制,而且DWR的優點在于不需要任何的網頁瀏覽器插件就能運行在網頁上。
?
2、DWR 配置文件說明
?
web.xml
<servlet> <servlet-name>dwr</servlet-name> <!-- 如果是dwr1.x 的話,下面的class為:uk.ltd.getahead.dwr.DWRServlet --> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <!-- 在開發期間,把這個設成true,有助于調試,可通過 http://localhost/XXXX(應用空間名)/dwr 進行查看 --> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
?關于這個配置文件,沒什么好說的,等深入了解后再做解析。。
?
dwr.xml
?
<dwr> <!-- 僅當需要擴展DWR時才需要,這里不做例子,等深入分析后才做介紹 --> <!-- <init> <creator id="..." class="..." /> <converter id="..." class="..." /> </init> --> <allow> <create javascript="UserDao" creator="new" scope="session"> <param name="class" value="user.UserDao"></param> <!-- 也可以設置不可訪問的方法 <exclude method="xxx"/> --> <!-- 設置可訪問的方法 --> <include method="say" /> <include method="getUser" /> <include method="setDates" /> </create> <!-- 聲明的javascript 調用Bean--> <convert match="user.User" converter="bean"> <param name="include" value="id,name"></param> </convert> </allow> <!-- 使DWR能確定集合中存放的數據類型 --> <signatures> <![CDATA[ import java.util.Date; public void setDates(List<Date> dates); ]]> </signatures> </dwr>
?
配置的參數簡單分析:
(詳細分析,請參考dwr 文檔)
?<init>標簽
這個初始化部分申明被用來創建遠程beans 而且這個類能被用來以某種過程轉換。大多數例子你將不需要
用它,如果你想去定義一個新的Creator 或者Converter,就要在此被申明。??
<allow>標簽
allow部分定義了DWR能夠創建和轉換的類。?
<create> 標簽
每一個在類中被調用的方法需要一個<create …>有若干類型的creator,使用“new”關鍵字或者Spring 框架等。???
<convert>標簽
?? 我們需要確認所有的參數能被轉換。 許多JDK提供的類型使你能夠使用,但是你如果要轉換你自己的代碼,就必須告訴DWR。一般是指JavaBean 的參數需要一個<convert…>標簽作為入口。?
<signatures>標簽
?? DWR使用反射機制在轉換過程中找到它應該使用的類型。有時候類型的信息無法獲得,在這種情況下你要在此處用方法簽名給予暗示。
?? signatures段使DWR能確定集合中存放的數據類型。例如下面的定義中我們無法知道list中存放的是什么類型。
?
3、Html?分析
?
<html> <head> <title>dwr-demo</title> <!-- javascript 能訪問的類都要在此設定,命名以javascript 屬性為準,結合dwr.xml <create javascript="UserDao" creator="new" scope="session"> --> <script type="text/javascript" src="/dwr-dome/dwr/interface/UserDao.js"></script> <!--這個屬性必須設定 --> <script type="text/javascript" src="/dwr-dome/dwr/engine.js"></script> <!--當用到dwr 集成的javascript 工具類時要設定 --> <script type="text/javascript" src="/dwr-dome/dwr/util.js"></script> <!-- 外部的javascript 文件 --> <script type="text/javascript" src="/dwr-dome/user.js"></script> </head> <body> <form id="userform"> <input type="text" id="name" name="name"> <input type="button" onclick="say()" value="say"> <input type="button" onclick="getuser()" value="getuser"> <input type="button" onclick="setdates()" value="setdates"> </form> <font color="red"><div id="say"></div> </font> <font color="red"><div id="getuser"></div> </font> <font color="red"><div id="setdates"></div> </font> </body> </html>
?
?
分析:
engine.js文件
??? engine.js對 DWR非常重要,因為它是用來轉換來至動態生成的接口的javascript 函數調用的,所以只要用到DWR的地方就需要它。
util.js文件 ?
??? util.js包含了一些工具函數來幫助你用javascript 數據(例如從服務器返回的數據)來更新你的 web頁面。你可以在DWR以外使用它,因為它不依賴于DWR的其他部分。你可以下載整個DWR或者單獨下載.?
??? 這個工具類能使dwr 更加方便的使用,具體的函數分析,請參考dwr文檔。
?
4、外面的js 文件(user.js)
function say(){ var name=$("name").value; UserDao.say(name,callback); } function callback(data){ $("say").innerHTML=data; } function getuser(){ UserDao.getUser(calluser); } function calluser(user){ var info="you id is "+user.id+" .you name is "+user.name; $("getuser").innerHTML=info; } function setdates(){ var list=[new Date(),new Date()]; UserDao.setDates(list,calldate); } function calldate(datestring){ $("setdates").innerHTML=datestring; }
?
? 這個文件主要應用到了dwr 的util.js 的工具類。還有關于回調函數這兩方面比較重要。
關于回調函數,主要是在java 類函數的基礎上,加多個參數,
如在java 中的函數:UserDao.say(name); 在javascript的函數(包括回調):UserDao.say(name,callback);
有篇文章分析的很多,請參考: http://blog.sina.com.cn/s/blog_496aa28601000738.html
?
實際的運行結果圖:
?
?
其他的文件沒什么可分析的,請參考下面給出的源碼。
?
關于在做這個實例的時候遇到的幾個問題:
1、dwr2.05 中除了加入dwr.jar 還必須加入commons-logging.jar,不然會報錯。。
2、在dwr.xml 配置中 <create javascript="UserDao" creator="new" scope="session">
scope 應設為session,在getuser中才能取得User 的屬性值。
?
?
下面給出一些參考的網站:
DWR 中文文檔 : http://wiki.javascud.org/display/dwrcn/Home
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
