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

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

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

    posts - 11,  comments - 28,  trackbacks - 0

    JpetStore中的Action與普通Struts的Action處理方式不一樣。遍歷JpetStore的src文件夾,并無一個具體的Action,那么它是如何來完成普通Struts的Action工作了?
    查看JpetStore的Struts.xml可以發現,它的Action只有一個,即“org.apache.stuts.beanaction.Beanaction”。通過Eclipse查看beanaction.jar的源代碼,可以發現Beanaction繼承與普通Action,即具備普通的action的功能。那么它無具體Action的奧妙在哪,繼續研究BeanAction的代碼,截取BeanAction的excute方法中核心部分代碼如下:?
    /*遍歷此方法的業務邏輯可知,*的優先級最高,如果是*,則不調用任何方法直接Forward,類似于ForwardAction*/?
    private?static?final?String?NO_METHOD_CALL?=?"*";?
    …….?
    /*所有的FormBean都繼承于BaseBean*/?
    BaseBean?bean?
    =?(BaseBean)?form;?
    ??????ActionContext.initCurrentContext(request,?response);?
    ??????
    if?(bean?!=?null)?{?
    ????????
    //?Explicit?Method?Mapping?
    /*下面是檢查struts.xml配置中是否有parameter屬性*/?
    ????????Method?method?
    =?null;?
    ????????String?methodName?
    =?mapping.getParameter();?
    ????????
    if?(methodName?!=?null?&&?!NO_METHOD_CALL.equals(methodName))?{?
    ??????????
    try?{?
    /*通過反射,根據得到的方法名稱取得方法的句柄*/?
    ????????????method?
    =?bean.getClass().getMethod(methodName,?null);?
    ????????????
    synchronized?(bean)?{?
    /*下面是關鍵一句,調用basebean擁有的接口ActionInterceptor的實現DefaultActionInterceptor,來完成具體方法的調用*/?
    ??????????????forward?
    =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
    ????????????}
    ?
    ?????????……..?
    /*無Parameter屬性,檢查path路徑的最后一個/后的名稱,即為調用的方法名*/?
    ????????
    //?Path?Based?Method?Mapping?
    ????????if?(method?==?null?&&?!NO_METHOD_CALL.equals(methodName))?{?
    ??????????methodName?
    =?mapping.getPath();?
    ??????????
    if?(methodName.length()?>?1)?{?
    ????????????
    int?slash?=?methodName.lastIndexOf("/")?+?1;?
    ????????????methodName?
    =?methodName.substring(slash);?
    ????????????
    if?(methodName.length()?>?0)?{?
    ??????????????
    try?{?
    ????????????????method?
    =?bean.getClass().getMethod(methodName,?null);?
    ????????????????
    synchronized?(bean)?{?
    ??????????????????forward?
    =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
    ????????????????}
    ?
    ?????????????……..?
    /*根據調用方法返回的String,得到頁面的轉移路徑*/?
    return?mapping.findForward(forward);?
    ?
    通過研究上面這段代碼,我們可知,JpetStore中沒有具體Action實現的關鍵原因即在于下面這幾句
    /*通過反射,根據得到的方法名稱取得方法的句柄*/?
    ????????????method?
    =?bean.getClass().getMethod(methodName,?null);?
    ????????????
    synchronized?(bean)?{?
    /*下面是關鍵一句,調用basebean擁有的接口ActionInterceptor的實現DefaultActionInterceptor,來完成具體方法的調用*/?
    ??????????????forward?
    =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
    ????????????}
    ?
    即將原來Action中的excute方法的實現轉移到FormBean中,這樣實現顯得更為簡捷,方便。研究ActionInvoke,它的核心代碼如下:
    public?String?invoke()?{?
    ????
    try?{?
    ??????
    return?(String)?method.invoke(bean,?null);?
    ????}
    ?catch?(Exception?e)?{?
    ??????
    throw?new?BeanActionException("Error?invoking?Action.??Cause:?"?+?e,?e);?
    ????}
    ?
    ??}
    ?
    至此可知,它調用的是formbean中的函數。且從這段代碼可知,formbean的這類特殊函數,此處稱為action方法,要符合兩個特征:1)無參數;2)返回值為string,此返回string即是Struts-config.xml的全局或局部的forward。
    以上是整個beanaction的實現機制。個人感覺此種實現方法對于開發者而言已經類似于ASP.NET的.aspx與.cs開發模式了。下面是通過實例來說明一下BeanAction如何控制formbean的
    ?
    Struts-config.xml的配置里有3種映射方式,來告訴BeanAction把控制轉到哪個form bean對象的哪個方法來處理。
    (1)parameter=”*’直接跳轉;(2)Parameter中含具體的方法名;(3)Path中最后一個/后的方法名
    以這個請求連接為例http://localhost/jpetstore4/shop/viewOrder.shtml
    1. URL Pattern

    ???
    <action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
    ????name
    ="orderBean"?scope="session"
    ????validate
    ="false">
    ????
    <forward?name="success"?path="/order/ViewOrder.jsp"/>
    ??
    </action>

    ?
    此種方式表示,控制將被轉發到"orderBean"這個form bean對象 的"viewOrder"方法(行為)來處理。方法名取"path"參數的以"/"分隔的最后一部分。
    2. Method Parameter?
    <action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
    ????name
    ="orderBean"?parameter="viewOrder"?scope="session"
    ????validate
    ="false">
    ????
    <forward?name="success"?path="/order/ViewOrder.jsp"/>
    ??
    </action>

    ?
    此種方式表示,控制將被轉發到"orderBean"這個form bean對象的"viewOrder"方法(行為)來處理。配置中的"parameter"參數表示form bean類上的方法。"parameter"參數優先于"path"參數。
    3. No Method call
    ?<action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
    ????name
    ="orderBean"?parameter="*"?scope="session"
    ????validate
    ="false">
    ????
    <forward?name="success"?path="/order/ViewOrder.jsp"/>
    ??
    </action>

    此種方式表示,form bean上沒有任何方法被調用。如果存在"name"屬性,則struts把表單參數等數據填充到form bean對象后,把控制轉發到"success"。否則,如果name為空,則直接轉發控制到"success"。
    這就相當于struts內置的org.apache.struts.actions.ForwardAction的功能
    <action?path="/shop/viewOrder"?type="org.apache.struts.actions.ForwardAction"
    ????parameter
    ="/order/ViewOrder.jsp?"?scope="session"?validate="false">
    ?
    </action>
    ?

    ?
    posted on 2007-01-12 16:34 滌生 閱讀(3883) 評論(8)  編輯  收藏


    FeedBack:
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2007-01-12 18:46 | 小武藏
    scope="session"
    不知道為什么要使用session呢?request不行么?
      回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2007-01-13 11:46 | 江南白衣
    好文,滌生的分析方便了一大堆覺得BaseAction非常棒,又懶得去看去理解源碼,沒有理解之前又不敢用它的懶人,比如我:)  回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean[未登錄]
    2007-01-14 22:31 | jooroo
    好文!不知為何beanaction包只是試驗性質的用一用,是否有些什么defect我們不知道?  回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2007-01-15 13:21 | 滌生
    beanaction,這個是否有defect,不清楚了。我只是在學習這個JpetStore,把學習時的疑惑給理清楚。具體的beanaction有什么defect,需要深入的研究、使用才知道。  回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2007-01-15 13:22 | 滌生
    為什么使用Session不使用request,這個應該是由于它的實際需求+統一風格決定的。其實很多地方是可以使用request的  回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2007-01-16 12:54 | 小武藏
    謝謝滌生,我明白了。
      回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2008-01-22 22:27 | 龐宏濤
    我覺得這種方式有性能的損失,struts不是線程安全的,通過這種方式的話必須要求synchronized,也就是在一個時刻只能有一個用戶執行 forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));
    其他的都要排隊等待,在大并發量的系統上肯定不行,這種也只能做做例子什么的。  回復  更多評論
      
    # re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
    2008-01-28 18:03 | it942
    怎么現在JpetStore又用BaseAction了。  回復  更多評論
      

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


    網站導航:
     
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(5)

    隨筆檔案

    UML

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲人成色7777在线观看不卡 | 亚洲AV无码一区二区三区人| 四只虎免费永久观看| 在线观看免费视频资源| av成人免费电影| 色九月亚洲综合网| 亚洲精品一二三区| 亚洲系列中文字幕| 亚洲AV中文无码乱人伦下载 | 亚洲美国产亚洲AV| 亚洲精品日韩中文字幕久久久| 国产亚洲精品无码专区| 四虎成人精品在永久免费| 成年丰满熟妇午夜免费视频| 中文字幕免费在线| 性xxxx视频免费播放直播| 免费看一区二区三区四区| 亚欧国产一级在线免费| 成人午夜免费视频| 黄色三级三级三级免费看| 亚洲AV噜噜一区二区三区| 亚洲日韩一中文字暮| 亚洲午夜无码久久久久小说| 亚洲AV无码一区二区三区人| 亚洲欧洲日产专区| 亚洲国产美女在线观看| 亚洲欧洲日本国产| 91亚洲精品自在在线观看| 亚洲熟妇无码爱v在线观看| 久久久久亚洲AV无码观看| 91丁香亚洲综合社区| 两个人看的www免费高清| 亚洲无人区码一二三码区别图片| 亚洲伊人久久精品| 亚洲国产成人手机在线电影bd| 亚洲性无码av在线| 亚洲综合久久精品无码色欲| 亚洲欧美日韩一区二区三区在线| 亚洲精华液一二三产区| 美女被爆羞羞网站在免费观看| 深夜a级毛片免费无码|