1. 程式人生 > >深度解析struts2結果型別之chain

深度解析struts2結果型別之chain

   前一段時間,有關chain的機制著實困繞了許久.儘管網上有許多關於chain的解說,但要不是隻談大理論,不結合例項;要不就是隻有示例,沒有挖出示例背後的意義.

    先解釋下chain吧:

  Chain:基本用途是構造成一條動作鏈。前一個動作將控制權轉交給後一個動作,而前一個動作的狀態在後一個動作裡仍然保持著。動作鏈由Chaining攔截器負責處理,因為這個攔截器是defaultStack攔截器棧的一份子,多以你隨時都可以使用動作鏈。

      有人說:chain是共享valuestack;也有人說chain是共享表單引數.就我個人而言,以上兩種說法都不見完全正確.

      先看一個chain的例子:

  struts.xml:

[html] view plaincopyprint?
  1. <packagename="default"extends="struts-default">
  2.        <actionname="action1"class="web.action.Action1">
  3.            <resulttype="chain">action2</result>
  4.        </action>
  5.          <
    actionname="action2"class="web.action.Action2">
  6.          <interceptor-refname="defaultStack"></interceptor-ref>
  7.            <result>/result2.jsp</result>
  8.        </action>
  9.     </package>

   Action1.java

[java] view plaincopyprint?
  1. public
    class Action1 extends ActionSupport {  
  2.     private String str1;  
  3.     private String str2;  
  4.      public String execute() throws Exception {  
  5.         return SUCCESS;  
  6.     }  
  7.     public String getStr1() {  
  8.         return str1;  
  9.     }  
  10.     publicvoid setStr1(String str1) {  
  11.         this.str1 = str1;  
  12.     }  
  13.     public String getStr2() {  
  14.         return str2;  
  15.     }  
  16.     publicvoid setStr2(String str2) {  
  17.         this.str2 = str2;  
  18.     }  
  19. }  


Action2.java

[java] view plaincopyprint?
  1. publicclass Action2 extends ActionSupport {  
  2.     private String str1;  
  3.     private String str2;  
  4.      public String execute() throws Exception {  
  5.         return SUCCESS;  
  6.     }  
  7.     public String getStr1() {  
  8.         return str1;  
  9.     }  
  10.     publicvoid setStr1(String str1) {  
  11.         this.str1 = str1;  
  12.     }  
  13.     public String getStr2() {  
  14.         return str2;  
  15.     }  
  16.     publicvoid setStr2(String str2) {  
  17.         this.str2 = str2;  
  18.     }  
  19. }  

接著再上jsp檔案:

result1.jsp

[html] view plaincopyprint?
  1. <formaction="action1.action"method="post">
  2.       str1:<inputtype="text"name="str1"><br/>
  3.       str2:<inputtype="text"name="str2"><br/>
  4.       <inputtype="submit">
  5. </form>


 result2.jsp

[html] view plaincopyprint?
  1. <s:debug/>
  2. str1:${str1 }  
  3. <br/>
  4. str2:${str2 }  


其實整個流程如下圖所示:

執行結果也很簡單,沒有懸念:

  在result1.jsp輸入:str1=111,str2=222

       在result2.jsp顯示:str1=111,str2=222

下面進入探討階段:

  首先修改下action1.java,在action1中,修改valuestack中的str1的,如下所示:

[java] view plaincopyprint?
  1. publicclass Action1 extends ActionSupport {  
  2.     private String str1;  
  3.     private String str2;  
  4.      public String execute() throws Exception {  
  5.         str1="set in action1";                
  6.         return SUCCESS;  
  7.     }  
  8. //省掉get,set
  9. }  

再次來執行.
  在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資訊可