struts.xml配置詳解

iteye_21202發表於2013-06-04
struts.xml是我們在開發中利用率最高的檔案,也是Struts2中最重要的配置檔案。以下介紹幾個struts.xml中常用到的標籤:

1、<include>

利用include標籤,可以將一個struts.xml配置檔案分割成多個配置檔案,然後在struts.xml中使用<include>標籤引入其他配置檔案。

比如一個網上購物程式,可以把使用者配置、商品配置、訂單配置分別放在3個配置檔案user.xml、goods.xml和order.xml中,然後在struts.xml中將這3個配置檔案引入:

struts.xml:

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <includefile="user.xml"/>
08 <includefile="goods.xml"/>
09 <includefile="order.xml"/>
10 </struts>

user.xml:

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <packagename="wwfy"extends="struts-default">
08 <actionname="login"class="wwfy.user.LoginAction">
09 <!--省略Action其他配置-->
10 </action>
11 <actionname="logout"class="wwfy.user.LogoutAction">
12 <!--省略Action其他配置-->
13 </action>
14 </package>
15 </struts>

2、<constant>

在之前提到struts.properties配置檔案的介紹中,我們曾經提到所有在struts.properties檔案中定義的屬性,都可以配置在struts.xml檔案中。而在struts.xml中,是通過<constant>標籤來進行配置的:

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <!--設定開發模式-->
08 <constantname="struts.devMode"value="true"/>
09 <!--設定編碼形式為GB2312-->
10 <constantname="struts.i18n.encoding"value="GB2312"/>
11 <!--省略其他配置資訊-->
12 </struts>

3、<package>

1、包屬性介紹

在Struts2框架中是通過包來管理action、result、interceptor、interceptor-stack等配置資訊的。包屬性如下:

屬性

是否必需

描述

name 包名,作為其它包應用本包的標記
extends 設定本包繼承其它包
namespace 設定包的名稱空間
abstact 設定為抽象包

2、extends屬性的詳解

  • 當一個包通過配置extends屬性繼承了另一個包的時候,該包將會繼承父包中所有的配置,包括action、result、interceptor等。
  • 由於包資訊的獲取是按照配置檔案的先後順序進行的,所以父包必須在子包之前被定義。
  • 通常我們配置struts.xml的時候,都繼承一個名為“struts-default.xml”的包,這是struts2中內建的包

3、namespace的詳解

namespace主要是針對大型專案中Action的管理,更重要的是解決Action重名問題,因為不在同一個名稱空間的Action可以使用相同的Action名的。

1)如果使用名稱空間則URL將改變

比如我們有一下配置檔案

1 <packagename="wwfy"extends="struts-default">
2 <actionname="login"class="wwfy.action.LoginAction">
3 <result>/success.jsp</result>
4 </action>
5 </package>

則此配置下的Action的URL為http://localhost:8080/login.action

假如為這個包指定了名稱空間

1 <packagename="wwfy"extends="struts-default"namespace="/user">
2 <actionname="login"class="wwfy.action.LoginAction">
3 <result>/success.jsp</result>
4 </action>
5 </package>

則此配置下的Action的URL為http://localhost:8080/user/login.action

2)預設名稱空間

Struts2中如果沒有為某個包指定名稱空間,該包使用預設的名稱空間,預設的名稱空間總是""。

3)指定根名稱空間

當設定了名稱空間為“/”,即指定了包的名稱空間為根名稱空間時,此時所有根路徑下的Action請求都會去這個包中查詢對應的資源資訊。

假若前例中路徑為http://localhost:8080/login.action則所有http://localhost:8080/*.action都會到設定為根名稱空間的包中尋找資源。

4、<action>與<result>

1、<action>屬性介紹

屬性名稱

是否必須

功能描述

name 請求的Action名稱
class Action處理類對應具體路徑
method 指定Action中的方法名
converter 指定Action使用的型別轉換器

如果沒有指定method則預設執行Action中的execute方法。

2、<result>屬性介紹

屬性名稱

是否必須

功能描述

name 對應Action返回邏輯檢視名稱,預設為success
type 返回結果型別,預設為dispatcher

3、萬用字元的使用

隨著result的增加,struts.xml檔案也會隨之變得越來越複雜。那麼就可以使用萬用字元來簡化配置:

例如下面這個案例:

Action為Test.java

01 publicclassTest {
02 publicString test1(){
03 return"result1";
04 }
05
06 publicString test2(){
07 return"result2";
08 }
09
10 publicString test3(){
11 return"result3";
12 }
13 }

struts.xml中配置為

1 <packagename="wwfy"extends="struts-default">
2 <actionname="test*"class="wwfy.action.test{1}">
3 <resultname="result{1}">/result{1}.jsp</result>
4 </action>
5 </package>

4、訪問Action方法的另一種實現方式

在Struts2中如果要訪問Action中的指定方法,還可以通過改變URL請求來實現,將原本的“Action名稱.action”改為“Action名稱!方法名稱.action”在struts.xml中就不需要指定方法名了。

5、<exception-mapping>與<global-exception-mapping>

這兩個標籤都是用來配置發生異常時對應的檢視資訊的,只不過一個是Action範圍的,一個是包範圍的,當同一型別異常在兩個範圍都被配置時,Action範圍的優先順序要高於包範圍的優先順序.這兩個標籤包含的屬性也是一樣的:

屬性名稱

是否必須

功能描述

name 用來表示該異常配置資訊
result 指定發生異常時顯示的檢視資訊,這裡要配置為邏輯檢視
exception 指定異常型別

兩個標籤的示例程式碼為:

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <packagename="default"extends="struts-default">
08 <global-exception-mappings>
09 <exception-mappingresult="邏輯檢視"exception="異常型別"/>
10 </global-exception-mappings>
11 <actionname="Action名稱">
12 <exception-mappingresult="邏輯檢視"exception="異常型別"/>
13 </action>
14 </package>
15 </struts>

6、<default-class-ref>

當我們在配置Action的時候,如果沒有為某個Action指定具體的class值時,系統將自動引用<default-class-ref>標籤中所指定的類。在Struts2框架中,系統預設的class為ActionSupport,該配置我們可以在xwork的核心包下的xwork-default.xml檔案中找到。

有特殊需要時,可以手動指定預設的class

1 packagewwfy.action;
2
3 publicclassDefaultClassRef {
4 publicvoidexecute(){
5 System.out.println("預設class開始執行……");
6 }
7 }

在struts.xml中配置

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <packagename="wwfy"extends="struts-default">
08 <!-- 指定預設class為Test -->
09 <default-class-refclass="wwfy.action.DefaultClassRef"/>
10 <actionname="test1">
11 <result>/index.jsp</result>
12 </action>
13 </package>
14 </struts>

7、<default-action-ref>

如果在請求一個沒有定義過的Action資源時,系統就會丟擲404錯誤。這種錯誤不可避免,但這樣的頁面並不友好。我們可以使用<default-action-ref>來指定一個預設的Action,如果系統沒有找到指定的Action,就會指定來呼叫這個預設的Action。

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <packagename="wwfy"extends="struts-default">
08
09 <default-action-refname="acctionError"></default-action-ref>
10 <actionname="acctionError">
11 <result>/jsp/actionError.jsp</result>
12 </action>
13 </package>
14 </struts>

8、<default-interceptor-ref>

該標籤用來設定整個包範圍內所有Action所要應用的預設攔截器資訊。事實上我們的包繼承了struts-default包以後,使用的是Struts的預設設定。我們可以在struts-default.xml中找到相關配置:

1 <default-interceptor-refname="defaultStack"/>

在實際開發過程中,如果我們有特殊的需求是可以改變預設攔截器配置的。當時一旦更改這個配置,“defaultStack”將不再被引用,需要手動最加。

9、<interceptors>

通過該標籤可以向Struts2框架中註冊攔截器或者攔截器棧,一般多用於自定義攔截器或攔截器棧的註冊。該標籤使用方法如下:

1 <interceptors>
2 <interceptorname="攔截器名"class="攔截器類"/>
3 <interceptor-stackname="攔截器棧名">
4 <interceptor-refname="攔截器名">
5 </interceptor-stack>
6 </interceptors>

10、<interceptor-ref>

通過該標籤可以為其所在的Action新增攔截器功能。當為某個Action單獨新增攔截器功能後,<default-interceptor-ref>中所指定的攔截器將不再對這個Action起作用。

11、<global-results>

該標籤用於設定包範圍內的全域性結果集。在多個Action返回相同邏輯檢視的情況下,可以通過<global-results>標籤統一配置這些物理檢視所對應的邏輯檢視。

01 <?xmlversion="1.0"encoding="UTF-8"?>
02 <!DOCTYPE struts PUBLIC
03 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
05
06 <struts>
07 <packagename="wwfy"extends="struts-default">
08 <global-results>
09 <resultname="test">/index.jsp</result>
10 </global-results>
11 </package>
12 </struts>