Struts中常用的幾種Action

除了基本的Action 之外, Struts 還提供了幾個其他類型的Action ,這些Action 大大豐富了Struts 的功能。下面介紹如下兒個常用的Action 。
• DispatchAction: 能同時完成多個Action 功能的Action 。
• ForwardActon: 該類用來整合Struts 和其他業務邏輯組件,通常只對請求作有效性檢查。
• IncludeAction: 用於引入其他的資源和頁面。
• LookupDispatchAction: DispatchAction 的子類,根據按鈕的key ,控制轉發給action的方法。
• MappingDispatchAction: DispatchAction 的子類,一個action 可映射出多個Action地址。
• SwitchAction: 用於從一個模塊轉換至另一個模塊,如果應用分成多個模塊時,就可以使用SwitchAction 完成模塊之間的切換。

下面對常用的Action 進行介紹。
1 DispatchAction 及其子類
DispatchAction 是僅次於Action,使用最頻繁的Action。用於同一個表單中有兩個提交按鈕時,但提交需要的邏輯處理完全不同的情況。如圖3.28 所示爲登錄頁面。
圖3.28 兩個提交按鈕的表單頁
該頁面包含了兩個提交按鈕,但提交按鈕需要執行的邏輯卻不一樣。最容易想到的
解決方法是,爲每個按鈕增加JavaScipt腳本,提交兩個按鈕時候分別提交給不同的Action處理。這是最容易想到,也最麻煩的方式。

Struts 提供了DispatchAction,可支持多個邏輯處理。對於上面的示例,表單需要兩個邏輯處理:增加和修改。下面是示例所使用的Action 類的源代碼:

public class LoginAction extends DispatchAction

{

  //***第一個處理邏輯
public ActionForward add(ActionMapping mapping , ActionForm form ,
HttpServletRequest request , HttpServletResponse response)

throws Exception
System.out.pritln( "增加") ;
request. setAt tribute ("method" , "增加") ;
return mapping.findForward("success");

 //*****第二個處理邏輯
public ActionForward modify(ActionMapping 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.LoginAction  name="1og inForm"
       scope="request" validate="true" input="/login.jsp" parameter="method">
    <forward name="success" path="/welcome.jsp"/>
</action>

在該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"><bean:message key="pass"/></th>
<td align="left"><html:text property="pass" size="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"/>'/>
</td>
</tr>

</table>

</html:form>

從上面的代碼中可以看到,頁面中增加了method 的隱藏域,該隱藏域的默認值爲add,當單擊頁面中的【修改】按鈕時,該隱藏域的值將變成modify,單擊【添加】按鈕時,該隱藏域的值變成add。這個隱藏域就是額外傳遞的參數值,用於告訴Dispatch調用哪個方法來處理請求。

如果method 參數的值爲add,將調用add 方法;如果method 參數的值爲modify,則調用modify 方法。因此在單擊不同按鈕時,DispatchAction將可自動調用對應的方法來完成處理。

2 使用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 映射,而其他部分沒有區別。

3使用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>
</td>

代碼中兩個提交按鈕分別增加了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 對象,

並在該對象內保存了按鈕標題與方法之間的對應。
4使用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指向的資源。

5使用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 定義的資源導入該頁面。

6使用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>
</Inilt-param>
<!一指定Struts 的第二個配置文件,作爲wawa 模塊配置一〉
<lnlt-param>
<param-name>config/wawa</param-name>
<param-value>/WEB-INF/struts-configl.xml</param-value>
</Init-param>
<load-on-startup>2</load-on-startup>
</servlet>

該應用包括了一個wawa 的模塊,並在struts-config1.xml 文件中配置一個action,該action 的配置代碼如下:
<action-mappings>
<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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章