內容源自:Struts2中的頁面跳轉
一、全局頁面的設置
如果<package>包中的一些action都返回success,並且返回的頁面都是同一個JSP頁面,這樣就可以配置全局的結果頁面。
全局結果頁面針對的當前的包中的所有的Action,但是如果局部還有結果頁面,會優先局部的。
設置全局頁面的標簽是
<global-results> <result>/demo/suc.jsp</result> </global-results>
局部結果頁面
<result>/demo/suc.jsp</result>
二、頁面跳轉類型
實際上在Struts2框架中,一個完整的結果視圖配置文件應該是:
<action name="Action名稱" class="Action類路徑" method="方法名"> <result name="邏輯視圖名稱" type="結果類型"> <param name="參數名稱">參數值</param> </result> </action>
其中的type就是頁面跳轉類型。
Struts2中支持多種頁面跳轉類型,常見的結果類型去struts-default.xml中查找。
結果頁面使用<result>標簽進行配置,包含兩個屬性:
name -- 邏輯視圖的名稱
type -- 跳轉的類型,一些常用的類型如下。
1、dispatcher
這種方式是struts2中默認的轉發類型,即內部請求轉發,類似於forward的方式。用於指定使用JSP作為視圖的結果類型。 Action--->JSP
2、redirect
重定向. Action--->JSP或者Action
用於直接跳轉到其他URL的結果類型。
1)這種結果類型與dispatcher結果類相對,dispatcher結果類型是將請求forword(轉發)到指定的JSP資源;而redirect結果類型,則意味着將請求redirect(重定向)到指定的視圖資源。
2)dispatcher與redirect的差別就是重定向和轉發的差別:重定向會丟失所以的參數、請求屬性--當然也就丟失了Action的出來結果。
3)使用redirect結果類型的效果是,系統將調用HttpServletResponse的sendRedirect(String)方法來重定向指定視圖資源,這種重定向的效果就是重新產生一個請求,因此所有的請求參數、請求屬性、Action實例和Action中封裝的屬性全部丟失。地址欄的URL會發生改變。
4)配置一個redirect類型結果,可以指定如下兩個參數。
location:改參數指定Action處理完用戶請求后跳轉的地址。
parse:改參數指定是否允許在location參數值中使用表達式,改參數默認為true。與前面的類似,通常無需指定parse屬性值。
5)使用這個類型也可以指定跳到一個Action,只是需要添加.action后綴,已達到redirectAction結果類型效果。
重定向到jsp
<action name="redirect"> <result type="redirect">/add.jsp</result> </action>
重定向到action
<action name="redirect"> <result type="redirect">addUser.action</result> </action>
3、redirectAction
1)這種方式可以簡單的理解成轉向到另一個Action。這種配置往往在下面的情況下需要用到:例如,當管理員添加完一個用戶后,系統自動跳轉到用戶列表的界面。
2)這種結果類型與redirect類型非常相似,一樣是重新生成一個全新的請求。但與redirect結果類型區別在於:redirectAction使用ActionMapperFactory提供的ActionMapper來重定向請求。
3)配置一個redirect類型的結果,可以指定如下兩個參數。(針對不在同一個配置文件中)
actionName:該參數指定重定向的Action名。
namespace:該參數需要指定需要重定向的Action所在命名空間。
<action name="redirectAction"> <result type="redirectAction">listAction</result> </action>
該action必須和redirectAction處在同一個package下面。那么如果不在同一個包下,則需進行如下配置:
<result type="redirectAction"> <param name="actionName">XXX</param> <param name="namespace">YYY</param> </result>
4)使用redirectAction結果類型時,系統將重新生成一個請求,只是改請求的URL不是一個具體的視圖資源,而是另一個Action。因此前一個Action處理結果、請求參數、請求屬性會全部丟失。
4、chain
多個action之間跳轉.從一個Action轉發到另一個Action. Action--->Action
注意: 不能通過 type=dispatcher 的方式轉發到一個 Action
例如:
<result name="test" type="chain">/com.chen/testAction.action</result>
而以下方式錯誤:
<result name="test" type="dispatcher">/com.chen/testAction.action</result>
chain也用了跳轉到另一個Action,與前面的不同的是,他的請求參數和屬性都可以保留,比如,系統中的刪除功能,回到之前查詢的action,要保存頁碼回到之前刪除記錄的當前頁,用chain就可以做到,幾乎就是前面兩種的增強版。推薦開發中直接忽略redirect和redirectAction類型,直接用這個chain就好了。
5、stream -- 文件下載時候使用的.
三、關於頁面沖突
當使用一個Action標簽完成多個Action配置時,可能會出現Input結果視圖沖突的情況。也就是說,在不同邏輯中跳入的input邏輯視圖是同一個,此時我們可以在自己的Action方法上加上 @InputConfig(resultName="邏輯視圖的名稱")的注解然后再在Result中配置即可。
