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>

這裏指示資源的實際位置使用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>

其中的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>

在登錄成功之後重定向到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>

全局結果

全局結果的的主要作用是,在有多個action都需要返回到某個頁面的時候,就可以全局結果。比如在電商網站購物的時候,查看訂單,添加商品到購物車都需要先登錄,那麼就可以把登錄作爲一個全局結果。全局結果是在包中定義的,這樣該包下的所有action都可以共享該全局結果了。

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

<!-- 全局結果配置 -->
        <global-results>
            <result name="error">/error.jsp</result>
            <result name="login" type="redirectAction">login!login</result>
        </global-results>

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