天天看點

struts2學習筆記之八(result)

strust2的開發步驟

  • 編寫一個發送請求的頁面,表單或超連結
  • 編寫一個action類

    1. 推薦實作action接口或繼承actionsupport

    2. 為所有請求參數,包括需要傳到下一個頁面顯示的資料提供filed

    并提供相應的setter和getter

    3. 要有無參的構造器

    4. 處理請求的方法,該方法不能有形參聲明

    5. 處理請求的傳回值是String

  • 在struts.xml檔案配置action

struts.xml配制方法

  1. 常量配置
  2. 包配置和命名空間配置
    這種設計是為了企業應用的子產品化開發,把多個配置檔案以include的方式包含進來
  3. 處理結果的控制
--------------------
                    |
                    -------根據邏輯視圖跳轉實體視圖2
                    |               
                    |
                    -------根據邏輯視圖跳轉實體視圖1
                    ^
                    |  邏輯視圖<--------------------
                    |                             |
                    |                             |
 發送請求----->struts分發器---->建立action執行個體,調用execute
           
  • action隻是負責struts2控制器的部分,是以它不能直接生成浏覽者的響應
  • action隻會負責處理請求,負責生成響應的視圖元件,通常是JSP頁面,而action會為JSP頁面提供顯示的資料
  • 當action處理使用者請求後,控制器根據

    <result.../>

    元素決定具體使用哪個資源生成響應
  • 配置邏輯視圖和實體視圖之間的映射關系是通過result子元素來定義的。每個result定義邏輯視圖和實體視圖之間的一次映射

result使用方法

  • <result .../>

    支援的屬性
    • name:邏輯視圖名。name屬性的預設是success
    • type:指定實體視圖資源的類型。預設值是dispatch,

      與dispatch對應的是redirect—-重定向

  • 目前的視圖資源類型可能有(不一定是JSP)
    • Velocity
    • FreeMarker
    • JFreeChart
    • 報表(JasperReports)
    • XSLT
  • result的标準格式
<result name="" type>
                    <param></param>
                    <param></param>
                    ....
                </result>       
           

如果有如下的配置

<result name="邏輯視圖" type="視圖配型">
            <param name="location">實體視圖位置<param>
            <param name="parse">true<param>----是否解析OGNL表達式的值
        </result>
           

就可以簡化為

  • 屬性
    • name:指定邏輯視圖名。

      預設是success(題外話:不會偷懶的人不是好的程式員,一個人勤勞并不定是優秀的,重要的是勤奮的由價值,偷懶有時候也是勤奮)

    • type:指定所使用的實體視圖類型

      在struts-default.xml中的struts-default抽象包中:

<result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>

            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>

            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>

            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>

            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>

            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>

            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult"/>

            <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult"/>

        </result-types>
           

從以上可知,type的預設值是dispatch。

  • 重要的類型
    • chain :Action處理完請求之後,轉發到下一個Action繼續處理,形成一個鍊式處理
    • dispatch
    • redirect

      /********

      forward : 依然使用一次請求,位址欄url沒有變化,請求參數和請求屬性都不會丢失

      redirect:重新發送一次新的請求,就像在位址欄中重新輸入一個url并回車的效果一樣,位址欄的url變化,請求參數和請求屬性都會丢失

      dispatch和redirect的差別也是上面的差別

      *********/

    • redirectAction:重定向到action
    • stream:做檔案下載下傳
    • plainText:顯示頁面源碼
  • 常用type示例

1、chain

假設在regist的action裡注冊成功之後跳轉到一個浏覽所有使用者的action
<action name="regist" class="registAction">
                                <result type="chain">userList</result>
                            </action>
                            <action name="userList" class="userListAction">
                                <result ...> .... </result>
                            </action>
           

2、redirect

直接“重定向”到新的URL,生成一次新的請求,原有的請求參數請求屬性都會丢失。

與預設的dispatch(“轉發”)相應

3、 dispatch

4、plainText

直接顯示視圖頁面的源代碼
<action name="login" class="loginAction">
                                <!--當處理方法傳回success,系統跳轉到welcome.jsp-->
                                <result type="plainText">
                                    <param name="locaiont">/WEB-INF/content/welcome.jsp</param>
                                    <!-- 指定實體視圖資源的編碼字元集-->
                                    <param name="charSet">utf-8</param>
                                </result>
                            </action>
           
一般沒有太大的用處,主要用于顯示源代碼,教學類型的,為了讓學生看到源代碼學習

5、stream —直接生成“二進制”檔案流

  • result的兩種形式

1、局部

<result .../>

作為

<action>

的子元素,隻對action有效

2、全局

<result .../>

用于全局

<global-results>
                <result type="">
                </result>
        </global-results>
           

1、當全局result配置與局部result配置沖突時,局部result會覆寫全局result

盡量少用全局result,隻有在多個action都具有某個通用性質的result,才考慮全局result

2、不同的result類型,可使用的參數不同

/*********

struts的配置檔案,包括:

struts-default.xml: 核心包使用該配置檔案

struts-plugin.xml: 插件包使用該配置檔案

struts.xml : struts2應用使用該配置檔案

struts-abc.xml : 其他的配置檔案,必須被include加載

**********/

如dispatch的參數有location和parse

需要使用的時候,查閱文檔,

  • 動态結果
使用{1},{2}….

例:

通用的action
        <action name="*">
            <result>
                /WEB-INF/content/{1}.jsp
            </result>
        </action>
        {1}比對*所比對的第一個比對值
        <action name="*Action">
            <result>
                /WEB-INF/content/{1}_{2}.jsp
            </result>
        </action>
           

Action屬性值決定視圖資源

不僅可以使用{1}…,還可以使用${屬性}

<action name="myPro" class="">
                <!--在定義實體視圖資源時,可以直接使用OGNL表達式,是以這個實體視圖可以動态的改變。通過OGNL來計算${res}表達式的值
                -->
                <result>
                    /WEB-INF/content/{res}.jsp
                </result>
           
  • 動态方法調用(DMI Dynamic Method Invocation)

    用法不是特别大,大緻了解

    功能:可以在送出請求的時候,直接送出給action的指定方法。

    • 未使用DMI:

      <form action="myPro" method="post"></form>

    上述代碼隻能看出送出給哪個action,而無法看到送出給哪個方法,

    具體調用的需要檢視struts.xml

    • 使用DMI:

      可以直接在action後增加”!method”的形式,來DMI

      <form action="myPro!login" method="post"></form>

      所謂的DMI其實就是在頁面上指定請求位址為:actionName!methodName

    缺點:

    1、安全性不高

    2、沒有必要,完全可以在action元素中指定method來代替動态方法調用

第一次用markdown的文法寫,總體感覺還是可以,就是有序清單不是很好,或許是自己沒用好,以後多多體會

繼續閱讀