struts1中幾種常用的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。用於同一個表單中有兩個提交按鈕時,但提交需要的邏輯處理完全不同的情況。如登錄頁面。

 兩個提交按鈕的表單頁該頁面包含了兩個提交按鈕,但提交按鈕需要執行的邏輯卻不一樣。最容易想到的解決方法是,爲每個按鈕增加JavaScipt腳本,提交兩個按鈕時候分別提交給不同的Action 處理。這是最容易想到,也最麻煩的方式。
Struts 提供了DispatchAction,可支持多個邏輯處理。對於上面的示例,表單需要兩個邏輯處理:增加和修改。下面是示例所使用的Action 類的源代碼:
public class LoginAction extends DispatchAction
{
II 第一個處理邏輯
public ActionForward add(ActionMapping mapping , ActionForm form ,
HttpServletRequest request , HttpServletResponse response)
throws Exception
System.out.println( "增加") ;
request. setAttribute ("method" , "增加") ;
return mapping.findForward("success");
II第二個處理邏輯
public ActionForward modify(Act工o nMapping mapping , ActionForm form ,
HttpServletRequest request , HttpServletResponse response)
throws Exception
System.out.println(" 修改") ;
request. setAttribute ("method,"修改") ;
return mapping.findForward("success"};
上面的Action 非常簡單,其兩個邏輯處理也非常簡單。該Action 並沒有重寫execute方法,而是書寫了兩個自定義的方法:add 和modify方法。這兩個方法除了方法名與execute 方法不同之外,其他的參數列表及異常的處理完全相同。這兩個方法正是execute 方法的替代,用於完成業務邏輯的處理。
問題的關鍵是: Struts 如何區別不同表單提交與方法之間的對應關係?因爲當使用DispatchAction 要求表單提交時,會額外多傳遞一個參數,該參數用於區分到底調用
Action 中的哪個方法。
這個參數名在struts-config.xml 文件中指定。注意下面action 的配置代碼:
<action path="/login" type="com.***.LoginAction“

name="loginForm" scope="request" validate="true" input="/logig.jsp"

parameter="method"

>
<forward name="success" path="/welcome.jsp"/>
<faction>
在該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"/>'/>
<ltd>
</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
I 第一個處理邏輯
public ActionForward add(ActionMapping mapping , ActionForm form ,
HttpServletRequest request , HttpServletResponse respo口se)
throws Exception
System.out.println("增加") ;
request.setAttribute( method" , "增加") ;
return mapping.findForward("success");
}
II 第二個處理邏輯
public ActionForward modify(ActionMapping mapping , ActionForm form ,
HttpServletRequest request , HttpServletResponse response)
throws Exception
System.out.println("修改") ;
request.setAttribute( "method" ,"修改") ;
return mapping.findForward("success");
該Action 與前面的DispatchAction 沒有太大的區別,僅僅改變它的父類:
MappingDispatchAction,但變化在於該Action 的配置,看下面關於該Action 的配置代碼:


<1- 配置第一個Action. 實現類是com.***.LoginAction , parameter 爲add-->
<action path="/add" type="com.***.LoginAction" name="loginForm"
scope="request" validate="true" input="logig.jsp"

 parameter="add">
<forward name="success" path="/welcome.jsp"l>
</action>
<! 配置第二個Action. 實現類是lee.LoginAction , parameter 爲modify-->
<action path="/modify" type="com.***.LoginAction" name="log工口Formll
scope工"request" validate="true" input="login.jsp

 parameter="modify">
<forward name="success" path="/welcome.jsp">
</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">
onClick="document.loginForm.action='modify.do'''>
<input type="reset" value='<bean:message key="button.reset">>
<ltd>
其中,前面兩個提交按鈕都增加了onClick 方法,即單擊該按鈕時,會改變表單的提交地址。

注意:使用MappingDispatchAction 並沒有帶來太大的優勢,系統完全可以書寫兩個Action ,分別定義兩個不同的action 映射,而其他部分沒有區別。

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