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

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

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

    內蒙古java團隊

    j2se,j2ee開發組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Struts中常用的幾種Action

    Posted on 2011-03-30 09:55 帥子 閱讀(473) 評論(0)  編輯  收藏

    除了基本的Action 之外, Struts 還提供了幾個其他類型的Action ,這些Action 大大

    豐富了Struts 的功能。下面介紹如下兒個常用的Action 。

    ? DispatchAction: 能同時完成多個Action 功能的Action 。

    ? ForwardActon: 該類用來整合Struts 和其他業務邏輯組件,通常只對請求作有效

    性檢查。

    ? IncludeAction: 用于引入其他的資源和頁面。

    ? LookupDispatchAction: DispatchAction 的子類,根據按鈕的key ,控制轉發給action

    的方法。
    ? MappingDispatchAction: DispatchAction 的子類,一個action 可映射出多個Action

    地址。

    ? SwitchAction: 用于從一個模塊轉換至另一個模塊,如果應用分成多個模塊時,


    ?

    就可以使用SwitchAction 完成模塊之間的切換。

    下面對常用的Action 進行介紹。

    3.11.1 DispatchAction 及其子類

    DispatchAction 是僅次于Action,使用最頻繁的Action。用于同一個表單中有兩個提

    交按鈕時,但提交需要的邏輯處理完全不同的情況。如圖3.28 所示為登錄頁面。

    圖3.28 兩個提交按鈕的表單頁

    該頁面包含了兩個提交按鈕,但提交按鈕需要執行的邏輯卻不一樣。最容易想到的

    解決方法是,為每個按鈕增加JavaScipt腳本,提交兩個按鈕時候分別提交給不同的Action

    處理。這是最容易想到,也最麻煩的方式。

    Struts 提供了DispatchAction,可支持多個邏輯處理。對于上面的示例,表單需要兩

    個邏輯處理:增加和修改。下面是示例所使用的Action 類的源代碼:

    public class LoginAction extends DispatchAction

    {

    II 第一個處理邏輯
    public ActionForward add(ActionMapp工ng mapping , ActionForm form ,

    HttpServletRequest request , HttpServletResponse response)

    throws Exception

    System.out.pr工丑tln( "增加") ;

    request. setAt tribute ("method" , "增加") ;

    return mapping.findForward("success");

    II第二個處理邏輯

    public ActionForward modify(Act工o nMapping mapping , ActionForm form ,

    HttpServletRequest request , HttpServletResponse response)

    throws Exception

    System.out.println(" 修改n) ;

    request. setAttribute ("method回"修改") ;

    return mapping.findForward("success"};

    上面的Action 非常簡單,其兩個邏輯處理也非常簡單。該Action 并沒有重寫execute

    方法,而是書寫了兩個自定義的方法:add 和modi句。這兩個方法除了方法名與execute


    ?

    方法不同之外,其他的參數列表及異常的處理完全相同。這兩個方法正是execute 方法

    的替代,用于完成業務邏輯的處理。

    問題的關鍵是: Struts 如何區別不同表單提交與方法之間的對應關系?因為當使用

    DispatchAction 要求表單提交時,會額外多傳遞一個參數,該參數用于區分到底調用

    Action 中的哪個方法。

    這個參數名在struts-config.xml 文件中指定。注意下面action 的配置代碼:

    <action path="/login" type="lee.LoginAct工on ll name="1og inForm"

    scope="request" validate="true" input="/logi口.jsp" parameter="method">

    <forward name="success" path="/welcome.jsp"/>

    <fact工on>

    在該action 的配置中,增加了parameter屬性,該屬性用于指定參數名,即Struts 將

    根據該參數的值調用對應的方法。為了讓請求增加method 的參數,對上面的JSP 頁面代

    碼進行簡單修改,可在JSP 頁面中增加一個隱藏域,使該隱藏域的名字為method。下面

    是JSP 頁面的表單代碼:

    <html:form action="login.do">

    <table border="O" width="100革">

    <tr>

    <th align="left"><bean:message key="username"/></th>

    <td align="left"><html:text property="username" size="15"/></td>

    </tr>

    <tr>

    <th align="left"><bea口:message key="pass"/></th>

    <td align="left"><html:text property="pass" s 工ze="15"/></td>

    </tr>

    <tr>

    <td>

    <input type="hidden" name="method" value="add"/>

    <input type="submit" value='<bean:message key="button.add"/> onClick="

    method.value='add'''/>

    <input type="submit" value='<bean:message key="button.modify"/>'

    onClick="method.value='modify'''/>

    <input type="reset" value='<bean:message key="button.reset"/>'/>

    <ltd>

    </tr>

    </table>

    </html:form>

    從上面的代碼中可以看到,頁面中增加了method 的隱藏域,該隱藏域的默認值為

    add,當單擊頁面中的【修改】按鈕時,該隱藏域的值將變成modify,單擊【添加】按

    鈕時,該隱藏域的值變成add。這個隱藏域就是額外傳遞的參數值,用于告訴Dispatch

    調用哪個方法來處理請求。

    如果method 參數的值為add,將調用add 方法;如果method 參數的值為modify,

    則調用modify 方法。因此在單擊不同按鈕時,DispatchAction將可自動調用對應的方法

    來完成處理。

    1. 使用MappingDispatchAction

    MappingDispatchAction可將同一個Action 的不同方法映射成多個Action URI ,這種


    ?

    Action 的寫法與DispatchAction 非常相似,同樣不需要重寫execute 方法,而是將書寫多

    個自定義的方法。這些方法除了方法名與execute 方法不同外,其他的參數列表及異常

    處理完全一樣。

    下面是本示例所使用的Action 的源代碼:

    public class LoginAct工on extends MappingDispatchAction

    II 第一個處理邏輯

    public ActionForward add(ActionMapping mapping , ActionForm form ,

    HttpServletRequest request , HttpServletResponse respo口se)

    throws Exception

    System.out.println("增加") ;

    request.setAttribute( 咱ethod" , "增加") ;

    return mapping.f工口dForward("success");

    }

    II 第二個處理邏輯

    public ActionForward modify(ActionMapping mapping , ActionForm form ,

    HttpServletRequest request , HttpServletResponse response)

    throws Exception

    System.out.println("修改") ;

    request.setAttribute( 叮nethod" "修改") ;

    return mapping.findForward("success");

    該Action 與前面的DispatchAction 沒有太大的區別,僅僅改變它的父類:

    MappingDispatchAction,但變化在于該Action 的配置,看下面關于該Action 的配置代碼:

    <1- 配置第一個Action. 實現類是lee.LoginAction , parameter 為add-->

    <action path="/add" type="lee.LoginAction" name="loginForm"

    scope="request" val 工date="true" input="logi口.jsp" parameter="add">

    <forward name="success" path="/welcome.jsp"l>

    </action>

    <! 配置第二個Action. 實現類是lee.LoginAction , parameter 為modify-->

    <action path="/modify" type="lee.LoginAction" 口ame="log工口Formll

    scope工"request" validate="true" input="login.jsp陰parameter="modify">

    <forward 口ame="success" path="/welcome.jsp"l>

    </action>

    在這種情況下,兩個action 使用的是同一個Action 處理類,只是調用的方法不同,同

    樣也可達到上面的效果。當然也需要為頁面中的兩個按鈕增加相應的JavaScript腳本,當

    單擊不同按鈕時,表單可提交到不同的action,下面是JSP 頁面三個按鈕的源代碼:

    <td>

    <input type="submit" value='<bean:message key="button.add"/>'

    onClick="document.loginForm.action='add.do'''/>

    <input type="submit" value='<bea口:message key="button.modify"I>'

    onClick="document.loginForm.action='modify.do'''I>

    <input type="reset" value='<bean:message key="button.reset"I>'I>

    <ltd>

    其中,前面兩個提交按鈕都增加了onClick 方法,即單擊該按鈕時,會改變表單的提

    交地址。


    ?

    注意:使用MappingDispatchAction 并沒有帶來太大的優勢,系統完全可以書寫兩個

    Action ,分別定義兩個不同的action 映射,而其他部分沒有區別。

    2. f吏用LookupDispatchAction

    LookupDispatchAction也是DispatchAction 的一種,但它的處理更加簡單。該Action

    也可包含多個處理方法,它可讓處理方法與按鈕直接關聯,無須使用任何的JavaScript

    腳本。

    使用LookupDispatchAction時,提交按鈕必須使用Struts 的html 標簽,下面是該示

    例按鈕部分的源代碼:

    <td>

    <html:submit property="method">

    <bean:message key="button.add"l>

    </html:submit>

    <html:submit property="method">

    <bean:message key="button.modify"l>

    </html:submit>

    <input type="reset" value='<bean:message key="button.reset"I>'I>

    <ltd>

    代碼中兩個提交按鈕分別增加了property 屬性,該屬性的值為method。而在action

    的配置中,也使用parameter作為參數,看下面的action 配置代碼:

    <action path="/login" type="lee.LoginAction" name="loginForm"

    scope="request" validate="true" input="/login.jsp" parameter="method">

    <forward name="success" path="/welcome.jsp"l>

    </action>

    這段配置代碼表明:該action 也根據method 參數來區分請求分別調用哪個方法,此

    時無須使用method 的隱藏域,而是將按鈕的property 設為method。通過這種方式可以

    避免書寫JavaScript腳本。

    因此可通過重寫getKeyMethodMap方法完成按鈕與Action 中方法的關聯,下面是

    該Action 的源代碼:

    public class LoginAction extends LookupDispatchAction

    {

    II 用于關聯按鈕和方法

    protected Map getKeyMethodMap()

    Map map = new HashMap();

    II如果按鈕標題的key 為button.add. 則提交該按鈕時對應add 方法

    map .put ("button. add" , "add");

    II如果按鈕標題的key 為button.modify. 則提交該按鈕時對應modify 方法

    map.put ("button.modify" , "mod工fy") ;

    return map;

    }

    II 第一個處理邏輯

    public ActionForward add(ActionMapping mapping, ActionForm form ,

    HttpServletRequest request , HttpServletResponse response)

    throws Exception

    System.out.println(" 增加II) i

    request.setAttribute("method" , "增加") ;

    return mapp工ng.f工ndForward(" success") ;

    }

    第二個處理邏輯

    public ActionForward modify(ActionMapping mapping , ActionForm form ,

    HttpServletRequest request , HttpServletResponse response)

    throws Exception

    System.out.println("修改II) ;

    request.setAttribute( 咱ethod II II 修改II) ;

    return mapping.findForward("success");

    LookupDispatchAction必須重寫getKeyMethodMap方法,該方法返回一個Map 對象,

    并在該對象內保存了按鈕標題與方法之間的對應。

    3.11.2 使用ForwardAction

    如果需要從一個頁面或資源轉換到另一個資源時,直接使用頁面或資源路徑的超級

    鏈接定位并不是好的做法,這使得控制器沒有機會處理相關的請求事直。

    使用ForwardAction可以完成請求的轉發,當控制器調用ForwardAction的performO

    方法時,它會使用屬性parameter 所設定的路徑進行forward 的動作。下面是一個設定

    ForwardAction的例子:

    <actlon-mapplngs>

    <action path="/welcome"

    type="org.apache.struts.actions.ForwardAction"

    parameter="/welcome.jsp"/>

    </action-mappings>

    該action 僅僅完成轉發,并沒有執行其他的額外動作。

    頁面控制轉發的代碼如下:

    <a href="welcome.do">轉入</a>

    當單擊轉入超級鏈接時,將可以轉向ForwardAction中parameter指向的資源。

    3.11.3 使用IncludeAction

    IncludeAction的用法與ForwardAction的用法比較相似,區別在于ForwardAction將

    跳轉到action 定義的資源,而IncludeAction用于引入該action 對應的資源。

    下面是IncludeAction定義的源代碼:

    <actio口-mapplngs>

    <action path="/welcome"

    type="org.apache. struts.actions. IncludeAction"

    parameter="/welcome.jsp"/>

    </action-mappings>


    ?

    該action 用于經welcome.jsp 作為資源導入。

    頁面中負責加載該action 所導入資源的代碼如下:

    <jsp:include page="welcome.do"/><br>

    上面的代碼將會把welcome action 定義的資源導入該頁面。

    3.11.4 使用SwitchAction

    SwitchAction 主要用于模塊之間的切換。當一個應用之中存在多個模塊時,使用

    SwitchAction在不同模塊之間的action 之間切換還是相當方便的。

    在下面的web.xml 中,力日載了Struts 的兩個配置文件,其中一個作為系統的一個模

    塊加載,該web.xml 的配置代碼如下:

    <servlet>

    <! 定義Struts 的核心控制器-->

    <servlet-name>action</servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <'一指定Struts 的第一個配置文件-->

    <lnlt-param>

    <param-name>config</param-name>

    <param-value>/WEB-INF/struts-con工fg.xml</param-value>

    </工口lt-param>

    <!一指定Struts 的第二個配置文件,作為wawa 模塊配置一〉

    <lnlt-param>

    <param-name>config/wawa</param-name>

    <param-value>/WEB-INF/struts-configl.xml</param-value>

    </工n 工t-param>

    <load-on-startup>2</load-on-startup>

    </servlet>

    該應用包括了一個wawa 的模塊,并在struts-config1.xml 文件中配置一個action,該

    action 的配置代碼如下:

    <action-mapp工ngs>

    <action path="/welcome" forward="/welcome.jsp"/>

    </action-mappings>

    該action 的定義非常簡單,僅完成頁面的轉向。如果現在需要從應用的頁面請求該

    action,可以使用如下SwitchAction。

    定義SwitchAction也相當簡單,只需要定義path、type 屬性即可。下面是SwitchAction

    的定義代碼:

    <action-mappings>

    <action path="/moduleSwitch" type="org.apache.struts.actions.SwithcActio丑"/>

    </action-mappings>

    在使用SwitchAction 時,必須在請求中帶兩個參數:第一個是prefix,用來指定模

    塊宅稱:另一個是page,用來指定相模塊中的資源路徑。下面是頁面中超級鏈接對wawa

    模塊的welcome action 請求,頁面的超級鏈接代碼如下:

    <a href=咄oduleSwitch.do?prefix=/wawa&page=/welcome.do轉">入另一個模塊</a>

    上面的超級鏈接地址中,/wawa是模塊名,而page對應wawa模塊下的welcome的actiono


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


    網站導航:
     
    主站蜘蛛池模板: 一级毛片a免费播放王色| 无人视频免费观看免费视频| 国产精品免费观看调教网| 亚洲国产成人久久一区WWW| 亚洲av成人中文无码专区| 午夜无遮挡羞羞漫画免费| 亚洲av永久无码精品天堂久久 | 成a人片亚洲日本久久| 日韩精品视频免费在线观看| 国产精品亚洲一区二区三区| 免费A级毛片无码A∨男男| 免费播放国产性色生活片| 亚洲午夜久久久久妓女影院| 成人毛片100免费观看| 无码专区—VA亚洲V天堂| 91在线手机精品免费观看| 亚洲成人午夜电影| 大学生美女毛片免费视频| 国产精品亚洲一区二区无码 | 亚洲av成人一区二区三区| 好爽…又高潮了免费毛片| 男女超爽视频免费播放| 亚洲伊人久久大香线蕉综合图片| 久久久精品午夜免费不卡| 亚洲国产成人va在线观看网址| 啦啦啦在线免费视频| 一区二区三区免费高清视频| 亚洲人成影院在线| 成人毛片免费视频| 国产精品小视频免费无限app| 久久久久亚洲精品美女| 免费的涩涩视频在线播放 | 久久aa毛片免费播放嗯啊| 亚洲一区在线视频观看| 免费萌白酱国产一区二区| A级毛片高清免费视频在线播放| 亚洲国产成人手机在线电影bd| 国产精品色午夜视频免费看| 最近免费mv在线观看动漫| 亚洲偷自精品三十六区| 久久亚洲中文字幕精品一区|