配置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>