轻量级JavaEE企业应用实战(十)

配置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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章