Struts2關於命名空間的例子

2022-08-17 06:15:21 字數 1562 閱讀 6395

佐證了這樣乙個原則,package存在,但action沒找到,就自動去預設空間去找。如果package不存在,則自動向上一級目錄找,一級級倒到根目錄。  根目錄再沒找到,再去預設目錄找

網上對於命名空間一致的說法為:

如果請求為/test/search/get.action,系統首先查詢/test/search命名空間下是否有get的action,如果有,則使用該action處理使用者請求。否則系統進入預設命名空間中尋找是否含有get的action,不會去子目錄下找。

如果請求為/login.action,系統首先在根命名空間查詢login的action,如果有,則使用該action處理使用者請求。否則系統進入預設命名空間中尋找是否含有login的action。

預設命名空間中action可以處理任何命名空間下的action,而根命名空間中的action只能處理根命名空間下的action。

因為上述跟我實際做的有點不相符,然後經過不斷的測試,終於弄明白了。也不能說上述說法錯誤,只是有個前提條件。

使用的版本為struts2.5.8

首先我配置了很簡單的3個包,第乙個為預設命名空間,第二個為根命名空間,第三個為/book命名空間。

/web-inf/content/first.jspresult>

action>

package>

/web-inf/content/second.jspresult>

action>

package>

/web-inf/content/third.jspresult>

action>

package>

當請求為/book/def,毫無疑問顯示的是/book下的檢視。

測試1、當請求為/abc/def時,顯示的卻是根命名空間下second.jsp的檢視。不是應該先去abc下找,找不到去預設命名空間嗎,為什麼顯示的是根命名空間下的檢視。

測試2、當請求為/book/abc/def時,顯示的是/book命名空間下的檢視。竟然跑進子目錄裡找到了。

一開始我以為是版本更新造成的,然後我又加上乙個命名空間為/book/abc的包,但是不配置action。

package>

當加上命名空間為/book/abc的包後,

同樣請求為/book/abc/def,顯示的是預設命名空間下的檢視,不再是/book命名空間下的了。

這就遵從了文章開頭的說法,/book/abc下沒找到,然後跑預設的命名空間下找,並不會去/book下找。

造成上述的原因就是:請求的命名空間沒有定義過。struts會把請求的命名空間去掉一層,再找,找不到再去掉一層,直到命名空間為/,也就是去根命名空間下找了(隨便給個/dsjhfsd/dsfsdf/sdhf/def請求,顯示的也是根命名空間下的檢視,當然根下要有def的action,否則還是到預設命名空間)。所以測試1顯示的是根命名空間,測試2顯示的是/book空間,因為去掉一層就找到了。

由此得到結論:

當請求到來時,找actioon會分為2步

1、struts首先決定使用哪個命名空間的包,決定的原則就是上述,一層層剝離,找到最相近的。

2、只有決定了使用哪個包之後,才開始找action,找action的原則就是文章開頭的說法。

struts2 命名空間

struts 2的命名空間是乙個新的概念,用來處理多個模組。由下式給出乙個命名空間的每個模組。此外,它還可以用來避免位於不同的模組相同的操作名稱之間的衝突。看下面的一張圖來了解乙個url匹配struts 2的動作命名空間。讓我們通過乙個struts2的命名空間配置的例子來了解它是如何與url和資料夾...

struts2 之命名空間

把 namespace 單獨拉出來講一方面是因為它實際上不是乙個 element 而只是乙個 attribute 前面已經說了,它是 package 的乙個attribute 另外一方面是因為這個屬性是我接觸 struts2 的時候第乙個研究的,印象很深,鑑於這兩個原因我決定單獨說一下它。在stru...

struts2命名空間的問題

如果請求的url是 bookservice search get,系統將先在 bookservice search的命名空間下查詢名為get的action,如果在該命名空間內找到名為get的action,則由該action處理使用者請求 如果在該命名空間內沒有找到名為get的action,系統將直接...