Struts 2 的action配置
當實現Action處理類后,我們就可以在struts.xml文件中配置該Action了。配置Action的目的就是讓Struts 2知道哪個Action處理哪個請求。也就是完成用戶請求和Action之間的對應關系。
在 Action 映射中可以指定 result types 、異常處理器及攔截器,但是,只有 Action 的 name 屬性是必需指定的,該屬性石引用該包的唯一標識。其他屬性也可以在 package 范圍內進行定義,供該 package 下配置的所有 Action 引用
1、包和命名空間
Struts 2使用包來組織、管理Action。定義Action通過使用<package.../>下的<action.../>子元素來完成。
在struts.xml文件中,<package.../>元素用于定義包配置。每個<package.../>元素定義了一個包配置。它有如下屬性:
Struts 2之所以提命名空間主要是為了處理同一個Web應用中包含同名Action的情形。由于Struts 2以包的形式來管理Action,故同一個包里面不能有同名的Action。
如果配置<package.../>時沒有指定namespace屬性,則該包下的所有Action都處于默認的包空間下。
有如下struts.xml配置
<package name="mystruts1" extends="struts-default"> <action name="*Action" class="com.action.LoginAction" > ...... </action> </package> <!-- 配置名為mystruts2,該包繼續了Struts 2的默認包,指定命名空間為/book --> <package name="mystruts2" extends="struts-default" namespace="/book"> <action name="getBooks" class="com.action.GetBooksAction"> ...... </action> </package>
當某個包指定了命名空間后,該包下所有的Action處理的URL應該是命名空間+Action名。如:
http://localhost:8080/struts_05/book/getBooks.action
Struts_05為應用名;book是該Action所在包對應的命名空間,而getBooks是Action名
2、Action的基本配置
除了上面的配置外,我們還要指定一個class屬性。該屬性指定了該Action的實現類。如果沒有指定該屬性,系統就會默認使用系統的ActionSupport類。
我們在配置<action.../>時,還可以為它指定method屬性。該屬性指定Action調用指定方法。
<action name="login" class="com.app.action.LoginAction" method="login" />
上面實例定義了一個名為login的Action,method屬性指定了處理用戶請求的方法為login
當然也可以不用指定method屬性。系統會默認調用execute方法來處理用戶請求。
處理用戶請求的方法都應該存在一個相同的方法簽名:方法形參列表為空,方法返回值為string。
<!-- 配置名為mystruts1,處理類LoginAction 默認使用execute方法處理請求 --> <package name="mystruts1" extends="struts-default"> <action name="*Action" class="com.action.LoginAction" > ...... </action> </package> <!-- 配置名為mystruts2,處理類為GetBooksAction,指定處理方法為getBooks --> <package name="mystruts2" extends="struts-default" > <action name="getBooks" class="com.action.GetBooksAction" method="getBooks"> ...... </action> </package>
3、配置處理結果
Action只是一個邏輯控制器,它并不直接對瀏覽者生產任何響應。因此,Action處理完用戶請求后,Action需要將指定的試圖資源呈現給用戶。因此,配置Action時,應該配置邏輯試圖和物理視圖資源之間的對應關系。
結果配置是告訴Struts 2:當Action處理用戶請求結束后,系統下一步做什么,系統下一步應該調用哪個物理視圖資源來顯示處理結果。
配置<result.../>元素時一般需要指定如下兩個屬性:
<result.../>元素配置如下:
<action name="login" class="com.app.action.LoginAction> <!-- 為success的邏輯視圖配置Result。type屬性指定結果類型 ---> <result name="success" type="dispatcher">/welcome.jsp</result> </action>
一般情況下,Struts 2允許省略指定結果類型
<action name="login" class="com.app.action.LoginAction> <!-- 為success的邏輯視圖配置Result。省略type ---> <result name="success">/welcome.jsp</result> </action>
Struts 2 還可以省略邏輯試圖名name屬性
<action name="login" class="com.app.action.LoginAction> <!-- 為success的邏輯視圖配置Result。省略type、name ---> <result >/welcome.jsp</result> </action>
如果我們省略了<result.../>元素的name屬性,系統將會采用默認的name屬性值,默認的name屬性值為success.
讀李剛《輕量級Java EE 企業應用實戰》