內蒙古java團隊

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

          Struts中常用的幾種Action

          Posted on 2011-03-30 09:55 帥子 閱讀(474) 評論(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


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


          網站導航:
           
          主站蜘蛛池模板: 东阿县| 桃园市| 惠水县| 贡觉县| 汕尾市| 循化| 剑河县| 乌拉特后旗| 鹤山市| 梁河县| 康乐县| 东方市| 汝阳县| 红桥区| 额敏县| 沙洋县| 康乐县| 郓城县| 金阳县| 永定县| 博乐市| 桐城市| 黎平县| 吉木萨尔县| 涪陵区| 金塔县| 湖北省| 江门市| 房山区| 方正县| 新化县| 道孚县| 衡阳县| 望城县| 孟州市| 洪泽县| 秦安县| 靖边县| 平度市| 全南县| 疏勒县|