struts:從一個action中跳轉到另一個action

平時在action中利用service處理完業務後,直接通過
return mapping.findForward("myVIew");
這樣的方法跳轉到頁面。

現在遇到了這樣一種情形,即在action中service完工後,不需要跳轉到頁面,而是把當前的結果直接傳給另外一個action處理(注:該action是現成的),按上面的做法,是無法傳值到下一個action的,搜索了下,可以通過request/session傳值,不過簡單點可以如下處理:


1.Boolean teamUser = true;     
2.Boolean doEdit = false;     
3.                
4.return new ActionForward("/myaction.do?userid="+userid + "&teamUser="+teamUser + "&doEdit="+doEdit); 


另外幾個我看到的解決方法:

第一種方法:把配置文件contextRelative 屬性設爲true ,這樣使用相對於context的路徑來進行 forward 查找
<action-mappings>
<action ... >
<forward name="success" contextRelative="true"
path="/moduleB/index.do" redirect="true"/>
</action>
另一切換模塊的方法就是使用SwitchAction,它需要在請求中帶兩個參數,一個是prefix,用來指定模塊前綴名稱,一個是page,用來指定相對於模塊的資源路徑,例如可以這麼設定:
<!--struts配置文件-->
<action
path="/toModule"
type="org.apache.struts.actions.SwitchAction">
</action>

<!--action-->
return new ActionForward("/toModule.do?prefix=/syscollection/chgbiz/chgperson&page=/showChgpersonDoListAC.do");

另一個:
例如從你的LOGIN到register.action 
<package  name="struts" extends="struts-default"> 
          <action name="login" class="com.ebizprise.commons.acl.web.action.LoginAction"> 
              <result name="success" type="redirect">register.action </result> 
              <result name="error">/index.jsp  </result> 
          </action> 
         

      </package> 
記得一定要加這個type="redirect"



<package  name="struts" extends="struts-default"> 
          <action name="login" class="com.ebizprise.commons.acl.web.action.LoginAction"> 
              <result name="success" type="chain" >action 名稱 </result> 
              <result name="error">/index.jsp </result> 
          </action>  
</package> 

下面是我查看的一個較全的struts架構的跳轉說明

1. 完整的action

<action path="/aFullAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>

首先,Struts的ActionServlet接收到一個請求,然後根據struts-config.xml的配置定位到相應的mapping(映射);接下來如果form的範圍是request或者在定義的範圍中找不到這個form,創建一個新的form實例;取得form實例以後,調用其reset ()方法,然後將表單中的參數放入form,如果validate屬性不爲false,調用validate()方法;如果validate()返回非空的ActionErrors,將會被轉到input屬性指定的URI,如果返回空的ActionErrors,那麼執行Action的execute() 方法,根據返回的ActionForward確定目標URI。

這樣做的效果是:execute()僅當validate()成功以後才執行;input屬性指定的是一個URI。

2. 僅有Form的action

<action path="/aFormOnlyAction"
type="org.apache.struts.actions.ForwardAction"
name="someForm"
input="someJSP.jsp"
parameter="someOtherJSP.jsp"
/>

首先,Struts會在定義的scope搜尋someForm,如果找到則重用,如果找不到則新建一個實例;取得form實例以後,調用其reset()方法,然後將表單中的參數放入form,如果validate屬性不爲false,調用validate()方法;如果validate()返回非空的 ActionErrors,將會被轉到input屬性指定的URI,如果返回空的ActionErrors,那麼轉到parameter屬性指定的目標 URI。

這樣做的效果是:沒有action類可以存放我們的業務邏輯,所以所有需要寫入的邏輯都只能寫到form的reset()或者 validate()方法中。validate()的作用是驗證和訪問業務層。因爲這裏的action映射不包括forward(也沒有意義),所以不能重定向,只能用默認的那個forward。這種僅有form的action可以用來處理數據獲取並forward到另一個JSP來顯示。

3. 僅有Action的action

<action path="/anActionOnlyAction"
type="somePackage.someActionClass">
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>

首先,ActionServlet接收到請求後,取得action類實例,調用execute()方法;然後根據返回的ActionForward在配置中找forward,forward到指定的URI或action。

這樣做的效果是:沒有form實例被傳入execute()方法,於是execute()必須自己從請求中獲取參數。Action可以被forward或者重定向。這種action不能處理通過HTML FORM提交的請求,只能處理鏈接式的請求。

4. 僅有JSP的action

<action path="/aJSPOnlyAction"
type="org.apache.struts.actions.ForwardAction"
parameter="someOtherJSP.jsp"
/>

首先,ActionServlet接到請求後調用ForwardAction的execute()方法,execute()根據配置的parameter屬性值來forward到那個URI。

這樣做的效果是:沒有任何form被實例化,比較現實的情形可能是form在request更高級別的範圍中定義;或者這個action被用作在應用程序編譯好後充當系統參數,只需要更改這個配置文件而不需要重新編譯系統。

5. 兩個action對應一個form

<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">
name="someForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>

就每個單獨的action來講,處理上並沒有和完整的action有什麼實質的區別。這個組合模式可以被用來傳遞命令對象(form)。需要注意的是在後一個action中同樣會調用form的reset()和validate()方法,因此我們必須確保form中的信息不被重寫。

處理的方式大致分爲兩種:

a) 在request中放入一個指示器表明前一個action有意向後一個action傳遞form,從而在後一個action可以保留那個form中的值,這一方式只能在使用forward時使用。b) 當使用redirect而不是forward時,可以把指示器放在session或更高的級別,在命令鏈的最後一環將這個指示器清除。

<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do" redirect="true"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">"
name="someOtherForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>

這個組合方式跟前一種在流程上沒有太大區別,只是我們現在對於兩個action分別提供了form,於是代碼看上去更加清晰。於是我們可以分別處理WEB應用程序的輸入和輸出。值得注意的是,後一個action同樣會嘗試往form中寫入那些參數,不過我們可以這樣處理:a) 在後一個form中使用另一套屬性名;

b) 只提供getter而不提供setter。

大致的處理是這樣:

前一個action接收輸入、驗證、然後將數據寫入業務層或持久層,重定向到後一個action,後一個action手動的從業務層/持久層取出數據,寫入form(通過其他方式),交給前臺JSP顯示。

這樣做的好處是不必保留輸入form中的值,因此可以使用redirect而不是forward。這樣就降低了兩個action之間的耦合度,同時也避免了不必要的重複提交。
而在servlet中要直接跳到另一個servlet,可以response.sendRedirect("UserInforServlet");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章