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

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

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

    內(nèi)蒙古java團(tuán)隊

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

    Struts中常用的幾種Action

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

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

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

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

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

    性檢查。

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

    ? LookupDispatchAction: DispatchAction 的子類,根據(jù)按鈕的key ,控制轉(zhuǎn)發(fā)給action

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

    地址。

    ? SwitchAction: 用于從一個模塊轉(zhuǎn)換至另一個模塊,如果應(yīng)用分成多個模塊時,


    ?

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

    下面對常用的Action 進(jìn)行介紹。

    3.11.1 DispatchAction 及其子類

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

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

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

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

    解決方法是,為每個按鈕增加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


    ?

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

    的替代,用于完成業(yè)務(wù)邏輯的處理。

    問題的關(guān)鍵是: Struts 如何區(qū)別不同表單提交與方法之間的對應(yīng)關(guān)系?因為當(dāng)使用

    DispatchAction 要求表單提交時,會額外多傳遞一個參數(shù),該參數(shù)用于區(qū)分到底調(diào)用

    Action 中的哪個方法。

    這個參數(shù)名在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屬性,該屬性用于指定參數(shù)名,即Struts 將

    根據(jù)該參數(shù)的值調(diào)用對應(yīng)的方法。為了讓請求增加method 的參數(shù),對上面的JSP 頁面代

    碼進(jìn)行簡單修改,可在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 的隱藏域,該隱藏域的默認(rèn)值為

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

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

    調(diào)用哪個方法來處理請求。

    如果method 參數(shù)的值為add,將調(diào)用add 方法;如果method 參數(shù)的值為modify,

    則調(diào)用modify 方法。因此在單擊不同按鈕時,DispatchAction將可自動調(diào)用對應(yīng)的方法

    來完成處理。

    1. 使用MappingDispatchAction

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


    ?

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

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

    處理完全一樣。

    下面是本示例所使用的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 沒有太大的區(qū)別,僅僅改變它的父類:

    MappingDispatchAction,但變化在于該Action 的配置,看下面關(guān)于該Action 的配置代碼:

    <1- 配置第一個Action. 實現(xiàn)類是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. 實現(xiàn)類是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 處理類,只是調(diào)用的方法不同,同

    樣也可達(dá)到上面的效果。當(dāng)然也需要為頁面中的兩個按鈕增加相應(yīng)的JavaScript腳本,當(dāng)

    單擊不同按鈕時,表單可提交到不同的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 并沒有帶來太大的優(yōu)勢,系統(tǒng)完全可以書寫兩個

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

    2. f吏用LookupDispatchAction

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

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

    腳本。

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

    例按鈕部分的源代碼:

    <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作為參數(shù),看下面的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 也根據(jù)method 參數(shù)來區(qū)分請求分別調(diào)用哪個方法,此

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

    避免書寫JavaScript腳本。

    因此可通過重寫getKeyMethodMap方法完成按鈕與Action 中方法的關(guān)聯(lián),下面是

    該Action 的源代碼:

    public class LoginAction extends LookupDispatchAction

    {

    II 用于關(guān)聯(lián)按鈕和方法

    protected Map getKeyMethodMap()

    Map map = new HashMap();

    II如果按鈕標(biāo)題的key 為button.add. 則提交該按鈕時對應(yīng)add 方法

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

    II如果按鈕標(biāo)題的key 為button.modify. 則提交該按鈕時對應(yīng)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 對象,

    并在該對象內(nèi)保存了按鈕標(biāo)題與方法之間的對應(yīng)。

    3.11.2 使用ForwardAction

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

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

    使用ForwardAction可以完成請求的轉(zhuǎn)發(fā),當(dāng)控制器調(diào)用ForwardAction的performO

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

    ForwardAction的例子:

    <actlon-mapplngs>

    <action path="/welcome"

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

    parameter="/welcome.jsp"/>

    </action-mappings>

    該action 僅僅完成轉(zhuǎn)發(fā),并沒有執(zhí)行其他的額外動作。

    頁面控制轉(zhuǎn)發(fā)的代碼如下:

    <a href="welcome.do">轉(zhuǎn)入</a>

    當(dāng)單擊轉(zhuǎn)入超級鏈接時,將可以轉(zhuǎn)向ForwardAction中parameter指向的資源。

    3.11.3 使用IncludeAction

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

    跳轉(zhuǎn)到action 定義的資源,而IncludeAction用于引入該action 對應(yīng)的資源。

    下面是IncludeAction定義的源代碼:

    <actio口-mapplngs>

    <action path="/welcome"

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

    parameter="/welcome.jsp"/>

    </action-mappings>


    ?

    該action 用于經(jīng)welcome.jsp 作為資源導(dǎo)入。

    頁面中負(fù)責(zé)加載該action 所導(dǎo)入資源的代碼如下:

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

    上面的代碼將會把welcome action 定義的資源導(dǎo)入該頁面。

    3.11.4 使用SwitchAction

    SwitchAction 主要用于模塊之間的切換。當(dāng)一個應(yīng)用之中存在多個模塊時,使用

    SwitchAction在不同模塊之間的action 之間切換還是相當(dāng)方便的。

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

    塊加載,該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>

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

    action 的配置代碼如下:

    <action-mapp工ngs>

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

    </action-mappings>

    該action 的定義非常簡單,僅完成頁面的轉(zhuǎn)向。如果現(xiàn)在需要從應(yīng)用的頁面請求該

    action,可以使用如下SwitchAction。

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

    的定義代碼:

    <action-mappings>

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

    </action-mappings>

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

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

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品亚洲av色欲三区| 亚洲国产婷婷六月丁香| 久久久久免费精品国产| 亚洲6080yy久久无码产自国产| 亚洲视频2020| 曰批视频免费30分钟成人| 成人福利在线观看免费视频| 亚洲熟女精品中文字幕| 亚洲色av性色在线观无码| 国产亚洲精品自在久久| 亚洲精品成人区在线观看| 国产色爽免费视频| 特级淫片国产免费高清视频| 青娱乐免费视频在线观看| 亚洲高清视频免费| 久久国产色AV免费看| 中文字幕不卡免费视频| 亚洲中文字幕AV在天堂| 五月婷婷亚洲综合| 国产一区二区三区在线免费| 久久国产免费福利永久| 亚洲第一福利网站| 亚洲国产精品尤物YW在线观看| 97在线免费视频| 免费人成大片在线观看播放电影 | 亚洲高清在线观看| 亚洲精品NV久久久久久久久久| 亚洲免费综合色在线视频| 日韩免费人妻AV无码专区蜜桃| 无遮挡a级毛片免费看| 亚洲精品无码久久久久秋霞| 亚洲精品偷拍无码不卡av| 成人影片麻豆国产影片免费观看 | 在线播放免费人成视频在线观看| 最近中文字幕大全中文字幕免费| 福利免费在线观看| 成年网站免费入口在线观看| 国产成人综合亚洲一区| 朝桐光亚洲专区在线中文字幕| 亚洲精品美女在线观看播放| 亚洲午夜免费视频|