假設我們的訪問地址為:http://localhost:8080/struts2/test/helloworld,那麼改成 http://localhost:8080/structs2/test/sdf/sfs/aaa/helloworld 還能訪問到嗎?
答案是YES
很奇怪,為什麼呢?
讓我們來看一下Action名稱的搜尋順序
1.獲得請求路徑的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
2.首先尋找namespace為/path1/path2/path3的package,如果不存在這個package則執行步驟3;如果存在這個package,則在這個package中尋找名字為test的action,當在該package下尋找不到action 時就會直接跑到預設namaspace的package裡面去尋找action(預設的命名空間為空白字串“” ) ,如果在預設namaspace的package裡面還尋找不到該action,頁面提示找不到action
3.尋找namespace為/path1/path2的package,如果不存在這個package,則轉至步驟4;如果存在這個package,則在這個package中尋找名字為test的action,當在該package中尋找不到action 時就會直接跑到預設namaspace的package裡面去找名字為test的action ,在預設namaspace的package裡面還尋找不到該action,頁面提示找不到action
4.尋找namespace為/path1的package,如果不存在這個package則執行步驟5;如果存在這個package,則在這個package中尋找名字為test的action,當在該package中尋找不到action 時就會直接跑到預設namaspace的package裡面去找名字為test的action ,在預設namaspace的package裡面還尋找不到該action,頁面提示找不到action
5.尋找namespace為/的package,如果存在這個package,則在這個package中尋找名字為test的action,當在package中尋找不到action或者不存在這個package時,都會去預設namaspace的package裡面尋找action,如果還是找不到,頁面提示找不到action。
我們再來看下action中的各項預設值:
<action name="helloworld" class="com.jim.action.HelloWorldAction" method="execute" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
1>如果沒有為action指定class,預設是ActionSupport。
2>如果沒有為action指定method,預設執行action中的execute() 方法。
3>如果沒有指定result的name屬性,預設值為success。
所以如果我們寫成:
<action name="test">
<result>/WEB-INF/page/hello.jsp</result>
</action>
當我們訪問test這個action時會自動跳轉到下面那個jsp頁面