package節點是整個配置的核心部分。每個package,從語義上講,其實代表了每一個獨立的模塊。在這個模塊中,你可以定義隸屬於這個模塊的行爲方式,而與其他的模塊沒有關係。所以,每個package都有獨立的interceptor、result-type和action的定義,絕大多數的Runtime配置定義都是通過package節點實現的。接下來我們就來詳細討論一下package中的屬性和子節點。
1. name
name屬性爲每個package設置一個唯一的標識,這個標識在所有的package定義中不能重複。
2. abstract
標識這個package的定義是一個抽象定義,也就是允許他僅包含聲明式的定義,而不需要在package定義中包含action的定義。
3. extends
通過使用extends,你可以指定本package繼承另外一個package的所有的配置。當某個package繼承了另外一個package的所有配置,那麼你就無需對父package中已經聲明過的配置定義做再次的定義。
同時,如果重複定義父package中已聲明過的配置定義,那麼這些重複定義聲明將覆蓋父package中的相關定義。
4. namespace
namespace的作用:對於action配置進行邏輯劃分。
如果我們不爲package節點指定namespace,Struts2默認使用一個空字符串作爲默認的namespace。當然,也可以使用"/"等字符串來表示namespace。
定義package命名空間 該命名空間影響到url的地址,例如此命名空間爲/test那麼訪問是的地址爲http://localhost:8080/struts2/test/XX.action。
Struts2在根據URL進行尋址的時候,使用以下的步驟:1) 根據URL進行Namespace和ActionName的計算
2) 根據計算的得到的Namespace和ActionName查找package節點中相應配置
3) 如果查找失敗,則查找Namespace爲空,ActionName爲整個URL的配置
例子:
假如我有以下的配置段落
<struts>
<package name="p1" extends="struts-default">
<action name="login" class="com.example.action.Login">
<result>/success.jsp</result>
</action>
<action name="login1" class="com.example.action.Login">
<result>/success.jsp</result>
</action>
</package>
<package name="p2" extends="struts-default" namespace="/testNameSpace">
<action name="login" class="com.example.action.Login">
<result>/success.jsp</result>
</action>
</package>
</struts>
說明:
a、 包p1沒有定義namespace,說明p1用的是默認空間""
現在有下面的請求:
1、/工程名/login.action
------這個請求對應p1包下的action name=login
2、/工程名/testNameSpace/login.action
-----這個請求對應p2包下的action name=login
3、/工程名/testNameSpace/login1.action
----這個請求是請求p2包下的信息的,如果struts在檢索了p2包下的所有action後沒有檢索到當前請求的login1,這時struts會檢索前一個命名空間,這裏是默認空間下是否有當前請求,檢查發現存在login1就得到當前檢索
這裏我有個個人的建議:
無論你的namespace配置或者沒配置,也無論配置啥樣,你在寫跳轉的url的時候請你也把
‘/工程名/’帶上,寫成這樣:/工程名/命名空間1/命名空間2/actionName.action這樣寫能保證路徑的正確性,當然如果你在寫跳轉的時候不發暈,可以視你的配置情況加或者不加這個!