struts2:struts.xml配置文件詳解

1. 幾個重要的元素

1.1 package元素

package元素用來配置包。在Struts2框架中,包是一個獨立的單位,經過name屬性來惟一標識包。還能夠經過extends屬性讓一個包繼承另外一個包,extends屬性值就是被繼承包的name屬性值,繼承包能夠從被繼承包那裏繼承到攔截器、Action等。html

在Struts2框架中是經過包來管理action、result、interceptor、interceptor-stack等配置信息的。包屬性以下:瀏覽器

屬性框架

說明jsp

name 包名,做爲其它包應用本包的標記
extends 可選屬性,設置本包繼承其它包
namespace 可選屬性,設置包的命名空間
abstact 可選屬性,設置爲抽象包

-extends ui

  • 當一個包經過配置extends屬性繼承了另外一個包的時候,該包將會繼承父包中全部的配置,包括action、result、interceptor等。
  • 因爲包信息的獲取是按照配置文件的前後順序進行的,因此父包必須在子包以前被定義。
  • 一般咱們配置struts.xml的時候,都繼承一個名爲「struts-default.xml」的包,這是struts2中內置的包。

-namespace spa

  • 該屬性能夠指定包對應的命名空間。因爲在一個Web應用中可能出現同名的Action並存的狀況,爲了不命名衝突,只要使同名Action位於不一樣的namespace下就能夠了。
  • Struts2中若是沒有爲某個包指定命名空間,該包使用默認的命名空間,默認的命名空間老是""。
  • 當設置了命名空間爲「/」,即指定了包的命名空間爲根命名空間時,此時全部根路徑下的Action請求都會去這個包中查找對應的資源信息。
  • 根命名空間和普通命名空間中的Action的查找是同樣的,即若是有請求「/stu_info.action「(或者是」/C/stu_info.action「),則先查找根命名空間下的Action(或者是/C命名空間下的Action),若是不存在對應的Action,則查找默認命名空間裏的Action。此規則對於多級別的命名空間也是如此,即若是請求查找/A/A_Login/login.action時,Struts2框架先到/A/A_Login的命名空間裏查找名爲login的action,若是找不到,則到默認的命名空間裏查詢,而不會到它的上一級「/A「裏面查找。

示範:code

    <package name="caiwu" extends="struts-default" namespace="/caiwu">
    </package>

1.2 action元素

Struts2框架經過Action對象來處理HTTP請求,該請求的URL地址對應的Action即配置在action元素中。xml

action元素屬性htm

屬性名稱對象

功能描述

name 請求的Action名稱
class 可選屬性,Action處理類對應具體路徑
method 可選屬性,指定Action中的方法名
converter 可選屬性,指定Action使用的類型轉換器
  • 若是沒有指定method則默認執行Action類中的execute方法;不然調用method屬性中指定的方法。
  • 若是沒有指定class則默認值爲:com.opensymphony.xwork2.ActionSupport,該默認類使用默認的處理方法(啥也沒作),直接返回success值。

示範:

        <action name="list" class="com.clzhang.struts2.demo3.ListAction">
        </action>
        <action name="listSalarySum" class="com.clzhang.struts2.demo3.ListAction" method="listSalarySum">
        </action>

1.3 result元素

當調用Action方法處理結束返回後,下一步就是使用result元素來設置返回給瀏覽器的視圖。配置result元素時常須要指定name和type兩個屬性。

result屬性

屬性名稱

功能描述

name 對應Action返回邏輯視圖名稱,默認爲success
type 返回結果類型,默認爲dispatcher
  • name屬性對應於Action方法返回的值,success爲其默認值。
  • type屬性指定結果類型,默認的類型是dispatcher。

Struts2支持的結果類型

結果類型 

說明
dispatcher 將請求轉發(forward)到指定的JSP頁面
redirect   將請求重定向到指定的視圖資源
chain 處理Action鏈
freemarker 指定Freemarker模板做爲視圖
httpheader 控制特殊的HTTP行爲
redirect-action 直接跳轉到其它Action
stream 向遊覽器返回一個InputStream(通常用於文件下載)                    
velocity 指定使用velocity模板做爲視圖
xslt 用於XM/XSLT整合
plainText                                 顯示某個頁面的原始代碼

示範:

        <action name="login" class="com.clzhang.struts2.demo1.LoginAction">
            <result name="input">/struts2/demo1/login.jsp</result>
            <result name="error">/struts2/demo1/wrong.jsp</result>
            <result name="list" type="redirectAction">
                <param name="idInList">${id}</param>
                <param name="actionName">listBook</param>
            </result>
        </action>

須要注意dispatcher和redirect的區別,也就是轉發和重定向的區別,重定向會丟失全部的請求參數,並且會丟失Action處理結果。

1.4 include元素

在Struts2中提供了一個默認的struts.xml文件,但若是package、action、interceptors等配置比較多時,都放到一個struts.xml文件不太容易維護。所以,就須要將struts.xml文件分紅多個配置文件,而後在struts.xml文件中使用<include>標籤引用這些配置文件。

示範:

    <include file="caiwu.xml"></include>
    <include file="cangku.xml"></include>

1.5 global-results元素

有不少時候一個<result>初不少<action>使用,這時可使用<global-results>標籤來定義全局的<result>。

示範:

        <global-results>
            <result name="user">/struts2/demo3/user.jsp</result>
            <result name="sum">/struts2/demo3/sum.jsp</result>
            <result name="default">/struts2/demo3/default.jsp</result>
        </global-results>

1.6 default-action-ref元素

若是在請求一個沒有定義過的Action資源時,系統就會拋出404錯誤。這種錯誤不可避免,但這樣的頁面並不友好。咱們可使用<default-action-ref>來指定一個默認的Action,若是系統沒有找到指定的Action,就會指定來調用這個默認的Action。

示範:

    <default-action-ref name="acctionError"></default-action-ref>
    <action name="acctionError">
        <result>/jsp/actionError.jsp</result>
    </action>

2. Action的動態調用(DMI)

Struts2提供了包含多個處理邏輯的Action處理方式,即DMI(Dynamic Method Invocation,動態方法調用)。它是經過請求對象中的一個具體的方法來實現動態的操做。具體說,在請求Action的URL地址後加上請求方法字符串,與Action對象中的方法進行匹配。其中,Action對象名稱和方法之間用「!「隔開。

更多內容參考:struts2:多業務方法的處理(動態調用,DMI)

示範:

<A href="list!listUser.action" target="_blank">3.2 經過URL歎號參數</A>

3. 通配符

在實際的項目開發中,會出現多個Action定義的絕大部分都是相同的狀況,這時就會產生大量冗餘。對於這種狀況,Struts2也給出了相應的解決方法,即便用通配符。

通配符

說明

* 匹配0個或多個字符除了「/」
** 匹配0個或多個字符包含「/」
\character                                           轉義字符,「\\」匹配「\」;「\*」匹配「*」                                                         

通配符「*「一般用在<action>標籤的name屬性中,而在class、name屬性及result元素中使用{n}的形式來表明前面第n個*所匹配的字符串,{0}來表明URL請求的整個Action字符串。

示範一:

<!-- 使用*通配符,第一個*表示調用方法,第二個*表示Action -->
<action name="*_*" class="com.clzhang.struts2.action.{2}Action"
    method="{1}">
    <result name="success">/{0}Suc.jsp</result>
</action>

在上面代碼中,當URL請求是/update_Login.action時,會調用LoginAction類中的update()方法,處理結束返回到update_LoginSuc.jsp。

示範二:

<!-- 無論調用哪一個Action,默認返回名爲Action名的JSP -->
<action name="*_*">
    <result>/{0}.jsp</result>
</action>

上面代碼中沒有指定class屬性,也沒指定result元素的name,這樣無論訪問哪一個Action都會返回與該Action名字相同的JSP頁面。 

4. 常量配置

在以前提到struts.properties配置文件的介紹中,咱們曾經提到全部在struts.properties文件中定義的屬性,均可以配置在struts.xml文件中。而在struts.xml中,是經過<constant>標籤來進行配置的。

示範:

    <constant name="struts.action.extension" value="action"></constant>
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    <constant name="struts.ui.theme" value="simple"></constant>
    <constant name="struts.custom.i18n.resources" value="message"></constant>
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
相關文章
相關標籤/搜索