這段時(shí)間較閑,研究了一番dwr.發(fā)現(xiàn)dwr實(shí)現(xiàn)的AJAX有些地方確實(shí)很是先進(jìn).比如動(dòng)態(tài)生成javascript代碼;隱藏的http協(xié)議;javascript于java代碼交互的是javascript對(duì)象(或字符串)等.
以下是我臨時(shí)譯的一些東西.本來(lái)想全譯,發(fā)現(xiàn)dwr實(shí)在是簡(jiǎn)單,就隨便寫了.英文居差,現(xiàn)一把.
1、DWR: Easy AJAX for JAVA
作為一個(gè)java open source library,DWR可以幫助開(kāi)發(fā)人員完成應(yīng)用AJAX技術(shù)的web程序。它可以讓瀏覽器上的javascript方法調(diào)用運(yùn)行在web服務(wù)器上java方法。
DWR主要由兩部門組成。javascript與web服務(wù)器通信并更新web頁(yè);運(yùn)行在web服務(wù)器的Servlet處理請(qǐng)求并把響應(yīng)發(fā)回瀏覽器。
DWR 采用新穎的方法實(shí)現(xiàn)了AJAX(本來(lái)也沒(méi)有確切的定義),在java代碼基礎(chǔ)上動(dòng)態(tài)的生成javascript代碼。web開(kāi)發(fā)者可以直接調(diào)用這些 javascript代碼,然而真正的代碼是運(yùn)行在web服務(wù)器上的java code。出與安全考慮,開(kāi)發(fā)者必須配置哪些java class暴露給DWR.(dwr.xml)
這種從(java到j(luò)avascript)調(diào)用機(jī)制給用戶一種感覺(jué),好象常規(guī)的RPC機(jī)制,或RMI or SOAP.但是它運(yùn)行在web上,不需要任何瀏覽器插件。
DWR 不認(rèn)為瀏覽器和web服務(wù)器之間協(xié)議重要,把系統(tǒng)界面放在首位。最大挑戰(zhàn)是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結(jié)果只有在方法結(jié)束后才有效。DWR解決了這個(gè)問(wèn)題,把回調(diào)函數(shù)當(dāng)成參數(shù)傳給方法,處理完成后,自動(dòng)調(diào)用回調(diào)方法。
這個(gè)圖表顯示了,通過(guò)javascript事件,DWR能改變select的內(nèi)容,當(dāng)然這些內(nèi)容由 java代碼返回。 javascript函數(shù)Data.getOptions(populateList)由DWR動(dòng)態(tài)生成,這個(gè)函數(shù)會(huì)調(diào)用java class Data類的方法。DWR處理如何遠(yuǎn)程調(diào)用,包括轉(zhuǎn)換所有的參數(shù)和返回的結(jié)果(javascript\java)。java方法執(zhí)行完后,執(zhí)行回調(diào)方法 populateList。在整個(gè)過(guò)程中我們就想在用本地的方法一樣。
2、Getting Started
廢話少說(shuō),試試就ok了。
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="dwr">
<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>
</web-app>
dwr.xml 與web.xml同目錄
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
</allow>
</dwr>
index.html
<html>
<head>
<title>DWR - Test Home</title>
<script type='text/javascript' src='dwr/interface/JDate.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script>
function init(){
JDate.getYear(load);
}
function load(data){
alert(data+1900+'年')
}
</script>
</head>
<body onload="init()">
</body>
</html>
dwr.jar 下載放lib下
完了,什么,夠了,就這些。訪問(wèn)ok!
3、Examples
http://www.aboutmyhealth.org/ 這不是Google Suggest嗎!ok.
4、源碼淺析
dwr的設(shè)計(jì)很象webwork2的設(shè)計(jì),隱藏http協(xié)議,擴(kuò)展性,兼容性及強(qiáng)。
通過(guò)研究uk.ltd.getahead.dwr.DWRServlet這個(gè)servlet來(lái)研究下dwr到底是如何工作滴。
這樣所有的/dwr/*所有請(qǐng)求都由這個(gè)servlet來(lái)處理,它到底處理了些什么能。我們還以上面最簡(jiǎn)單的例子來(lái)看。
1、 web服務(wù)器啟動(dòng),DWRServlet init()方法調(diào)用,init主要做了以下工作。
設(shè)置日志級(jí)別、實(shí)例化DWR用到的單例類(這些類在jvm中只有一個(gè)實(shí)例對(duì)象)、讀去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2、請(qǐng)求處理
DWRServlet.doGet, doPost方法都調(diào)用processor.handle(req, resp)方法處理。Processor對(duì)象在init()方法中已經(jīng)初始化了。
哦。這些恍然大悟。dwr/*處理的請(qǐng)求也就這幾種。
(1)dwr/index.html,dwr/test/這種只能在debug模式下使用,調(diào)試用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js當(dāng)這個(gè)請(qǐng)求到達(dá),從dwr.jar包中讀取文件流,響應(yīng)回去。(重復(fù)請(qǐng)求有緩存)
(2)當(dāng)dwr/interface/這種請(qǐng)求到來(lái),(例如我們?cè)趇ndex.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>)DWR做一件偉大的事。把我們?cè)赪EB- INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date轉(zhuǎn)化為javascript函數(shù)。
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
細(xì)節(jié)也比較簡(jiǎn)單,通過(guò)java反射,把方法都寫成javascript特定的方法。(我覺(jué)得這些轉(zhuǎn)換可以放到緩存里,下次調(diào)用沒(méi)必要再生成一遍,不知道作者為什么沒(méi)這樣做)。
(3)dwr/exec
javascript調(diào)用方法時(shí)發(fā)送這種請(qǐng)求,可能是XMLHttpRequest或IFrame發(fā)送。
當(dāng)然,javascript調(diào)用的方法簽名與java代碼一致,包括參數(shù),還有javascript的回調(diào)方法也傳到了服務(wù)器端,在服務(wù)器端很容易實(shí)現(xiàn)。回調(diào)方法的java的執(zhí)行結(jié)果 返回類似 <script>callMethod(結(jié)果)<script>的javascript字符串,在瀏覽器執(zhí)行。哈,一切就這么簡(jiǎn)單,巧妙。
dwr的設(shè)計(jì)構(gòu)思很是巧妙。
第一、把java類轉(zhuǎn)化為javascript類由dwr自動(dòng)完成,只需簡(jiǎn)單的配置。
第二、應(yīng)用起來(lái)極其簡(jiǎn)單。開(kāi)發(fā)者不要該服務(wù)器代碼就可以集成。
第三、容易測(cè)試。和webwork一樣,隱藏的http協(xié)議。
第四、及強(qiáng)擴(kuò)展性。例如與spring集成,只需修改一點(diǎn)代碼。
第五、性能。就我與jason,等簡(jiǎn)單比較,dwr性能可能是最好的。
第六、自動(dòng)把java對(duì)象轉(zhuǎn)化為javascript對(duì)象,并且及易擴(kuò)展。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。
以下是我臨時(shí)譯的一些東西.本來(lái)想全譯,發(fā)現(xiàn)dwr實(shí)在是簡(jiǎn)單,就隨便寫了.英文居差,現(xiàn)一把.
1、DWR: Easy AJAX for JAVA
作為一個(gè)java open source library,DWR可以幫助開(kāi)發(fā)人員完成應(yīng)用AJAX技術(shù)的web程序。它可以讓瀏覽器上的javascript方法調(diào)用運(yùn)行在web服務(wù)器上java方法。
DWR主要由兩部門組成。javascript與web服務(wù)器通信并更新web頁(yè);運(yùn)行在web服務(wù)器的Servlet處理請(qǐng)求并把響應(yīng)發(fā)回瀏覽器。
DWR 采用新穎的方法實(shí)現(xiàn)了AJAX(本來(lái)也沒(méi)有確切的定義),在java代碼基礎(chǔ)上動(dòng)態(tài)的生成javascript代碼。web開(kāi)發(fā)者可以直接調(diào)用這些 javascript代碼,然而真正的代碼是運(yùn)行在web服務(wù)器上的java code。出與安全考慮,開(kāi)發(fā)者必須配置哪些java class暴露給DWR.(dwr.xml)
這種從(java到j(luò)avascript)調(diào)用機(jī)制給用戶一種感覺(jué),好象常規(guī)的RPC機(jī)制,或RMI or SOAP.但是它運(yùn)行在web上,不需要任何瀏覽器插件。
DWR 不認(rèn)為瀏覽器和web服務(wù)器之間協(xié)議重要,把系統(tǒng)界面放在首位。最大挑戰(zhàn)是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結(jié)果只有在方法結(jié)束后才有效。DWR解決了這個(gè)問(wèn)題,把回調(diào)函數(shù)當(dāng)成參數(shù)傳給方法,處理完成后,自動(dòng)調(diào)用回調(diào)方法。
這個(gè)圖表顯示了,通過(guò)javascript事件,DWR能改變select的內(nèi)容,當(dāng)然這些內(nèi)容由 java代碼返回。 javascript函數(shù)Data.getOptions(populateList)由DWR動(dòng)態(tài)生成,這個(gè)函數(shù)會(huì)調(diào)用java class Data類的方法。DWR處理如何遠(yuǎn)程調(diào)用,包括轉(zhuǎn)換所有的參數(shù)和返回的結(jié)果(javascript\java)。java方法執(zhí)行完后,執(zhí)行回調(diào)方法 populateList。在整個(gè)過(guò)程中我們就想在用本地的方法一樣。
2、Getting Started
廢話少說(shuō),試試就ok了。
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="dwr">
<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>
</web-app>
dwr.xml 與web.xml同目錄
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
</allow>
</dwr>
index.html
<html>
<head>
<title>DWR - Test Home</title>
<script type='text/javascript' src='dwr/interface/JDate.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script>
function init(){
JDate.getYear(load);
}
function load(data){
alert(data+1900+'年')
}
</script>
</head>
<body onload="init()">
</body>
</html>
dwr.jar 下載放lib下
完了,什么,夠了,就這些。訪問(wèn)ok!
3、Examples
http://www.aboutmyhealth.org/ 這不是Google Suggest嗎!ok.
4、源碼淺析
dwr的設(shè)計(jì)很象webwork2的設(shè)計(jì),隱藏http協(xié)議,擴(kuò)展性,兼容性及強(qiáng)。
通過(guò)研究uk.ltd.getahead.dwr.DWRServlet這個(gè)servlet來(lái)研究下dwr到底是如何工作滴。
java代碼:? |
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/*所有請(qǐng)求都由這個(gè)servlet來(lái)處理,它到底處理了些什么能。我們還以上面最簡(jiǎn)單的例子來(lái)看。
1、 web服務(wù)器啟動(dòng),DWRServlet init()方法調(diào)用,init主要做了以下工作。
設(shè)置日志級(jí)別、實(shí)例化DWR用到的單例類(這些類在jvm中只有一個(gè)實(shí)例對(duì)象)、讀去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2、請(qǐng)求處理
DWRServlet.doGet, doPost方法都調(diào)用processor.handle(req, resp)方法處理。Processor對(duì)象在init()方法中已經(jīng)初始化了。
java代碼:? |
publicvoid handle(HttpServletRequest req, HttpServletResponse resp) ? ? ? ? throwsIOException ? ? { ? ? ? ? String pathinfo = req.getPathInfo(); ? ? ? ? if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/")) ? ? ? ? { ? ? ? ? ? ? resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html"); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html")) ? ? ? ? { ? ? ? ? ? ? doIndex(req, resp); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.startsWith("/test/")) ? ? ? ? { ? ? ? ? ? ? doTest(req, resp); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js")) ? ? ? ? { ? ? ? ? ? ? doFile(resp, "engine.js", "text/javascript"); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js")) ? ? ? ? { ? ? ? ? ? ? doFile(resp, "util.js", "text/javascript"); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js")) ? ? ? ? { ? ? ? ? ? ? doFile(resp, "deprecated.js", "text/javascript"); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.startsWith("/interface/")) ? ? ? ? { ? ? ? ? ? ? doInterface(req, resp); ? ? ? ? }else ? ? ? ? if(pathinfo != null && pathinfo.startsWith("/exec")) ? ? ? ? { ? ? ? ? ? ? doExec(req, resp); ? ? ? ? }else ? ? ? ? { ? ? ? ? ? ? log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/"); ? ? ? ? ? ? resp.sendError(404); ? ? ? ? } ? ? } |
哦。這些恍然大悟。dwr/*處理的請(qǐng)求也就這幾種。
(1)dwr/index.html,dwr/test/這種只能在debug模式下使用,調(diào)試用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js當(dāng)這個(gè)請(qǐng)求到達(dá),從dwr.jar包中讀取文件流,響應(yīng)回去。(重復(fù)請(qǐng)求有緩存)
(2)當(dāng)dwr/interface/這種請(qǐng)求到來(lái),(例如我們?cè)趇ndex.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>)DWR做一件偉大的事。把我們?cè)赪EB- INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date轉(zhuǎn)化為javascript函數(shù)。
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
細(xì)節(jié)也比較簡(jiǎn)單,通過(guò)java反射,把方法都寫成javascript特定的方法。(我覺(jué)得這些轉(zhuǎn)換可以放到緩存里,下次調(diào)用沒(méi)必要再生成一遍,不知道作者為什么沒(méi)這樣做)。
(3)dwr/exec
javascript調(diào)用方法時(shí)發(fā)送這種請(qǐng)求,可能是XMLHttpRequest或IFrame發(fā)送。
當(dāng)然,javascript調(diào)用的方法簽名與java代碼一致,包括參數(shù),還有javascript的回調(diào)方法也傳到了服務(wù)器端,在服務(wù)器端很容易實(shí)現(xiàn)。回調(diào)方法的java的執(zhí)行結(jié)果 返回類似 <script>callMethod(結(jié)果)<script>的javascript字符串,在瀏覽器執(zhí)行。哈,一切就這么簡(jiǎn)單,巧妙。
dwr的設(shè)計(jì)構(gòu)思很是巧妙。
第一、把java類轉(zhuǎn)化為javascript類由dwr自動(dòng)完成,只需簡(jiǎn)單的配置。
第二、應(yīng)用起來(lái)極其簡(jiǎn)單。開(kāi)發(fā)者不要該服務(wù)器代碼就可以集成。
第三、容易測(cè)試。和webwork一樣,隱藏的http協(xié)議。
第四、及強(qiáng)擴(kuò)展性。例如與spring集成,只需修改一點(diǎn)代碼。
第五、性能。就我與jason,等簡(jiǎn)單比較,dwr性能可能是最好的。
第六、自動(dòng)把java對(duì)象轉(zhuǎn)化為javascript對(duì)象,并且及易擴(kuò)展。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。