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

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

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

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

    轉(zhuǎn)自于:http://swimren.javaeye.com/blog/98186

    關(guān)鍵字: DWR       

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

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

    3、修改里面的 private DWRAction(ServletContext servletContext) 構(gòu)造函數(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,也可以不用修改,不過(guò)覺(jué)得不爽就是了
      然后就可以按照與webwork整和的方式配置dwr.xml就可以了

     

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

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

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


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

    其實(shí) ,Servlet那層,可以扔掉了。

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

    swimren     2007-07-06 08:23

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

    movingboy     2007-07-07 00:06

    請(qǐng)教樓主:

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

    2.你在文中提到:

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

     

    我的web.xml沒(méi)有設(shè)置這一項(xiàng)。如果沒(méi)有生成DWRAction.execute(actionObj, params, callbackObj) ,會(huì)有什么問(wèn)題呢?

    附上我的例子作為分析參考:
    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頁(yè)面中只需要調(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 :

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

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

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

    評(píng)論:
    # re: dwr2與struts2整合[未登錄](méi) 2007-11-02 17:09 | aa
    還用struts+dwr 直接訪問(wèn) service
      回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合 2009-01-03 21:53 | 肖亮亮
    經(jīng)過(guò)一般研究,修改修改
    DWRActionUtil.js里報(bào)錯(cuò),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;
    };
      回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合 2009-01-03 22:14 | 肖亮亮
    我終于解決了,查了很多資料終于把dwr和s2整合  回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合 2010-12-25 10:55 | 看看你們
    說(shuō)直接掉業(yè)務(wù)層的應(yīng)該直接說(shuō)自己沒(méi)學(xué)過(guò)編程  回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合[未登錄](méi) 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測(cè)試頁(yè)面(呈現(xiàn)層用freemarker框架來(lái)顯示html頁(yè)面而沒(méi)用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("前臺(tái)",function(data){
    alert(data);
    });
    }
    </script>
    </html>


    這樣就行了,是可以直接調(diào)用的。不知道你們?yōu)槭裁匆脑创a?搞了半天還不知道怎么回事,很多人還出現(xiàn)包沖突或版本不對(duì)。  回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合 2011-04-18 17:58 | Glorin
    能夠說(shuō)具體些嘛?還是不怎么懂哈!@憂云
      回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合 2011-09-29 23:43 | 淡定
    這話說(shuō)的有點(diǎn)過(guò)了吧。有本事你自己去寫一個(gè)框架,讓大家來(lái)膜拜啊!  回復(fù)  更多評(píng)論
      
    # re: dwr2與struts2整合[未登錄](méi) 2012-04-25 10:43 | libo
    @肖亮亮
    DWRActionUtil.js里報(bào)錯(cuò),stactk overflow at line 28
    請(qǐng)聯(lián)系我QQ:635392334
    非常感謝!!  回復(fù)  更多評(píng)論
      
    本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
    主站蜘蛛池模板: 999国内精品永久免费视频| 男人j进入女人j内部免费网站 | 污视频在线观看免费| 综合亚洲伊人午夜网| 两个人日本WWW免费版| 国产亚洲?V无码?V男人的天堂 | 又粗又大又猛又爽免费视频| 色九月亚洲综合网| 亚洲日韩中文字幕日韩在线| 一级特黄a大片免费| 国产亚洲精品美女久久久 | 91成人免费观看网站| 亚洲偷偷自拍高清| 日韩免费电影在线观看| 337P日本欧洲亚洲大胆精品| 亚洲成a人一区二区三区| 一区视频免费观看| 久久夜色精品国产噜噜亚洲AV| 最近国语视频在线观看免费播放| www.亚洲色图| 亚洲国产精品热久久| 亚洲av无码一区二区三区在线播放| 无码中文字幕av免费放| 亚洲av乱码中文一区二区三区| 亚洲国产精品尤物yw在线| 日本免费久久久久久久网站| 亚洲大片免费观看| 免费看国产一级特黄aa大片| 全黄大全大色全免费大片| 亚洲图片校园春色| 内射无码专区久久亚洲| 无码人妻丰满熟妇区免费| 亚洲久热无码av中文字幕| 久久亚洲中文字幕精品一区四 | 日韩亚洲国产综合久久久| 国产亚洲精品免费视频播放| 亚洲一区二区久久| 亚洲片一区二区三区| xxxxx免费视频| 男人扒开添女人下部免费视频| 亚洲精品高清视频|