Java Ajax: DWR
生活随笔
收集整理的這篇文章主要介紹了
Java Ajax: DWR
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://getahead.ltd.uk/dwr/
1、DWR: Easy AJAX for JAVA
作為一個java open source library,DWR可以幫助開發人員完成應用AJAX技術的web程序。它可以讓瀏覽器上的javascript方法調用運行在web服務器上java方法。
DWR主要由兩部門組成。javascript與web服務器通信并更新web頁;運行在web服務器的Servlet處理請求并把響應發回瀏覽器。
DWR采用新穎的方法實現了AJAX(本來也沒有確切的定義),在java代碼基礎上動態的生成javascript代碼。web開發者可以直接調用這些javascript代碼,然而真正的代碼是運行在web服務器上的java code。出與安全考慮,開發者必須配置哪些java class暴露給DWR.(dwr.xml)
這種從(java到javascript)調用機制給用戶一種感覺,好象常規的RPC機制,或RMI or SOAP.但是它運行在web上,不需要任何瀏覽器插件。
DWR不認為瀏覽器和web服務器之間協議重要,把系統界面放在首位。最大挑戰是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結果只有在方法結束后才有效。DWR解決了這個問題,把回調函數當成參數傳給方法,處理完成后,自動調用回調方法。
這個圖表顯示了,通過javascript事件,DWR能改變select的內容,當然這些內容由java代碼返回。 javascript函數Data.getOptions(populateList)由DWR動態生成,這個函數會調用java class Data類的方法。DWR處理如何遠程調用,包括轉換所有的參數和返回的結果(javascript\java)。java方法執行完后,執行回調方法populateList。在整個過程中我們就想在用本地的方法一樣。
2、Getting Started
廢話少說,試試就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
</body>
</html>
dwr.jar? 下載放lib下
完了,什么,夠了,就這些。訪問ok!
3、Examples
http://www.aboutmyhealth.org/? 這不是Google Suggest嗎!ok.
4、源碼淺析
dwr的設計很象webwork2的設計,隱藏http協議,擴展性,兼容性及強。
通過研究uk.ltd.getahead.dwr.DWRServlet這個servlet來研究下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/*所有請求都由這個servlet來處理,它到底處理了些什么能。我們還以上面最簡單的例子來看。 ?? 1、??web服務器啟動,DWRServlet?init()方法調用,init主要做了以下工作。 ?? 設置日志級別、實例化DWR用到的單例類(這些類在jvm中只有一個實例對象)、讀去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml.?config*.xml)。 ?? 2、請求處理 ?? DWRServlet.doGet,?doPost方法都調用processor.handle(req,?resp)方法處理。Processor對象在init()方法中已經初始化了。 ?? <PRE?class=java?name="code">public?void?handle(HttpServletRequest?req,?HttpServletResponse?resp); ?? ????????throws?IOException ?? ????{ ?? ????????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);; ?? ????????} ?? ????}</PRE> ?? <BR>哦。這些恍然大悟。dwr/*處理的請求也就這幾種。 ?? <BR>(1)dwr/index.html,dwr/test/這種只能在debug模式下使用,調試用。 ?? <BR>dwr/engine.js,dwr/util.js,dwr/deprecated.js當這個請求到達,從dwr.jar包中讀取文件流,響應回去。(重復請求有緩存) ?? <BR>(2)當dwr/interface/這種請求到來,(例如我們在index.html中的?<script?type='text/javascript'?src='dwr/interface/JDate.js'></script>)DWR做一件偉大的事。把我們在WEB-INF/dwr.xml中的 ?? <BR><create?creator="new"?javascript="JDate"> ?? <BR>??????<param?name="class"?value="java.util.Date"/> ?? <BR></create> ?? <BR>java.util.Date轉化為javascript函數。 ?? <BR>http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。 ?? <BR>細節也比較簡單,通過java反射,把方法都寫成javascript特定的方法。(我覺得這些轉換可以放到緩存里,下次調用沒必要再生成一遍,不知道作者為什么沒這樣做)。 ?? <BR>(3)dwr/exec ?? <BR>????javascript調用方法時發送這種請求,可能是XMLHttpRequest或IFrame發送。 ?? <BR>當然,javascript調用的方法簽名與java代碼一致,包括參數,還有javascript的回調方法也傳到了服務器端,在服務器端很容易實現。回調方法的java的執行結果?返回類似?<script>callMethod(結果)<script>的javascript字符串,在瀏覽器執行。哈,一切就這么簡單,巧妙。 ?? <BR> ?? <BR>dwr的設計構思很是巧妙。 ?? <BR>第一、把java類轉化為javascript類由dwr自動完成,只需簡單的配置。 ?? <BR>第二、應用起來極其簡單。開發者不要該服務器代碼就可以集成。 ?? <BR>第三、容易測試。和webwork一樣,隱藏的http協議。 ?? <BR>第四、及強擴展性。例如與spring集成,只需修改一點代碼。 ?? <BR>第五、性能。就我與jason,等簡單比較,dwr性能可能是最好的。 ?? <BR>第六、自動把java對象轉化為javascript對象,并且及易擴展。??
1、DWR: Easy AJAX for JAVA
作為一個java open source library,DWR可以幫助開發人員完成應用AJAX技術的web程序。它可以讓瀏覽器上的javascript方法調用運行在web服務器上java方法。
DWR主要由兩部門組成。javascript與web服務器通信并更新web頁;運行在web服務器的Servlet處理請求并把響應發回瀏覽器。
DWR采用新穎的方法實現了AJAX(本來也沒有確切的定義),在java代碼基礎上動態的生成javascript代碼。web開發者可以直接調用這些javascript代碼,然而真正的代碼是運行在web服務器上的java code。出與安全考慮,開發者必須配置哪些java class暴露給DWR.(dwr.xml)
這種從(java到javascript)調用機制給用戶一種感覺,好象常規的RPC機制,或RMI or SOAP.但是它運行在web上,不需要任何瀏覽器插件。
DWR不認為瀏覽器和web服務器之間協議重要,把系統界面放在首位。最大挑戰是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結果只有在方法結束后才有效。DWR解決了這個問題,把回調函數當成參數傳給方法,處理完成后,自動調用回調方法。
這個圖表顯示了,通過javascript事件,DWR能改變select的內容,當然這些內容由java代碼返回。 javascript函數Data.getOptions(populateList)由DWR動態生成,這個函數會調用java class Data類的方法。DWR處理如何遠程調用,包括轉換所有的參數和返回的結果(javascript\java)。java方法執行完后,執行回調方法populateList。在整個過程中我們就想在用本地的方法一樣。
2、Getting Started
廢話少說,試試就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
</body>
</html>
dwr.jar? 下載放lib下
完了,什么,夠了,就這些。訪問ok!
3、Examples
http://www.aboutmyhealth.org/? 這不是Google Suggest嗎!ok.
4、源碼淺析
dwr的設計很象webwork2的設計,隱藏http協議,擴展性,兼容性及強。
通過研究uk.ltd.getahead.dwr.DWRServlet這個servlet來研究下dwr到底是如何工作滴。
Java代碼
轉載于:https://blog.51cto.com/babyhe/253352
總結
以上是生活随笔為你收集整理的Java Ajax: DWR的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程如何修改Windows 2003机器
- 下一篇: Java技巧:深拷贝的两种方式2(转)