1)基本使用
名稱為“chain”的ResultType,在struts-default.xml里的配置如下:
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
chain是一種特殊的視圖結果,用來將Action執行完之后鏈接到另一個Action中繼續執行,新的Action使用上一個Action的上下文(ActionContext),數據也會被傳遞。
這在實際開發中,也是經常用到的一種ResultType。比如我們在Servlet開發中,一個請求,被一個Servlet處理過后,不是直接產生相應,而是把這個請求傳遞到下一個Servlet繼續處理,直到需要的多個Servlet處理完成后,才生成響應返回。同樣的,在Struts2開發中,也會產生這樣的需要,一個請求被一個Action處理過后,不是立即產生響應,而是傳遞到下一個Action中繼續處理。那么這個時候,就需要使用chain這個ResultType了。
來示例一下,先看看第一個Action,就用HelloWorldAction吧,稍微簡化一下,示例如下:
public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; public String execute() throws Exception { this.businessExecute(); return "toSecond"; } public void businessExecute(){ System.out.println("用戶輸入的參數為==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } //屬性對應的getter/setter方法,省略了 }
第二個Action,示例代碼如下:
public class SecondAction extends ActionSupport { public String execute() throws Exception { System.out.println("現在SecondAction進行處理"); return "toWelcome"; } }
然后到struts.xml中,配置這兩個Action,要注意第一個Action的配置,在配置“toSecond”這個result的時候,用的就是chain這個ResultType,示例如下:
<package name="helloworld" extends="struts-default"> <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction"> <result name="toSecond" type="chain"> <param name="actionName">secondAction</param> </result> <!--下面這樣配置也可以 <result name="toSecond" type="chain">secondAction</result> --> </action> <action name="secondAction" class="cn.javass.action.action.SecondAction"> <result name="toWelcome">/s2impl/welcome.jsp</result> </action> </package>
2)備注
- chain不能在result配置的時候傳遞參數,也就是說,不能類似於如下的配置:
<result name="toSecond" type="chain"> <param name="actionName">secondAction?account=5</param> </result>
這種配置方式是不行的,因為這里要求配置的是要鏈接的Action的name,不能傳遞參數,那么,要傳遞參數怎么辦呢?那就需要在Action里面使用ActionContext或者ServletActionContext了。
- 使用chian的方式,后面的Action會和前面的Action共用同一個ActionContext
- 名稱為“chain”的ResultType在配置的時候,除了前面示例中的actionName外,還有一個參數,名稱為“namespace”,表示被鏈接的Action所在包的命名空間,如果不設置,默認的即是當前的命名空間。配置示例如下:
<result name="toSecond" type="chain"> <param name="actionName">secondAction</param> <param name="namespace">其他Package的namespace</param> </result>