1. 程式人生 > >Struts2框架學習之三 result返回結果

Struts2框架學習之三 result返回結果

                     

前言

Struts 2中的Result是作為返回結果的,時當一個action處理完之後返回字串的結果碼。框架可以根據這個返回的字串,對映到指定的頁面。result元素可以分為兩部分:一是結果對映,一部分是返回結果型別。

結果對映

result有兩個屬性可以配置:name屬性和type屬性。其中的name屬性主要用來指定資源的邏輯名稱,實際名稱在標籤內部指定。type屬性就是result的返回型別。要注意的是,這兩個屬性都不是必須的,當我們沒有配置這兩個屬性的時候,實際上框架為我們指定了預設值,其中name屬性的預設值是success,type屬性的預設值是dispatcher(轉發)。正因為框架為我們設定了預設值才可以不用配置。

我們之前的配置都是使用result直接配置,實際上result標籤還有一個子標籤param,該標籤可以為result指定實際資源的位置,其有有一個必需的屬性name,實際上就是之前文章中result的配置的資源。比如下面的配置:

<action name="login" class="action.LoginAction">            <result>                <!-- param的location用於指示資源的位置,標籤的內容是引數的值 -->                <param name="location"
>
/success.jsp</param>            </result>            <result name="error">/error.jsp</result>        </action>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這裡指示資源的實際位置使用param標籤,但是如果result的type屬性是dispatcher的時候,上面的param標籤是可以直接省略的,這也是前面沒有寫param標籤也沒有報錯的原因。

結果型別

結果型別中常用的有四種:dispatcher、redirect、redirectAction和chain。其中dispatcher已經說過相當轉發,redirect相當於重定向,redirecAction也是重定向,只不過使用該結果型別的時候,一般是重定向到某個action,最後一種主要用於action的鏈式處理。其他的還有plainText(用於顯示頁面的原始內容,比如Servlet或者jsp的原始碼)、xslt等。

第1種:dispatcher

dispatcher也是框架預設的結果型別,其實現類是org.apache.struts2.dispatcher.ServletDispatcherResult,該類中有兩個屬性:location和parse。它們也可以在struts.xml檔案中直接配置:

<result type="dispatcher">                <!-- param的location用於指示資源的位置,標籤的內容是引數的值 -->                <param name="location">/success.jsp</param>                <param name="parse">true</param>            </result>
  • 1
  • 2
  • 3
  • 4
  • 5

其中的location引數用於指定資源的實際位置,該引數也是框架預設新增的;parse引數是一個布林變數,當為true的時候,表示將解析location引數中的OGNL表示式(後面還會介紹)。框架中parse引數的預設值也是true。

第2種:redirect

當使用該結果型別的時候,框架後臺會使用response物件的sendRedirect方法進行重定向,重定向與轉發還是不同的,具體體現在以下幾個方面:

  1. 重定向會發生兩次請求,轉發只會發生一次請求
  2. 重定向的時候,瀏覽器的位址列會發生變化,而轉發位址列是無變化的
  3. 重定向的實質是伺服器告訴瀏覽器去另外的地方尋找資源,所以位址列會發生變化,而轉發是在伺服器內部發生的,所以位址列不會發生變化
  4. 由於重定向是兩次請求,所以第二次請求會話儲存的資訊是無效的,而轉發的時候,會話仍然有效,因為仍然是原來的請求。

如果需要在重定向的時候把原來的有關資訊傳送到重定向後的頁面中,則需要使用OGNL表示式${username}(比如在登入成功後重定向到歡迎頁面,在歡迎頁面就可以使用OGNL表示式把使用者名稱傳遞過去),比如下面的配置:

<!-- 登入Action -->        <action name="login" class="action.LoginAction">            <result type="redirect">/success.jsp?user.username=${user.username}</result>            <result name="error">/error.jsp</result>        </action>
  • 1
  • 2
  • 3
  • 4
  • 5

在登入成功之後重定向到success.jsp頁面的時候,可以觀察到瀏覽器的位址列把使用者名稱作為引數傳遞到success.jsp頁面。

第3種:redirectAction

此種結果型別與redirect一樣,底層都是呼叫Response物件的sendRedirect方法進行重定向的,這兩者的區別是redirect結果型別一般是針對檢視的,而redirectAction則是重定向到某個action,所以如果在action處理之後還要交給另一個action繼續處理,那麼使用redirecAction結果型別。

redirecAction結果型別有兩個引數:actionName(指定需要重定向的action)和namespace(指定action所在的名稱空間,如果沒有指定該引數,框架會從預設的namespace中去尋找)。比如下面的配置:

<!-- HelloWorld演示程式 -->        <action name="hello" class="example.HelloWorld">            <!-- 重定向到/user名稱空間下的UserAction -->            <result type="redirectAction">                <!-- 指定需要重定向的action的name屬性 -->                <param name="actionName">userAction</param>                <!-- 指定重定向的action所在的namespace -->                <param name="namespace">/user</param>            </result>        </action>        <!-- 登入Action -->        <action name="login" class="action.LoginAction">            <result type="redirect">/success.jsp?user.username=${user.username}</result>            <!-- 重定向到同一namespace下的name屬性為error的action -->            <result type="redirectAction">                <!-- 同一namespace下的action不需要指定namespace引數 -->                <param name="actionName">error</param>            </result>        </action>        <action name="error">            <result>/error.jsp</result>        </action>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

全域性結果

全域性結果的的主要作用是,在有多個action都需要返回到某個頁面的時候,就可以全域性結果。比如在電商網站購物的時候,檢視訂單,新增商品到購物車都需要先登入,那麼就可以把登入作為一個全域性結果。全域性結果是在包中定義的,這樣該包下的所有action都可以共享該全域性結果了。

配置全域性結果的方式與在action中直接配置result不太一樣,全域性結果是在global-results標籤中定義的。比如下面的配置:

<!-- 全域性結果配置 -->        <global-results>            <result name="error">/error.jsp</result>            <result name="login" type="redirectAction">login!login</result>        </global-results>
  • 1
  • 2
  • 3
  • 4
  • 5