接着上次的繼續......
4.詳解struts.xml文件
(1). Bean配置
在配置Struts2的大部分核心組件時,會用到bean元素,其實Strus2中的bean元素與Spring中的bean元素無論從屬性還是功能上都差別不大,即是方便地擴展框架的核心組件,以下是bean元素的屬性:
l class:<必須> 指定Bean實例的實現類;
l type:<可選> 指定Bean實例實現的Struts2規範,在Struts2中該屬性的值通常是一個Struts2接口;如需要將Bean實例用爲Struts2組件來使用,則應該指定該屬性值;
l name:<可選> 指定Bean實例的名字,對於有相同type類型的多個Bean,它們的名字不能重複;
l scope:<可選> 指定Bean實例的作用域,屬性值只能是default、singleton、request、session或thread之一;
l static:<可選> 指定Bean是否使用靜態方式注入,通常,當指定了type屬性時,該屬性不應該指定爲true;
l optional:<可選> 指定該Bean是否是一個可選Bean。
(2). 常量配置
關於常量的配置我已經在上面已經講述過了,下面是幾點補充:
通常在struts.xml文件中定義Struts2屬性,而不是在struts.properties文件中。
Struts2框架按如下順序加載Struts2常量:
struts-default.xml:保存於struts2-core-2.0.6.jar中;
struts-plugin.xml:保存於struts2-xxx-2.0.6.jar中;
struts.xml
struts.properties
web.xml
下面給出在web.xml中配置常量的代碼:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<!—配置常量 -- >
<init-param>
<param-name>struts.custom.i18n.resource</param-name>
<param-value>ApplicationResource</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
居然在web.xml中也能配置常量,但並不推薦這樣做,這樣降低了web.xml文件的可讀性,通常推薦將Struts2常量配置在struts.xml文件中。
(3). 包配置
Struts2使用包來管理Action和攔截器等,每個包中包含多個Action、多個攔截器等。
在struts.xml中使用package元素來定義包,它具有以下幾個屬性:
l name: <必須> 配置包時必須指定其name屬性,用於標識該包;
l extends:<可選> 用於指定該包繼承其他包,繼承其他包意味着可以繼承其他包中的Action定義、攔截器定義等;
l namespace:<可選> 用於指定該包的命名空間;
l abstract:<可選> 用於指定該包是否是一個抽象包,在抽象包中不能包含Action定義;
注意:Struts2的配置文件是從上到下處理的,所以父包應該在子包之前進行定義!
(4). 命名空間配置
Struts2用命名空間來區分重名的Action,在同一個命名空間裏不允許有同名的Action,不同的命名空間裏可以有同名的Action。
① <package name=“yuzp” extends=“struts-default”>
<action name=”Login” class=”com.demo.LoginAction”>
<result>/welcome.jsp</result>
</action>
……
</package>
② <package name=“yuzp2” extends=“struts-default” namespace=“/cfan”>
<action name=”Login” class=”com.demo.LoginAction”>
<result>/welcome.jsp</result>
</action>
……
</package>
上面的配置片斷中,分別配置了兩個包,yuzp和yuzp2,其中①未指定namespace,②指定命名空間爲/cfan。如果沒有配置命名空間,則使用默認的命名空間:“”,如果要顯示的指定根命名空間,則使用namespace=”/”來配置。
如果配置了命名空間,那麼訪問它其中的Action的URL應該爲:命名空間 + ActionName,其實此處的命名空間有點類似於Struts1中的模塊,例示上述兩個Login Action的訪問URL爲:(Contextpath假設爲demo)
① 的URL:
Http://localhost:8080/demo/Login.do
② 的URL:
Http://localhost:8080/demo/cfan/Login.do
注意:配置有namespace的Action的搜索路徑
配置namespace屬性後,當請求到來時,Struts2會首先在該命名空間內尋找所對應的Action,如果找到,則由該Action處理用戶請求;如果在該命名空間內沒有找到相對應的Action,Struts2不管命名空間有多少級,將直接進入默認的命名空間中尋找相應的Action(默認命名空間裏的Action可以處理任何模塊下的Action請求),如果在兩級命名空間中均不能尋找到相應的Action,則系統報錯。