下面是從一個(gè)實(shí)例的構(gòu)建過程進(jìn)行分析。
1、DWR 介紹
?????DWR是一個(gè)可以允許你去創(chuàng)建AJAX WEB 站點(diǎn)的JAVA 開源庫。它可以讓你在瀏覽器中的Javascript代碼調(diào)用Web服務(wù)器上的Java 代碼,就像在Java代碼就在瀏覽器中一樣。?
???? DWR包含 2個(gè)主要部分:?
(1) 一個(gè)運(yùn)行在服務(wù)器端的Java Servlet,它處理請(qǐng)求并且向?yàn)g覽器發(fā)回響應(yīng)。
(2) 運(yùn)行在瀏覽器端的JavaScript,它發(fā)送請(qǐng)求而且還能動(dòng)態(tài)更新網(wǎng)頁。?
???? DWR工作原理是通過動(dòng)態(tài)把Java類生成為Javascript。它的代碼就像Ajax魔法一樣,你感覺調(diào)用就像發(fā)生在瀏覽器端,但是實(shí)際上代碼調(diào)用發(fā)生在服務(wù)器端,DWR負(fù)責(zé)數(shù)據(jù)的傳遞和轉(zhuǎn)換。這種從Java 到JavaScript的遠(yuǎn)程調(diào)用功能的方式使DWR用起來有種非常像RMI或者SOAP的常規(guī)RPC機(jī)制,而且DWR的優(yōu)點(diǎn)在于不需要任何的網(wǎng)頁瀏覽器插件就能運(yùn)行在網(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ā)期間,把這個(gè)設(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)于這個(gè)配置文件,沒什么好說的,等深入了解后再做解析。。
?
dwr.xml
?
<dwr> <!-- 僅當(dāng)需要擴(kuò)展DWR時(shí)才需要,這里不做例子,等深入分析后才做介紹 --> <!-- <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ù)簡(jiǎn)單分析:
(詳細(xì)分析,請(qǐng)參考dwr 文檔)
?<init>標(biāo)簽
這個(gè)初始化部分申明被用來創(chuàng)建遠(yuǎn)程beans 而且這個(gè)類能被用來以某種過程轉(zhuǎn)換。大多數(shù)例子你將不需要
用它,如果你想去定義一個(gè)新的Creator 或者Converter,就要在此被申明。??
<allow>標(biāo)簽
allow部分定義了DWR能夠創(chuàng)建和轉(zhuǎn)換的類。?
<create> 標(biāo)簽
每一個(gè)在類中被調(diào)用的方法需要一個(gè)<create …>有若干類型的creator,使用“new”關(guān)鍵字或者Spring 框架等。???
<convert>標(biāo)簽
?? 我們需要確認(rèn)所有的參數(shù)能被轉(zhuǎn)換。 許多JDK提供的類型使你能夠使用,但是你如果要轉(zhuǎn)換你自己的代碼,就必須告訴DWR。一般是指JavaBean 的參數(shù)需要一個(gè)<convert…>標(biāo)簽作為入口。?
<signatures>標(biāo)簽
?? DWR使用反射機(jī)制在轉(zhuǎn)換過程中找到它應(yīng)該使用的類型。有時(shí)候類型的信息無法獲得,在這種情況下你要在此處用方法簽名給予暗示。
?? 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> <!--這個(gè)屬性必須設(shè)定 --> <script type="text/javascript" src="/dwr-dome/dwr/engine.js"></script> <!--當(dāng)用到dwr 集成的javascript 工具類時(shí)要設(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對(duì) DWR非常重要,因?yàn)樗怯脕磙D(zhuǎn)換來至動(dòng)態(tài)生成的接口的javascript 函數(shù)調(diào)用的,所以只要用到DWR的地方就需要它。
util.js文件 ?
??? util.js包含了一些工具函數(shù)來幫助你用javascript 數(shù)據(jù)(例如從服務(wù)器返回的數(shù)據(jù))來更新你的 web頁面。你可以在DWR以外使用它,因?yàn)樗灰蕾囉贒WR的其他部分。你可以下載整個(gè)DWR或者單獨(dú)下載.?
??? 這個(gè)工具類能使dwr 更加方便的使用,具體的函數(shù)分析,請(qǐng)參考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; }
?
? 這個(gè)文件主要應(yīng)用到了dwr 的util.js 的工具類。還有關(guān)于回調(diào)函數(shù)這兩方面比較重要。
關(guān)于回調(diào)函數(shù),主要是在java 類函數(shù)的基礎(chǔ)上,加多個(gè)參數(shù),
如在java 中的函數(shù):UserDao.say(name); 在javascript的函數(shù)(包括回調(diào)):UserDao.say(name,callback);
有篇文章分析的很多,請(qǐng)參考: http://blog.sina.com.cn/s/blog_496aa28601000738.html
?
實(shí)際的運(yùn)行結(jié)果圖:
?
?
其他的文件沒什么可分析的,請(qǐng)參考下面給出的源碼。
?
關(guān)于在做這個(gè)實(shí)例的時(shí)候遇到的幾個(gè)問題:
1、dwr2.05 中除了加入dwr.jar 還必須加入commons-logging.jar,不然會(huì)報(bào)錯(cuò)。。
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號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
