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

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