深度解析struts2結果型別之chain
前一段時間,有關chain的機制著實困繞了許久.儘管網上有許多關於chain的解說,但要不是隻談大理論,不結合例項;要不就是隻有示例,沒有挖出示例背後的意義.
先解釋下chain吧:
Chain:基本用途是構造成一條動作鏈。前一個動作將控制權轉交給後一個動作,而前一個動作的狀態在後一個動作裡仍然保持著。動作鏈由Chaining攔截器負責處理,因為這個攔截器是defaultStack攔截器棧的一份子,多以你隨時都可以使用動作鏈。
有人說:chain是共享valuestack;也有人說chain是共享表單引數.就我個人而言,以上兩種說法都不見完全正確.
先看一個chain的例子:
struts.xml:
[html] view plaincopyprint?- <packagename="default"extends="struts-default">
- <actionname="action1"class="web.action.Action1">
- <resulttype="chain">action2</result>
- </action>
-
<
- <interceptor-refname="defaultStack"></interceptor-ref>
- <result>/result2.jsp</result>
- </action>
- </package>
Action1.java
[java] view plaincopyprint?-
public
- private String str1;
- private String str2;
- public String execute() throws Exception {
- return SUCCESS;
- }
- public String getStr1() {
- return str1;
- }
- publicvoid setStr1(String str1) {
- this.str1 = str1;
- }
- public String getStr2() {
- return str2;
- }
- publicvoid setStr2(String str2) {
- this.str2 = str2;
- }
- }
Action2.java
- publicclass Action2 extends ActionSupport {
- private String str1;
- private String str2;
- public String execute() throws Exception {
- return SUCCESS;
- }
- public String getStr1() {
- return str1;
- }
- publicvoid setStr1(String str1) {
- this.str1 = str1;
- }
- public String getStr2() {
- return str2;
- }
- publicvoid setStr2(String str2) {
- this.str2 = str2;
- }
- }
接著再上jsp檔案:
result1.jsp
[html] view plaincopyprint?- <formaction="action1.action"method="post">
- str1:<inputtype="text"name="str1"><br/>
- str2:<inputtype="text"name="str2"><br/>
- <inputtype="submit">
- </form>
result2.jsp
- <s:debug/>
- str1:${str1 }
- <br/>
- str2:${str2 }
其實整個流程如下圖所示:
執行結果也很簡單,沒有懸念:
在result1.jsp輸入:str1=111,str2=222
在result2.jsp顯示:str1=111,str2=222
下面進入探討階段:
首先修改下action1.java,在action1中,修改valuestack中的str1的,如下所示:
[java] view plaincopyprint?- publicclass Action1 extends ActionSupport {
- private String str1;
- private String str2;
- public String execute() throws Exception {
- str1="set in action1";
- return SUCCESS;
- }
- //省掉get,set
- }
再次來執行.
在result1.jsp輸入:str1=111,str2=222
在result2.jsp顯示:str1=111,str2=222
結果很奇怪?為什麼在result2.jsp不是顯示str1=set in action1? 難道action1.java中修改過後的str1的值沒有寫入valuestack
那我們看看result2.jsp中通過<s:debug/>打印出來的資訊.
從debug資訊可