隨筆-200  評(píng)論-148  文章-15  trackbacks-0
          ?
          這部分將實(shí)際開發(fā)一個(gè)應(yīng)用,今天是情人節(jié),套用了一個(gè)老外的示例模板,做了一個(gè)在線禮品的簡易版本。
          先講一下應(yīng)用的結(jié)構(gòu)
          頁面端:
          ?? ?demo.jsp用來展示界面
          服務(wù)端:
          ?? ?DemoAction是Struts中的Action子類負(fù)責(zé)控制轉(zhuǎn)換,
          ?? ?DemoFacade是業(yè)務(wù)類負(fù)責(zé)業(yè)務(wù)處理。
          ?? ?Goods是一個(gè)業(yè)務(wù)實(shí)體類

          Struts部分的配置就忽略不說了,實(shí)際上這個(gè)應(yīng)用并沒有包含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的對(duì)遠(yuǎn)程方法的調(diào)用,還有其他參數(shù)請(qǐng)參考相關(guān)文檔。
          然后,需要在dwr.xml配置相應(yīng)的遠(yuǎn)程方法(與具體需要在客戶端調(diào)用的方法相關(guān)),如下為演示應(yīng)用的配置:
          <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>
          如上有一個(gè)轉(zhuǎn)換器(converter)是用來映射dwr.demo.Goods為bean類型,其他轉(zhuǎn)換器類型請(qǐng)參考相關(guān)文檔;還有兩個(gè)創(chuàng)建器分別創(chuàng)建javascript中的DemoAction類和DemoFacade類,分別對(duì)應(yīng)dwr.demo.DemoAction類和dwr.demo.DemoFacade,其中定義的方法就可以從javascript中直接調(diào)用了。
          最后,我們需要在頁面中包含相應(yīng)的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自動(dòng)生成的javascript文件,包含相應(yīng)的類及方法,dwr/engine.js是dwr的核心引擎腳本處理客戶端調(diào)用的轉(zhuǎn)換,dwr/util.js包含了工具函數(shù)簡化頁面處理。

          下面以查詢?yōu)槔匆幌耫wr的具體使用:
          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)就可以直接調(diào)用DemoAction的方法了,這里fillTable是函數(shù),dwr通過回調(diào)函數(shù)的方式來進(jìn)行后續(xù)處理。比較一下javascript和action中的方法參數(shù),HttpServletRequest是可以不傳的,dwr會(huì)自動(dòng)加上,另一個(gè)就是回調(diào)參數(shù)放在最后,這是比較好的方式,其他方式請(qǐng)參考文檔。

          最后看一下,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);
          ??? }
          前一個(gè)方法是Struts的方式,但dwr不支持,因此要重構(gòu)一下在下面的方法才可以被dwr調(diào)用。
          實(shí)際上,只有在方法中需要使用到HttpServletRequest是才需要重構(gòu)方法,如果不使用HttpServletRequest,我們就可以直接調(diào)用業(yè)務(wù)層的類的方法,這樣即簡單又方便,如下:
          demo.jsp:
          ? function restore() {
          ??? DemoFacade.restore(updateResults);
          ? }

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

          小結(jié)

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



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

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

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 抚松县| 大同县| 普兰店市| 岳普湖县| 蒙城县| 额敏县| 蒙自县| 闽侯县| 吴川市| 呼伦贝尔市| 宁海县| 盐津县| 五家渠市| 黔东| 海淀区| 乌审旗| 申扎县| 新龙县| 稷山县| 康乐县| 沛县| 安国市| 延川县| 醴陵市| 达拉特旗| 巩留县| 南阳市| 昌黎县| 青川县| 乌拉特前旗| 叙永县| 大庆市| 丹巴县| 融水| 汤原县| 上林县| 和静县| 西吉县| 丰原市| 浦城县| 东至县|