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

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

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

    隨筆 - 10, 文章 - 0, 評論 - 7, 引用 - 0
    數據加載中……

    DWR框架實現Ajax

          Ajax是時下比較流行的一種web界面設計新思路,其核心思想是從瀏覽器獲取XMLHttp對象與服務器端進行交互. DWR(Direct Web Remoting)就是實現了這種Ajax技術的一種web框架. 最近做的項目中我也將它用上了,感覺很是方便,比如動態生成javascript代碼,隱藏的http協議,java代碼和javascript交互的是javascript的對象(或字符串).  下面是我整理的文檔.
      DWR主要由兩部門組成。javascript與web服務器通信并更新web頁;運行在web服務器的Servlet處理請求并把響應發回瀏覽器。

       1  .  配置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>

      2    當我們想看dwr自動生成的測試頁時,可在java代碼
    servlet中加
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>

    這個參數DWR默認是false.如果選擇true.我們可以通過url http://localhost:port/app/dwr ,你就可以看到你部署的每個DWR class。并且可以測試java代碼的每個方法是否運行正常。為了安全考慮,在正式環境下你一定把這個參數設為false.

    3  log信息配置

    我喜歡用log4j輸出日志,那么在log4j.properties下加,log4j.logger.uk.ltd.getahead.dwr = debug。這樣可以看DWR的調試日志。

    4  配置dwr.xml (和web.xml同目錄)
     
    <create creator="new" javascript="JDate">
    <param name="class" value="java.util.Date"/>
    </create>

    這里的多數元素都是可選的 - 你真正必須知道的是指定一個creator和一個javascript名字。

    creator屬性 是必須的 - 它用來指定使用那種創造器。

    默認情況下DWR1.1有8種創造器。它們是:

    • new: 用Java的new關鍵字創造對象。
    • none: 它不創建對象,看下面的原因。 (v1.1+)
    • scripted: 通過BSF使用腳本語言創建對象,例如BeanShell或Groovy。
    • spring: 通過Spring框架訪問Bean。
    • jsf: 使用JSF的Bean。 (v1.1+)
    • struts: 使用Struts的FormBean。 (v1.1+)
    • pageflow: 訪問Beehive或Weblogic的PageFlow。 (v1.1+)

    javascript屬性 用于指定瀏覽器中這個被創造出來的對象的名字。你不能使用Javascript的關鍵字。

    scope屬性 非常類似servlet規范中的scope。 它允許你指定這個bean在什么生命范圍。選項有"application", "session", "request" 和"page"。這些值對于Servlet和JSP開發者來說應該相當熟悉了。

    scope屬性是可選的。默認是"page"。如果要使用"session"需要cookies。當前的DWR不支持ULR重寫。

    param元素 被用來指定創造器的其他參數,每種構造器各有不同。例如,"new"創造器需要知道要創建的對象類型是什么。每一個創造器的參數在各自的文檔中能找到。請查看上面的鏈接。

    include和exclude元素 允許創造器來限制類中方法的訪問。一個創造器必須指定include列表或exclude列表之一。如果是include列表則暗示默認的訪問策略是"拒絕";如果是exclude列表則暗示默認的訪問策略是"允許"。


    5 dwr.jar下載后放lib下

    源碼淺析

    dwr的設計很象webwork2的設計,隱藏http協議,擴展性,兼容性及強。

    通過研究uk.ltd.getahead.dwr.DWRServlet這個servlet來研究下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>

    這樣/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中文文檔. http://www.tkk7.com/Files/LiuTing/DWR中文文檔.rar





    posted on 2007-05-20 12:45 LiuTing 閱讀(4335) 評論(4)  編輯  收藏 所屬分類: Ajax學習

    評論

    # re: DWR框架實現Ajax[未登錄]  回復  更多評論   

    等待
    2013-10-11 17:04 | 等待

    # re: DWR框架實現Ajax  回復  更多評論   

    集合
    2014-09-03 11:54 | 回家

    # re: DWR框架實現Ajax[未登錄]  回復  更多評論   

    王鴻林
    2014-11-03 10:24 | 張三

    # re: DWR框架實現Ajax  回復  更多評論   

    r 關于dao層參數的實現,比如參數有1,2,3,那么service層就寫這3個參數的方法,然后在DAO層進行參數的判斷,比如只要查1,3限制條件的
    那service層上面層的action層里面往service層傳參數的時候2應該是等于null,那就在dao層對每個1,2,3參數進行判斷
    比如1,3可以寫成from XXX表 where if(XXX1!=NULL){寫1的限制}else{} if(XXX1!=NULL){寫1的限制}else{} if(XXX1!=NULL){寫1的限制}else{}
    2014-12-29 20:43 | jgi

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲s色大片在线观看| 国产免费av一区二区三区| 亚洲小说区图片区另类春色| 蜜臀亚洲AV无码精品国产午夜.| 热99re久久免费视精品频软件| 亚洲xxxx视频| 人禽杂交18禁网站免费| 亚洲国产成人手机在线电影bd | 国产精品亚洲A∨天堂不卡| 国产免费黄色无码视频| 亚洲日韩欧洲无码av夜夜摸| 亚洲免费人成在线视频观看 | avtt天堂网手机版亚洲| 日本h在线精品免费观看| 色在线亚洲视频www| 日韩免费无砖专区2020狼| 亚洲av日韩精品久久久久久a| 日日夜夜精品免费视频| 黄色毛片视频免费| 中文亚洲AV片在线观看不卡| 久久久高清日本道免费观看| 亚洲视频免费在线看| 四虎成人免费影院网址| 一区二区在线视频免费观看| 亚洲国产精品VA在线看黑人 | 国产成人高清亚洲一区久久| 国产AⅤ无码专区亚洲AV| 最近最新高清免费中文字幕| 亚洲熟女www一区二区三区| 免费大黄网站在线观| 青青草原1769久久免费播放| 亚洲欧洲精品一区二区三区| 在线观看免费为成年视频| 一级免费黄色大片| 亚洲黄色免费观看| 免费观看亚洲人成网站| 黄色网址在线免费| 亚洲av无码成人影院一区| 久久九九亚洲精品| 热99re久久精品精品免费| 国产精品白浆在线观看免费|