<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" ><struts> <!-- include節點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然后用include節點引用 --> <include file="struts-default.xml"></include> <!-- package提供了將多個Action組織為一個模塊的方式 package的名字必須是唯一的 package可以擴展 當一個package擴展自 另一個package時該package會在本身配置的基礎上加入擴展的package 的配置 父package必須在子package前配置 name:package名稱 extends:繼承的父package名稱 abstract:設置package的屬性為抽象的 抽象的package不能定義action 值true:false namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間為/test那么訪問是的地址為http://localhost:8080/struts2/test/XX.action --> <package name="com.kay.struts2" extends="struts-default" namespace="/test"> <interceptors> <!-- 定義攔截器 name:攔截器名稱 class:攔截器類路徑 --> <interceptor name="timer" class="com.kay.timer"></interceptor> <interceptor name="logger" class="com.kay.logger"></interceptor> <!-- 定義攔截器棧 --> <interceptor-stack name="mystack"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="logger"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 定義默認的攔截器 每個Action都會自動引用 如果Action中引用了其它的攔截器 默認的攔截器將無效 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局results配置 --> <global-results> <result name="input">/error.jsp</result> </global-results> <!-- Action配置 一個Action可以被多次映射(只要action配置中的name不同) name:action名稱 class: 對應的類的路徑 method: 調用Action中的方法名 --> <action name="hello" class="com.kay.struts2.Action.LoginAction"> <!-- 引用攔截器 name:攔截器名稱或攔截器棧名稱 --> <interceptor-ref name="timer"></interceptor-ref> <!-- 節點配置 name : result名稱 和Action中返回的值相同 type : result類型 不寫則選用superpackage的type struts-default.xml中的默認為dispatcher --> <result name="success" type="dispatcher">/talk.jsp</result> <!-- 參數設置 name:對應Action中的get/set方法 --> <param name="url">http://www.sina.com</param> </action> </package></struts>補充:
struts.xml是我們在開發中利用率最高的文件,也是Struts2中最重要的配置文件。
一下分別介紹一下幾個struts.xml中常用到的標簽
利用include標簽,可以將一個struts.xml配置文件分割成多個配置文件,然后在struts.xml中使用<include>標簽引入其他配置文件。
比如一個網上購物程序,可以把用戶配置、商品配置、訂單配置分別放在3個配置文件user.xml、goods.xml和order.xml中,然后在struts.xml中將這3個配置文件引入:
struts.xml:
?12345678910 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < include file = "user.xml" /> < include file = "goods.xml" /> < include file = "order.xml" /> </ struts > |
user.xml:
?123456789101112131415 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < package name = "wwfy" extends = "struts-default" > < action name = "login" class = "wwfy.user.LoginAction" > <!--省略Action其他配置--> </ action > < action name = "logout" class = "wwfy.user.LogoutAction" > <!--省略Action其他配置--> </ action > </ package > </ struts > |
在之前提到struts.PRoperties配置文件的介紹中,我們曾經提到所有在struts.properties文件中定義的屬性,都可以配置在struts.xml文件中。而在struts.xml中,是通過<constant>標簽來進行配置的:
?123456789101112 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > <!--設置開發模式--> < constant name = "struts.devMode" value = "true" /> <!--設置編碼形式為GB2312--> < constant name = "struts.i18n.encoding" value = "GB2312" /> <!--省略其他配置信息--> </ struts > |
在Struts2框架中是通過包來管理action、result、interceptor、interceptor-stack等配置信息的。包屬性如下:
屬性 | 是否必需 | 描述 |
name | 是 | 包名,作為其它包應用本包的標記 |
extends | 否 | 設置本包繼承其它包 |
namespace | 否 | 設置包的命名空間 |
abstact | 否 | 設置為抽象包 |
namespace主要是針對大型項目中Action的管理,更重要的是解決Action重名問題,因為不在同一個命名空間的Action可以使用相同的Action名的。
比如我們有一下配置文件
?12345 | < package name = "wwfy" extends = "struts-default" > < action name = "login" class = "wwfy.action.LoginAction" > < result >/success.jsp</ result > </ action > </ package > |
則此配置下的Action的URL為http://localhost:8080/login.action
假如為這個包指定了命名空間
?12345 | < package name = "wwfy" extends = "struts-default" namespace = "/user" > < action name = "login" class = "wwfy.action.LoginAction" > < result >/success.jsp</ result > </ action > </ package > |
則此配置下的Action的URL為http://localhost:8080/user/login.action
Struts2中如果沒有為某個包指定命名空間,該包使用默認的命名空間,默認的命名空間總是""。
當設置了命名空間為“/”,即指定了包的命名空間為根命名空間時,此時所有根路徑下的Action請求都會去這個包中查找對應的資源信息。
假若前例中路徑為http://localhost:8080/login.action則所有http://localhost:8080/*.action都會到設置為根命名空間的包中尋找資源。
屬性名稱 | 是否必須 | 功能描述 |
name | 是 | 請求的Action名稱 |
class | 否 | Action處理類對應具體路徑 |
method | 否 | 指定Action中的方法名 |
converter | 否 | 指定Action使用的類型轉換器 |
如果沒有指定method則默認執行Action中的execute方法。
屬性名稱 | 是否必須 | 功能描述 |
name | 否 | 對應Action返回邏輯視圖名稱,默認為success |
type | 否 | 返回結果類型,默認為dispatcher |
隨著result的增加,struts.xml文件也會隨之變得越來越復雜。那么就可以使用通配符來簡化配置:
例如下面這個案例:
Action為Test.java
?
12345678910111213 | public class Test { public String test1(){ return "result1" ; } public String test2(){ return "result2" ; } public String test3(){ return "result3" ; } } |
struts.xml中配置為
?12345 | < package name = "wwfy" extends = "struts-default" > < action name = "test*" class = "wwfy.action.test{1}" > < result name = "result{1}" >/result{1}.jsp</ result > </ action > </ package > |
在Struts2中如果要訪問Action中的指定方法,還可以通過改變URL請求來實現,將原本的“Action名稱.action”改為“Action名稱!方法名稱.action”在struts.xml中就不需要指定方法名了。
這兩個標簽都是用來配置發生異常時對應的視圖信息的,只不過一個是Action范圍的,一個是包范圍的,當同一類型異常在兩個范圍都被配置時,Action范圍的優先級要高于包范圍的優先級.這兩個標簽包含的屬性也是一樣的:
屬性名稱 | 是否必須 | 功能描述 |
name | 否 | 用來表示該異常配置信息 |
result | 是 | 指定發生異常時顯示的視圖信息,這里要配置為邏輯視圖 |
exception | 是 | 指定異常類型 |
兩個標簽的示例代碼為:
?123456789101112131415 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < package name = "default" extends = "struts-default" > < global-exception-mappings > < exception-mapping result = "邏輯視圖" exception = "異常類型" /> </ global-exception-mappings > < action name = "Action名稱" > < exception-mapping result = "邏輯視圖" exception = "異常類型" /> </ action > </ package > </ struts > |
當我們在配置Action的時候,如果沒有為某個Action指定具體的class值時,系統將自動引用<default-class-ref>標簽中所指定的類。在Struts2框架中,系統默認的class為ActionSupport,該配置我們可以在xwork的核心包下的xwork-default.xml文件中找到。
有特殊需要時,可以手動指定默認的class
?1234567 | package wwfy.action; public class DefaultClassRef { public void execute(){ System.out.println( "默認class開始執行……" ); } } |
在struts.xml中配置
?
1234567891011121314 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < package name = "wwfy" extends = "struts-default" > <!-- 指定默認class為Test --> < default-class-ref class = "wwfy.action.DefaultClassRef" /> < action name = "test1" > < result >/index.jsp</ result > </ action > </ package > </ struts > |
如果在請求一個沒有定義過的Action資源時,系統就會拋出404錯誤。這種錯誤不可避免,但這樣的頁面并不友好。我們可以使用<default-action-ref>來指定一個默認的Action,如果系統沒有找到指定的Action,就會指定來調用這個默認的Action。
?1234567891011121314 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < package name = "wwfy" extends = "struts-default" > < default-action-ref name = "acctionError" ></ default-action-ref > < action name = "acctionError" > < result >/jsp/actionError.jsp</ result > </ action > </ package > </ struts > |
該標簽用來設置整個包范圍內所有Action所要應用的默認攔截器信息。事實上我們的包繼承了struts-default包以后,使用的是Struts的默認設置。我們可以在struts-default.xml中找到相關配置:
?1 | < default-interceptor-ref name = "defaultStack" /> |
在實際開發過程中,如果我們有特殊的需求是可以改變默認攔截器配置的。當時一旦更改這個配置,“defaultStack”將不再被引用,需要手動最加。
通過該標簽可以向Struts2框架中注冊攔截器或者攔截器棧,一般多用于自定義攔截器或攔截器棧的注冊。該標簽使用方法如下:
?123456 | < interceptors > < interceptor name = "攔截器名" class = "攔截器類" /> < interceptor-stack name = "攔截器棧名" > < interceptor-ref name = "攔截器名" > </ interceptor-stack > </ interceptors > |
通過該標簽可以為其所在的Action添加攔截器功能。當為某個Action單獨添加攔截器功能后,<default-interceptor-ref>中所指定的攔截器將不再對這個Action起作用。
該標簽用于設置包范圍內的全局結果集。在多個Action返回相同邏輯視圖的情況下,可以通過<global-results>標簽統一配置這些物理視圖所對應的邏輯視圖。
?123456789101112 | <? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> < struts > < package name = "wwfy" extends = "struts-default" > < global-results > < result name = "test" >/index.jsp</ result > </ global-results > </ package > </ struts > |
新聞熱點
疑難解答