本站不再更新,歡迎光臨 java開發(fā)技術網(wǎng)
          隨筆-230  評論-230  文章-8  trackbacks-0

          轉自于:http://swimren.javaeye.com/blog/98186

          關鍵字: DWR       

          最近發(fā)現(xiàn)dwr出了2.0版本,里面提供了與目前一些主流框架的整合,如Spring,JSF,Hibernate,Struts1,Webwork等,但Struts2.0還沒有提供,由于現(xiàn)在的項目我們采用的是Struts2.0,所以參考dwr與webwork的整合代碼,修改完成了
          dwr與Struts2的整和代碼

          1、首先下載Dwr2的源代碼,將 org\directwebremoting\webwork下的類拷出來,放到 新建的一個包
             比如 org.dwr.struts2 里,接下去就可以去修改里面的代碼,
              將類的引用都修改為從struts2的包中引用。
          2、接下去關鍵是修改 DWRAction.java這個類
             在該類中 比較特殊的是
             com.opensymphony.webwork.dispatcher.DispatcherUtils
          對應的struts2中的  org.apache.struts2.dispatcher.Dispatcher這個類
            ServletActionContext.WEBWORK_VALUESTACK_KEY  對應 ServletActionContext.STRUTS_VALUESTACK_KEY

          3、修改里面的 private DWRAction(ServletContext servletContext) 構造函數(shù)為

          java 代碼
          1. private DWRAction(ServletContext servletContext) throws ServletException   
          2.     {   
          3.        // Dispatcher.initialize(servletContext);   
          4.         m_wwDispatcher = Dispatcher.getInstance();   
          5.         if(m_wwDispatcher==null)   
          6.         {   
          7.            m_wwDispatcher = new Dispatcher(servletContext, new HashMap());   
          8.            m_wwDispatcher.init();   
          9.            Dispatcher.setInstance(m_wwDispatcher);   
          10.         }   
          11.            
          12.         m_actionProcessor = loadActionProcessor(servletContext.getInitParameter         (DWRACTIONPROCESSOR_INIT_PARAM));   
          13.     }   

          然后修改protected ActionInvocation invokeAction 方法 將第126行的代碼

          java 代碼
          1. ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(actionDefinition.getNamespace(), actionDefinition.getAction(), extraContext, actionDefinition.isExecuteResult(), false);   

          替換為以下代碼

          java 代碼

           

          1. Configuration config = du.getConfigurationManager().getConfiguration();   
          2.             ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(   
          3.                     mapping.getNamespace(), mapping.getName(), extraContext, actionDefinition.isExecuteResult(), false);   

          最后將 protected void prepareContinuationAction(HttpServletRequest request, Map extraContext)
           里的代碼都注釋掉 就可以了

          4,修改 DWRActionUtil.js文件將里面的webwork字樣都替換為 struts2,也可以不用修改,不過覺得不爽就是了
            然后就可以按照與webwork整和的方式配置dwr.xml就可以了

           

          最后有一點很重要,就是在 web.xml文件中配置DwrServlet 的時候一定要加上 
               exposeInternals
               true
                

          這個參數(shù),否則生成的 DWRAction.js 這個文件將不存在 DWRAction.execute(actionObj, params, callbackObj) 這個函數(shù),這個問題折磨了我近半天的時間啊.

          如果需要可以提供代碼上來,不過最好還是建議大家親自去修改一下比較好.


          最后更新:2007-07-07 11:10
          17:17  |   永久鏈接  |   瀏覽 (994)  |   評論 (5)  |    收藏  |   AJAX  |   進入論壇  |  
          評論    共 5 條 發(fā)表評論
          totodo     2007-07-05 20:35

          其實 ,Servlet那層,可以扔掉了。

          不要在再Web層還用 XX+XX。

          swimren     2007-07-06 08:23

          對,采用dwr,可以直接去訪問業(yè)務層,不用采用Struts 之類的,但有些時候還需要控制層,在個別的地方的使用dwr去調(diào)用,兩種結合著就比較好了.

          movingboy     2007-07-07 00:06

          請教樓主:

          1.我現(xiàn)在在試用AppFuse 2.0-M5,我嘗試了它自帶的DWR 2.0.1和Struts 2.0.6,在客戶端能夠正確地調(diào)用Struts action的方法并返回數(shù)據(jù)。我看了DWRAction.java的代碼,確實是象你提到的改動前的樣子,但我沒做任何改動。我想問一下你改動這個類的目的是什么呢?不改動會有什么問題呢?

          2.你在文中提到:

          引用
          最后有一點很重要,就是在 web.xml文件中配置DwrServlet 的時候一定要加上
          exposeInternals
          true

           

          我的web.xml沒有設置這一項。如果沒有生成DWRAction.execute(actionObj, params, callbackObj) ,會有什么問題呢?

          附上我的例子作為分析參考:
          dwr.xml的配置:

          代碼
          1. <!DOCTYPE dwr PUBLIC   
          2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"   
          3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">  
          4. <dwr>  
          5.     <allow>  
          6.         <create creator="spring" javascript="inquiryMasterAction">  
          7.             <param name="class" value="cn.net.cogent.summer.webapp.action.InquiryMasterAction"/>  
          8.             <param name="beanName" value="inquiryMasterAction"/>  
          9.             <include method="getDetailsByMasterId"/>  
          10.         </create>  
          11.         <convert converter="bean" match="cn.net.cogent.summer.model.InquiryDetail"/>  
          12.     </allow>  
          13. </dwr>  

           

          其中InquiryMasterAction的getDetailsByMasterId方法的Java代碼為:

          代碼
          1. public List<InquiryDetail> getDetailsByMasterId(Long masterId);  

           

          生成的inquiryMasterAction.js的內(nèi)容:

          代碼
          1. // Provide a default path to dwr.engine   
          2. if (dwr == null) var dwr = {};   
          3. if (dwr.engine == null) dwr.engine = {};   
          4. if (DWREngine == null) var DWREngine = dwr.engine;   
          5.   
          6. if (inquiryMasterAction == null) var inquiryMasterAction = {};   
          7. inquiryMasterAction._path = '/dwr';   
          8. inquiryMasterAction.getDetailsByMasterId = function(p0, callback) {   
          9.   dwr.engine._execute(inquiryMasterAction._path, 'inquiryMasterAction', 'getDetailsByMasterId', p0, callback);   
          10. }   

           

          在JSP頁面中只需要調(diào)用:

          代碼
          1. <script type='text/javascript'>  
          2.   var masterId = 1;   
          3.   var result;   
          4.   inquiryMasterAction.getDetailsByMasterId(1, result);   
          5. </script>  

           

          swimren     2007-07-07 10:57

          to movingboy :

          我沒有具體的去研究 AppFuse 2.0-M5的源碼,不過從你的描述中可以看出來,你的這種配置方式也是可以正常工作的。
          首先你是 把InquiryMasterAction 看作一個獨立的類來處理的,也就是說針對 InquiryMasterAction 單獨生成了一個inquiryMasterAction.js文件,而方法getDetailsByMasterId 返回的是你實際需要的數(shù)據(jù)。然后再通過
          inquiryMasterAction.getDetailsByMasterId(1, result); 去調(diào)用的,這種方式是DWR最初的最簡單方式。你的例子里實際上是沒有用到 DWRAction.js這個文件和DWRAction.java這個類了。
          但是在Struts2中,Action 中的方法是需要具體的返回一個String類型的 result,也就是定位到具體的頁面或路徑上。而需要的數(shù)據(jù)都被放到 ValueStack中了。所以數(shù)據(jù)的取法就不一樣了。
          上面說的dwr2與strut2的整和,主要是為了不需要調(diào)整原來的Action的寫法。所有的Action 的調(diào)用都可以通過

          代碼
          1. DWRActionUtil.execute({   
          2.   namespace:'/yournamespace',   
          3.   action:'yourAction',   
          4.   method:'yourMethod',   
          5.   executeResult:'true'   
          6. }, 'data', callBack);     

          這種方式去調(diào)用就可以了,這個方法最終會去調(diào)用 DWRAction.js里的execute()方法。這種方式是保留了Action的原汁原味,按照Struts2的機制去處理的。
          具體的你可以參考一下 dwr2的文檔中 與webwork整和的部分或著參考下面的
          http://wiki.javascud.org/display/dwrcn/WebWork+Integration?focusedCommentId=917506
          也可以
          posted on 2007-07-23 13:20 有貓相伴的日子 閱讀(8788) 評論(8)  編輯  收藏 所屬分類: dwr

          評論:
          # re: dwr2與struts2整合[未登錄] 2007-11-02 17:09 | aa
          還用struts+dwr 直接訪問 service
            回復  更多評論
            
          # re: dwr2與struts2整合 2009-01-03 21:53 | 肖亮亮
          經(jīng)過一般研究,修改修改
          DWRActionUtil.js里報錯,stactk overflow at line 28
          DWRActionUtil.js的內(nèi)容
          /*
          * Copyright 2005 Joe Walker / Alexandru Popescu
          *
          * Licensed under the Apache License, Version 2.0 (the "License");
          * you may not use this file except in compliance with the License.
          * You may obtain a copy of the License at
          *
          * http://www.apache.org/licenses/LICENSE-2.0
          *
          * Unless required by applicable law or agreed to in writing, software
          * distributed under the License is distributed on an "AS IS" BASIS,
          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
          * See the License for the specific language governing permissions and
          * limitations under the License.
          */

          /**
          * Declare an object to which we can add real functions.
          */
          if (dwr == null) var dwr = {};
          if (dwr.struts2 == null) dwr.struts2 = {};
          if (DWRActionUtil == null) var DWRActionUtil = dwr.struts2;

          /** Execute a remote request using DWR */
          dwr.struts2.execute = function(action, values, callbackObjOrName) {
          var params = {};
          if (dwr.struts2.isElement(values)) {
          var element = $(values);

          var elementName= element.nodeName.toLowerCase();
          if (elementName == 'form') {
          for (var i = 0; i < element.elements.length; i=i+1) {
          var e = element.elements[i];
          if (e.name != null && e.name != '') params[e.name] = dwr.util.getValue(e);
          }
          }
          else {
          params[element.name] = dwr.util.getValue(element);
          }
          }
          else {
          for (var prop in values) {
          params[prop]= values[prop];
          }
          }

          // prepare action invocation object
          var actionObj = {};
          if (typeof action == 'string') {
          var lastIdx= action.lastIndexOf('/');
          actionObj.executeResult = 'true';
          if (lastIdx != -1) {
          actionObj.namespace = action.substring(0, lastIdx);
          actionObj.action = action.substring(lastIdx + 1);
          }
          else {
          actionObj.namespace= '';
          actionObj.action = action;
          }
          }
          else {
          actionObj= action;
          }

          // prepare the DWR callback object
          var callbackObj = {};
          var mustCall= false;
          if (typeof callbackObjOrName == 'string') {
          callbackObj.callback = function(dt) { dwr.struts2.callback(dt, eval(callbackObjOrName)); };
          mustCall= true;
          }
          else if (typeof callbackObjOrName == 'function') {
          callbackObj.callback = function(dt) { dwr.struts2.callback(dt, callbackObjOrName); };
          mustCall= true;
          }
          else if (typeof callbackObjOrName == 'object' && typeof callbackObjOrName.callback == 'function') {
          for (var prop in callbackObjOrName) {
          callbackObj[prop] = callbackObjOrName[prop];
          }
          callbackObj.callback = function(dt) { dwr.struts2.callback(dt, callbackObjOrName.callback); };
          mustCall= true;
          }
          if (mustCall) {
          dwr.struts2.execute(actionObj, params, callbackObj);
          }
          };

          /** Execute a remote request using DWR */
          dwr.struts2.callback = function(dt, originalCallback) {
          if (dt.data) originalCallback(dt.data);
          else if (dt.text) originalCallback(dt.text);
          else originalCallback(dt);
          };

          /** Utility to check to see if the passed object is an input element / element id */
          dwr.struts2.isElement = function(elementOrId) {
          if (typeof elementOrId == "string") {
          return true;
          }
          if (elementOrId.nodeName) {
          var name= elementOrId.nodeName.toLowerCase();
          if (name == 'input' || name == 'form') {
          return true;
          }
          }

          return false;
          };
            回復  更多評論
            
          # re: dwr2與struts2整合 2009-01-03 22:14 | 肖亮亮
          我終于解決了,查了很多資料終于把dwr和s2整合  回復  更多評論
            
          # re: dwr2與struts2整合 2010-12-25 10:55 | 看看你們
          說直接掉業(yè)務層的應該直接說自己沒學過編程  回復  更多評論
            
          # re: dwr2與struts2整合[未登錄] 2011-01-01 12:54 | 憂云
          根本就不用那么麻煩的,我不知道你們用的struts2是什么版本的,我的是struts2-2.0.11.2,
          在web.xml中加入:
          <servlet>
          <servlet-name>dwr-invoker</servlet-name>
          <servlet-class>org.directwebremoting.servlet.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>


          在dwr.xml中用spring注入bean:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
          <dwr>
          <allow>
          <create creator="spring" javascript="acl">
          <param name="beanName" value="aclService"/>
          </create>
          </allow>
          </dwr>





          dwr測試頁面(呈現(xiàn)層用freemarker框架來顯示html頁面而沒用jsp):

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
          <title>dwr.html</title>

          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          <meta http-equiv="description" content="this is my page">
          <meta http-equiv="content-type" content="text/html; charset=UTF-8">
          <script type='text/javascript' src='/dwr/interface/acl.js'></script>
          <script type='text/javascript' src='/dwr/engine.js'></script>
          <script type='text/javascript' src='/dwr/util.js'></script>
          <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

          </head>

          <body>
          <input type="button" value="DWR" onclick="dwrTest()"/>
          </body>
          <script type="text/javascript">
          function dwrTest() {
          acl.getString("前臺",function(data){
          alert(data);
          });
          }
          </script>
          </html>


          這樣就行了,是可以直接調(diào)用的。不知道你們?yōu)槭裁匆脑创a?搞了半天還不知道怎么回事,很多人還出現(xiàn)包沖突或版本不對。  回復  更多評論
            
          # re: dwr2與struts2整合 2011-04-18 17:58 | Glorin
          能夠說具體些嘛?還是不怎么懂哈!@憂云
            回復  更多評論
            
          # re: dwr2與struts2整合 2011-09-29 23:43 | 淡定
          這話說的有點過了吧。有本事你自己去寫一個框架,讓大家來膜拜?。?nbsp; 回復  更多評論
            
          # re: dwr2與struts2整合[未登錄] 2012-04-25 10:43 | libo
          @肖亮亮
          DWRActionUtil.js里報錯,stactk overflow at line 28
          請聯(lián)系我QQ:635392334
          非常感謝??!  回復  更多評論
            
          本站不再更新,歡迎光臨 java開發(fā)技術網(wǎng)
          主站蜘蛛池模板: 泊头市| 堆龙德庆县| 沾益县| 海原县| 灵武市| 宜兰市| 武城县| 赫章县| 南昌县| 蕉岭县| 龙口市| 清远市| 渭源县| 海门市| 杭锦旗| 台前县| 濮阳县| 汕头市| 远安县| 义乌市| 紫云| 巴楚县| 宝清县| 泸水县| 泗阳县| 西畴县| 沂源县| 三门县| 琼中| 商水县| 朝阳县| 丹棱县| 临安市| 万宁市| 汶上县| 仪陇县| 定兴县| 闽清县| 商河县| 始兴县| 宕昌县|