配置Action
Struts2使用包來組織Action,因此,將Action定義在包定義下完成,每個package元素配置一個包
在Struts.xml文件中,package元素用於包的定義
屬性:
name:這是一個必須屬性,該屬性指定該包的名字,該名字是被其他包引用的key
extends:可選屬性,該屬性指定該包繼承其他包。可以繼承其他包中的Action定義、攔截器定義等
namespace:可選屬性,定義該包的命名空間
abstract:可選,指定該包是否一個抽象包,抽象包不能包含Action定義
<package name="test" extends="struts-default" namespace="/test">
<interceptors>
<interceptor-stack name="curdStack">
<interceptor-ref name="params">
<interceptor-ref name="defaultStack">
</interceptor-stack>
</interceptors>
<action name="date" class="com.action.DateAction">
<result name="success">/date.jsp</result>
</action>
</package>
那麼這個struts-default父包從何而來?
在struts2-core-2.1.2.jar中,有一個struts-default.xml
<package name="struts-default" abstract="true">
該包下有大量結果類型定義、攔截器定義、攔截器引用定義等,這些定義是配置Action的基礎,所以開發者定義的package通常應繼承此抽象包
那麼命名空間何用?
http://localhost:8080/strutsDemo/test/date.action
此連接是訪問上述定義DateAction的鏈接,strutsDemo是應用名,可以得出:當包指定了命名空間後,該包下所有的Action處理的URL是:命名空間+Action名
顯式指定根命名空間:
namespace="/"
注:系統如果根據指定的命名空間沒有找到處理的Action,則將到默認命名空間查找對應名的Action,如果找到則使用默認命名空間下的Action處理請求,如果都未找到,則報錯
Action配置
<action name="login" class="com.action.LoginAction">
...
</action>
class屬性不是必須的,如果未指定,則系統默認使用系統的ActionSupport類
Action方法的動態調用
//JS調用後臺loginAction中的指定方法
<input type="submit" value="註冊" οnclick="register();">
function register() {
//獲取頁面第一個表單
targetForm = document.forms[0];
//動態修改表單的action屬性
targetForm.action="login!register";
}
指定method屬性及使用通配符
<action name="login" class="com.action.LoginAction" method="login">
...
</action>
method屬性,指定通過哪個方法進行處理。
通配符方式:一個action元素配置多個邏輯的action
//同一個類中,通配符調用不同方法
<action name="*Action" class="com.action.LoginRegistAction" method="${1}">
...
</action>
public class LoginRegistAction extends ActionSupport {
//省略其他
public String login() throws Exception {
...
}
public String regist() throws Exception {
...
}
}
function regist() {
targetForm = document.forms[0];
targetForm.action = "registAction";
}
此時會默認調用LoginRegistAction中的regist()方法
//在不同類中,調用默認方法
<action name="*Action" class="com.action.{1}Action">
...
</action>
//同時在class和method屬性中使用通配符
<action name="*_*" method="${2}" class="com.action.{1}">
例如:URL是BookAction_save, 調用BookAction中的save方法
此外,還可以:
<action name="Login_*" class="com.action.LoginAction" method="${1}">
<action name="*">
<result>${1}.jsp</result>
</action>
這種方式會帶來一個問題:
例如:abcAction.action,同時符合在struts.xml中配置的:abcAction、*Action、*,這三個,這三種匹配並沒有優先匹配的說法,先找到哪個就會使用哪個進行處理
配置默認Action
<package name="xx" extends="struts-default">
<default-action-ref name="resultAction">
<action name="resultAction" class="com.action.ResultAction">
...
</action>
</package>
配置Action的默認處理類
<package name="struts-default" abstract="true">
<default-class-ref class="com.opensymphony.
xwork2.ActionSupport">
</package>