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

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

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

    隨筆-200  評論-148  文章-15  trackbacks-0
    ?
    這部分將實際開發一個應用,今天是情人節,套用了一個老外的示例模板,做了一個在線禮品的簡易版本。
    先講一下應用的結構
    頁面端:
    ?? ?demo.jsp用來展示界面
    服務端:
    ?? ?DemoAction是Struts中的Action子類負責控制轉換,
    ?? ?DemoFacade是業務類負責業務處理。
    ?? ?Goods是一個業務實體類

    Struts部分的配置就忽略不說了,實際上這個應用并沒有包含Struts的配置
    主要講一下dwr的配置,首先需要在web.xml增加下面的servelt映射:
    ? <servlet>
    ??? <servlet-name>dwr-invoker</servlet-name>
    ??? <display-name>DWR Servlet</display-name>
    ??? <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    ??? <init-param>
    ????? <param-name>debug</param-name>
    ????? <param-value>true</param-value>
    ??? </init-param>
    ? </servlet>
    ? <servlet-mapping>
    ??? <servlet-name>dwr-invoker</servlet-name>
    ??? <url-pattern>/dwr/*</url-pattern>
    ? </servlet-mapping>
    如上uk.ltd.getahead.dwr.DWRServlet是dwr的核心,用來處理javascript的對遠程方法的調用,還有其他參數請參考相關文檔。
    然后,需要在dwr.xml配置相應的遠程方法(與具體需要在客戶端調用的方法相關),如下為演示應用的配置:
    <dwr>
    ??? <allow>
    ??????? <convert converter="bean" match="dwr.demo.Goods"/>
    ??????? <create creator="new" javascript="DemoAction" class="dwr.demo.DemoAction">
    ??????????? <include method="query4dwr"/>
    ??????????? <include method="copy4dwr"/>
    ??????????? <include method="paste4dwr"/>
    ??????? </create>
    ??????? <create creator="new" javascript="DemoFacade" class="dwr.demo.DemoFacade">
    ??????????? <include method="queryList"/>
    ??????????? <include method="restore"/>
    ??????????? <include method="del"/>
    ??????? </create>
    ? ?? ?</allow>
    </dwr>
    如上有一個轉換器(converter)是用來映射dwr.demo.Goods為bean類型,其他轉換器類型請參考相關文檔;還有兩個創建器分別創建javascript中的DemoAction類和DemoFacade類,分別對應dwr.demo.DemoAction類和dwr.demo.DemoFacade,其中定義的方法就可以從javascript中直接調用了。
    最后,我們需要在頁面中包含相應的javascript:
    ? <script src="/oblog312/dwr/interface/DemoAction.js"></script>
    ? <script src="/oblog312/dwr/interface/DemoFacade.js"></script>
    ? <script src="/oblog312/dwr/engine.js"></script>
    ? <script src="/oblog312/dwr/util.js"></script>
    如上,dwr/interface/DemoAction.js和dwr/interface/DemoFacade.js是dwr自動生成的javascript文件,包含相應的類及方法,dwr/engine.js是dwr的核心引擎腳本處理客戶端調用的轉換,dwr/util.js包含了工具函數簡化頁面處理。

    下面以查詢為例,看一下dwr的具體使用:
    DemoAction:
    ??? public List query4dwr(int type, boolean needClear, HttpServletRequest request) {
    ??????? if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId");
    ??????? return demoFacade.queryList(type);
    ??? }
    demo.jsp:
    ? function updateResults() {
    ??? DWRUtil.removeAllRows("goodsbody");
    ??? var type = document.getElementById("type").value;
    ??? DemoAction.query4dwr(type, true, fillTable);
    ? }
    ? function fillTable(goods) {
    ??? document.forms[0].select.checked = false;
    ??? document.getElementById("totalRecords").innerHTML = goods.length;
    ??? DWRUtil.addRows("goodsbody", goods, [ addCheckbox, getName, getPrice, getCount]);
    ? }
    如上,DemoAction.query4dwr(type, true, fillTable)就可以直接調用DemoAction的方法了,這里fillTable是函數,dwr通過回調函數的方式來進行后續處理。比較一下javascript和action中的方法參數,HttpServletRequest是可以不傳的,dwr會自動加上,另一個就是回調參數放在最后,這是比較好的方式,其他方式請參考文檔。

    最后看一下,dwr如何與Struts集成,如下代碼:
    ??? public ActionForward query(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    ??????? String type = request.getParameter("type");
    ??????? //或者從form中取值
    ?????? ?
    ??????? List goodsList = query4dwr(Integer.parseInt(type), true, request);
    ??????? request.setAttribute("goodsList", goodsList);
    ?????? ?
    ??????? return mapping.findForward("success");
    ??? }

    ??? public List query4dwr(int type, boolean needClear, HttpServletRequest request) {
    ??????? if (needClear) request.getSession().removeAttribute("dwr.demo.goodsId");
    ??????? return demoFacade.queryList(type);
    ??? }
    前一個方法是Struts的方式,但dwr不支持,因此要重構一下在下面的方法才可以被dwr調用。
    實際上,只有在方法中需要使用到HttpServletRequest是才需要重構方法,如果不使用HttpServletRequest,我們就可以直接調用業務層的類的方法,這樣即簡單又方便,如下:
    demo.jsp:
    ? function restore() {
    ??? DemoFacade.restore(updateResults);
    ? }

    DemoAction:
    ??? public synchronized void restore() {
    ??????? goodsList.clear();?? ?
    ??????? initGoods();
    ??? }

    小結

    ? dwr封裝了ajax中與服務端交互的模塊,通過直接調用服務端類的方法簡化了客戶端與服務端的交互。雖然說還缺省類似tag這樣的組件,但已經很大程度簡化了ajax的開發。



    資源
    ? 1、示例源程序:下載
    ? 2、dwr主站:http://getahead.ltd.uk/dwr
    ? 3、ajax主站:http://en.wikipedia.org/wiki/AJAX

    posted on 2006-07-15 09:56 無聲 閱讀(4947) 評論(4)  編輯  收藏

    評論:
    # re: ajax/dwr/struts實例開發(下) 2006-11-20 11:21 | lgs
    大哥你這個例子是雜用的啊。我這里好像不能用啊!能否指點一下。
    qq:379548695  回復  更多評論
      
    # re: ajax/dwr/struts實例開發(下) 2007-07-25 16:09 | Lukewoo
    有沒有Struts好像無關緊要了嘛???!!!  回復  更多評論
      
    # re: ajax/dwr/struts實例開發(下) 2007-08-25 10:24 | kolo
    我也不明白為什么,這樣只是把ACTION當servlet用了,也沒用到dwr的struts構造器,沒看到struts跟dwr的集成  回復  更多評論
      
    # re: ajax/dwr/struts實例開發(下) 2008-02-27 16:36 | Susan
    我感覺很亂  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 国产午夜亚洲精品不卡电影| 亚洲国产精彩中文乱码AV| 在线精品免费视频| 99视频在线精品免费观看6| 日日麻批免费40分钟日本的| 99爱在线精品视频免费观看9| 女人体1963午夜免费视频| 18禁超污无遮挡无码免费网站| japanese色国产在线看免费| 午夜免费国产体验区免费的| 一级毛片a免费播放王色电影 | 亚洲剧场午夜在线观看| 亚洲欧洲精品一区二区三区| 亚洲国语在线视频手机在线| 亚洲国产日韩在线人成下载| 亚洲一线产区二线产区区| 亚洲精品9999久久久久无码| 国产精品亚洲专区无码唯爱网| 美女免费视频一区二区| 51午夜精品免费视频| 国产午夜精品久久久久免费视| 日韩精品内射视频免费观看 | 亚洲国产精品18久久久久久| 国产精品亚洲二区在线| 一级**爱片免费视频| 毛片在线播放免费观看| 最近中文字幕大全免费视频 | 一级黄色免费网站| a级毛片高清免费视频| 95老司机免费福利| 操美女视频免费网站| 免费一级毛片免费播放| 国产亚洲成AV人片在线观黄桃| 亚洲精品综合久久中文字幕| 亚洲精品无码久久久久久| a级毛片免费高清视频| 最近免费中文字幕高清大全| 在线观看永久免费视频网站| 亚洲色WWW成人永久网址| 亚洲国产片在线观看| 一区二区三区视频免费|