?
這部分將實(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ā)。
|