在Struts2中,Action處理完用戶請求后,將會返回一個字符串對象,這個字符串對象就是一個邏輯視圖名。Struts 2通過配置邏輯視圖名和物理視圖之間的映射關系,一旦系統收到Action返回的某個邏輯視圖名,系統就會把相應的物理視圖呈現給瀏覽者。
Struts 2的結果類型決定了Action處理結束后,下一步將會調用那種視圖資源來呈現處理結果。默認是dispatcher,該結果類型指定使用JSP作為視圖資源。但是我們會有這樣的要求:要求從一個Action轉到另一個Action中去。
從一個Action直接跳到另一個Action中,Struts提供了兩種結果類型可以實現:chain、redirect。
我們從Servlet中學到重定向是不能保留參數的,也就是說重定向了,request對象就會無效了。同樣redirect就像Servlet中的重定向,它也不能夠保留request對象保存的參數。但是chain可以。所以兩種的區別就在於chain能夠保留request對象,而redirect不可以。
struts.xml的配置
<package name="mystruts1" extends="struts-default" namespace="/mystruts1"> <!-- 第一個Action --> <action name="test_*" class="com.action.TestAction" method="{1}"> <result name="text_chain" type="chain">result_resultChain</result> <result name="text_redirect" type="redirect">result_resultRedirect</result> </action> <!-- 第二個Action --> <action name="result_*" class="com.action.ResultAction" method="{1}"></action> </package>
action1:
public class TestAction { public String testChain(){ HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); request.setAttribute("param", "我是chain結果類型..."); return "text_chain"; } public String testRedirect(){ HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); request.setAttribute("param", "我是redirect結果類型..."); return "text_redirect"; } }
action2:
public class ResultAction { public String resultChain(){ HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); System.out.println(request.getAttribute("param")); return null; } public String resultRedirect(){ HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); System.out.println(request.getAttribute("param")); return null; } }
所以:
1. 需要保存前一個action的屬性信息時使用,保存住action1的request對象:
- <result type= "chain " name="a2">action2</result>
2. 不保存前一個action的參數可以用這種方法:
- <result type= "redirectAction "> action2</result>