<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 14,  comments - 37,  trackbacks - 0

    http://getahead.ltd.uk/dwr/
    這段時間較閑,研究了一番dwr.發現dwr實現的AJAX有些地方確實很是先進.比如動態生成javascript代碼;隱藏的http協議;javascript于java代碼交互的是javascript對象(或字符串)等.
    以下是我臨時譯的一些東西.本來想全譯,發現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 onload="init()"> 
    </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到底是如何工作滴。

    代碼
       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()方法中已經初始化了。
    代碼
    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);   
            }
       
        }
      

    哦。這些恍然大悟。dwr/*處理的請求也就這幾種。
    (1)dwr/index.html,dwr/test/這種只能在debug模式下使用,調試用。
    dwr/engine.js,dwr/util.js,dwr/deprecated.js當這個請求到達,從dwr.jar包中讀取文件流,響應回去。(重復請求有緩存)
    (2)當dwr/interface/這種請求到來,(例如我們在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>)DWR做一件偉大的事。把我們在WEB-INF/dwr.xml中的
    <create creator="new" javascript="JDate">
    <param name="class" value="java.util.Date"/>
    </create>
    java.util.Date轉化為javascript函數。
    http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。
    細節也比較簡單,通過java反射,把方法都寫成javascript特定的方法。(我覺得這些轉換可以放到緩存里,下次調用沒必要再生成一遍,不知道作者為什么沒這樣做)。
    (3)dwr/exec
    javascript調用方法時發送這種請求,可能是XMLHttpRequest或IFrame發送。
    當然,javascript調用的方法簽名與java代碼一致,包括參數,還有javascript的回調方法也傳到了服務器端,在服務器端很容易實現?;卣{方法的java的執行結果 返回類似 <script>callMethod(結果)<script>的javascript字符串,在瀏覽器執行。哈,一切就這么簡單,巧妙。

     

    dwr的設計構思很是巧妙。
    第一、把java類轉化為javascript類由dwr自動完成,只需簡單的配置。
    第二、應用起來極其簡單。開發者不要該服務器代碼就可以集成。
    第三、容易測試。和webwork一樣,隱藏的http協議。
    第四、及強擴展性。例如與spring集成,只需修改一點代碼。
    第五、性能。就我與jason,等簡單比較,dwr性能可能是最好的。
    第六、自動把java對象轉化為javascript對象,并且及易擴展。[/code]

    simpledwr.rar
     描述:  最簡單的一個例子.
    /Files/afei0922/simpledwr.rar 
     文件名:  simpledwr.rar
     文件大小:  137 KB
     下載過的:  文件被下載或查看 1806 次
    howitworks.png
     描述:  
     文件大小:  31 KB
     看過的:  文件被下載或查看 1446 次

    howitworks.png 
    /Files/afei0922/howitworks.png
    posted on 2007-07-12 16:59 冰封的愛 閱讀(190) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久综合九色综合97免费下载 | 亚洲欧洲国产精品你懂的| 亚洲aⅴ无码专区在线观看春色| 亚洲国产精品免费在线观看| 亚洲AV无码乱码在线观看富二代| 成人妇女免费播放久久久| 亚洲国产成人精品无码久久久久久综合| 亚洲aⅴ无码专区在线观看春色| 破了亲妺妺的处免费视频国产| 亚洲成A∨人片在线观看无码| 美女被cao免费看在线看网站| 亚洲最大无码中文字幕| 免费无码黄网站在线观看| 国产亚洲精品91| 久久久青草青青国产亚洲免观 | 亚色九九九全国免费视频| 亚洲人成人伊人成综合网无码| 免费精品一区二区三区在线观看| 色妞www精品视频免费看| 亚洲一区二区精品视频| 日本免费高清视频| 亚洲午夜电影在线观看高清| 免费看的成人yellow视频| 特级av毛片免费观看| 亚洲国产精品无码久久一区二区| 91香蕉国产线在线观看免费 | 亚洲欧洲国产成人综合在线观看| 久久国产精品国产自线拍免费| 亚洲精品福利网泷泽萝拉| 精品久久洲久久久久护士免费 | 成人免费ā片在线观看| 久久久无码精品亚洲日韩蜜桃 | 好大好硬好爽免费视频| 国产精品永久免费视频| 4480yy私人影院亚洲| 国产成人在线观看免费网站| 中文字幕不卡高清免费| 亚洲AV无码久久久久网站蜜桃 | 亚洲AV无码国产丝袜在线观看 | 亚洲国产综合精品中文字幕| 98精品全国免费观看视频|