struts2的result的type屬性


一共有兩個屬性name和type

 

 

name這里就不介紹了

 

 

type    返回結果的類型,值可以從default-struts.properties中看到看到

 

常用的值:dispatcher (默認)轉發、redirect 重定向、redirectAction  重定向到Action、chain 轉發到Action、還有一個是stream一般用於文件下載的 

 

這里不得不提下轉發和重定向的區別:

 

這里不得不提下重定向與請求轉發的區別

轉發是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:

轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器發送http請求——》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

重定向時瀏覽器上的網址改變

轉發是瀏覽器上的網址不變

 

重定向,其實是兩次request

第一次,客戶端request   A,服務器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。

例子:

response.sendRedirect("loginsuccess.jsp");

請求轉發是服務器內部把對一個request/response的處理權,移交給另外一個

對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。傳輸的信息不會丟失。

例子:

       RequestDispatcherdis=request.getRequestDispatcher(“loginsuccess.jsp”);

       Dis.forward(request,response);

重定向實際上產生了兩次請求

轉發只有一次請求 

 

重定向: 

  發送請求 -->服務器運行-->響應請求,返回給瀏覽器一個新的地址與響應碼-->瀏覽器根據響應碼,判定該響應為重定向,自動發送一個新的請求給服務器,請求地址為之前返回的地址-->服務器運行-->響應請求給瀏覽器 

轉發: 

  發送請求 -->服務器運行-->進行請求的重新設置,例如通過request.setAttribute(name,value)-->根據轉發的地址,獲取該地址的網頁-->響應請求給瀏覽器 

三:

  重定向時的網址可以是任何網址

  轉發的網址必須是本站點的網址

重定向與請求轉發使用

前后兩個頁面 有數據傳遞 用請求轉發,沒有則用重定向。
比如servlet查詢了數據需要在頁面顯示,就用請求轉發。
比如servlet做了update操作跳轉到其他頁面,就用重定向。

 

注意>  dispatcher和redirect的小區別: redirect可以重定向一個新的Action而dispatcher不可以,轉發只能是chain

 

具體使用方式和實例

 

在本機D:\Javasoftware\struts\struts-2.3.16.3-all\struts-2.3.16.3\docs目錄下有home.html幫助文檔,guides>result type可以找尋實例,參數是固定的,需要注意。

redirect

重定向

<result name="success" type="redirect">
  <param name="location">foo.jsp</param>
</result>

或者  

<result name="success" type="redirect"> foo.jsp</result>

也可重定向到Action

<result name="success" type="redirect"> /namespace/foo.jsp</result>

  

 

 

 

redirectAction  (可以用redirect代替。)
 
 
1 <package name="package1" extends="struts-default">
2     <action name="login" class="...">
3         <!-- Redirect to another namespace -->
4         <result type="redirectAction">
5             <param name="actionName">xxx</param>
6             <param name="namespace">/xx</param>
7         </result>
8     </action>
9 </package>

 

 
 
  1. <struts>  
  2.   
  3.     <!-- package 包的作用和java中的類包是非常類似的,它主要用於管理一組業務功能相關的action -->  
  4.   
  5.     <package name="bao1" extends="struts-default" namespace="/">  
  6.   
  7.     <!-- 配置一個Action -->  
  8.   
  9.        <action name="login" class="cn.action.LoginAction">  
  10.   
  11.                <!-- 指定Result的類型為plaintext類型 -->  
  12.   
  13.            <result type="redirectaction">  
  14.   
  15.               <!-- 指定重定向的actionName -->  
  16.   
  17.               <param name="actionNam e">aaa</param>  
  18.   
  19.               <!-- 指定重定向的Action所在的命名空間 -->  
  20.   
  21.               <param name="namespace">/</param>  
  22.   
  23.            </result>  
  24.   
  25.        </action>  
  26.   
  27.     </package>  
  28.   
  29.     <package name="csdn1" extends="struts-default" namespace="/">  
  30.   
  31.     <!-- 配置一個Action -->  
  32.   
  33.        <action name="aaa" class="cn.csdn.hr.action.ChongAction">  
  34.   
  35.            <!-- 指定Result的類型為plaintext類型 -->  
  36.   
  37.            <result>./aaa.jsp</result>  
  38.   
  39.            <!--配置一個redirect-action結果類型的result,重定向同一個命名 空間的Action -->  
  40.   
  41.            <result type="redirectaction" name="error">error</result>  
  42.   
  43.        </action>  
  44.   
  45.        <action name="error">  
  46.   
  47.            <result>error.jsp</result>  
  48.   
  49.        </action>  
  50.   
  51.     </package>  
  52.   
  53. </struts>  


chain

1 <package name="package1" extends="struts-default">
2     <action name="login" class="...">
3         <!-- Redirect to another namespace -->
4         <result type="chain">
5             <param name="actionName">xxx</param>
6             <param name="namespace">/xx</param>
7         </result>
8     </action>
9 </package>

  

dispatcher是默認這里就不寫了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM