在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的配置
1 <package name="mystruts1" extends="struts-default" namespace="/mystruts1"> 2 <!-- 第一個Action --> 3 <action name="test_*" class="com.action.TestAction" method="{1}"> 4 <result name="text_chain" type="chain">result_resultChain</result> 5 <result name="text_redirect" type="redirect">result_resultRedirect</result> 6 </action> 7 8 <!-- 第二個Action --> 9 <action name="result_*" class="com.action.ResultAction" method="{1}"></action> 10 </package>
Action1:
1 public class TestAction { 2 public String testChain(){ 3 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); 4 request.setAttribute("param", "我是chain結果類型..."); 5 return "text_chain"; 6 } 7 8 public String testRedirect(){ 9 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); 10 request.setAttribute("param", "我是redirect結果類型..."); 11 return "text_redirect"; 12 } 13 }
Action2:
1 public class ResultAction { 2 3 public String resultChain(){ 4 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); 5 System.out.println(request.getAttribute("param")); 6 return null; 7 } 8 9 10 public String resultRedirect(){ 11 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); 12 System.out.println(request.getAttribute("param")); 13 return null; 14 } 15 }
部署項目后,當在瀏覽器中輸入:http://localhost:8080/struts2_01/mystruts1/result_resultRedirect.action。結果如下

得到為null。由此可見Redirect並不能獲取request對象保存的參數。
當輸入http://localhost:8080/struts2_01/mystruts1/result_testChain.action,得到如下結果:

得到了正確的結果,所有chain可以獲得Request對象保存的參數。
所以:
1. 需要保存前一個action的屬性信息時使用,保存住action1的request對象:
1 <result type= "chain " name="a2">action2</result>
2. 不保存前一個action的參數可以用這種方法:
1 <result type= "redirectAction "> action2</result>
