配置Action

来源:互联网 发布:笔记本电脑自拍软件 编辑:程序博客网 时间:2024/06/10 23:15

包和命名空间:< package…/>

name:这是一个必需属性,该属性指定该包的名字,该名字是该包被其他包引用的key。
extends:该属性是一个可选属性,该属性指定该包继承其他包。继承其他包,可以继承其他包中的Action定义,拦截器定义等。
namespace:该属性是一个可选属性,该属性定义该包的命名空间。
abstract:该属性是一个可选属性,它指定该包是否是一个抽象包。抽象包中不能包含Action定义。
注意
①Struts2之所以提供命名空间的功能,主要是为了处理同一个web应用中包含同名Action的情形,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
②Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。如果配置< package…/>时没有指定namespace属性,则该包下的所有Action处于默认的包空间下。

例子:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 开发模式 -->    <constant name="conststruts.devMode" value="true"/>    <!-- 下面配置名为slow的包,该包继承了Struts2的默认包,使用默认指定空间 -->    <package name="slow" extends="struts-default">        <!-- 配置login的Action -->        <action name="login" class="csdn.slow.app.action.LoginAction">            <result name="error">/WebContent/error.jsp</result>            <result name="success">/WebContent/welcome.jsp</result>        </action>    </package>    <!-- 下面配置名为get的包,该包继承了Struts2的默认包。指定该包的命名空间为/book -->    <package name="get" extends="struts-default" namespace="/book">        <!-- 配置一个名为getBooks的Action -->        <action name="getBooks" class="csdn.slow.app.action.GetBookAction">            <result name="login">/WebContent/login.jsp</result>            <result name="success">/WebContent/showBook.jsp</result>        </action>    </package></struts>

注意:当某个包指定了命名空间后,该包下所有的Action处理的URL应该是命名空间+Action名。例如上面例子getBooks的Action:

http://localhost:8080/Struts2_1003/book/getBooks.action

注意
①请求/barspace/bar.action的过程:查找/barspace命名空间里的bar的Action→(if找不到)查找默认命名空间里的bar的Action→(if找不到)系统出错。
②请求/barspace/search/bar.action的过程:查找/barspace/search命名空间里的bar的Action→(if找不到)查找默认命名空间里的bar的Action→(if找不到)系统出错。
③请求/bar.action的过程:查找根命名空间里的bar的Action→(if找不到)查找默认命名空间里的bar的Action→(if找不到)系统出错。


使用Action的动态方法调用

在struts.xml添加:

<!-- 设置支持动态方法调用,默认是false --><constant name="struts.enable.DynamicMethodInvocation" value="true"/>

例子:用户登录和注册
测试结果:
这里写图片描述
登录:
这里写图片描述
注册:
这里写图片描述

代码:
login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><%@taglib prefix="s" uri="/struts-tags"%><script>    function regist(){        //获取页面的第一个表单        targetForm = document.forms[0];        //动态修改表单的action属性        targetForm.action = "login!regist";    }</script><html>    <head>        <title><s:text name="LoginPage"/></title>    </head>    <body>        <form action="login" method="post">            用户名:<input type="text" name="username"><br>            密&nbsp;码:<input type="password" name="password"><br>            <input type="submit" value="登录">            <input type="submit" value="注册" onclick="regist();"/>        </form>    </body></html>

LoginRegisterAction.java:

package csdn.slow.app.action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginRegisterAction extends ActionSupport {    //封装用户请求参数的两个属性    private String username;    private String password;    //封装处理结果的tip属性    private String tip;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getTip() {        return tip;    }    public void setTip(String tip) {        this.tip = tip;    }    //Action包含的注册控制逻辑    public String regist() throws Exception {        ActionContext.getContext().getSession().put("user", getUsername());        setTip("恭喜您,"+getUsername()+",您已经注册成功!");        return SUCCESS;    }    //Action默认包含的控制逻辑    public String execute() throws Exception {        if(getUsername().equals("slow") && getPassword().equals("slow")) {            ActionContext.getContext().getSession().put("user", getUsername());            setTip("欢迎,"+getUsername()+",您已经登录成功!");            return SUCCESS;        } else {            return ERROR;        }    }}

welcome.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><html>    <head>        <title>成功页面</title>    </head>    <body>        ${requestScope.tip }    </body></html>

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 设置支持动态方法调用,默认是false -->    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>    <!-- 开发模式 -->    <constant name="conststruts.devMode" value="true"/>    <!-- 下面配置名为slow的包,该包继承了Struts2的默认包,使用默认指定空间 -->    <package name="slow" extends="struts-default">        <!-- 配置login的Action -->        <action name="login" class="csdn.slow.app.action.LoginRegisterAction">            <result name="error">/WebContent/error.jsp</result>            <result name="success">/WebContent/welcome.jsp</result>        </action>    </package></struts>

指定method属性及使用通配符

(1)指定method属性
改变上例的struts.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 设置支持动态方法调用,默认是false -->    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>    <!-- 开发模式 -->    <constant name="conststruts.devMode" value="true"/>    <!-- 下面配置名为slow的包,该包继承了Struts2的默认包,使用默认指定空间 -->    <package name="slow" extends="struts-default">        <!-- 配置login的Action,处理类为LoginRegistAction,默认使用execute方法处理请求 -->        <action name="login" class="csdn.slow.app.action.LoginRegisterAction">            <result name="error">/WebContent/error.jsp</result>            <result name="success">/WebContent/welcome.jsp</result>        </action>        <!-- 配置regist的Action,处理类为LoginRegistAction,指定使用regist方法处理请求 -->        <action name="regist" class="csdn.slow.app.action.LoginRegisterAction" method="regist">            <!-- 定义逻辑视图和物理视图之间的映射关系 -->            <result name="error">/WebContent/error.jsp</result>            <result name="success">/WebContent/welcome.jsp</result>        </action>    </package></struts>

(2)使用通配符
☞在配置< action…/>元素时,允许在指定name属性时使用模式字符串(即用”“代表一个或多个任意字符),接下来就可以在class、method属性及< result…/>子元素中使用{N}的形式来代表前面第N个星号( )所匹配的子串。
改变的struts.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 设置支持动态方法调用,默认是false -->    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>    <!-- 开发模式 -->    <constant name="conststruts.devMode" value="true"/>    <!-- 下面配置名为slow的包,该包继承了Struts2的默认包,使用默认指定空间 -->    <package name="slow" extends="struts-default">        <!-- 使用模式字符串定义Action的name,指定所有以Action结尾的请求,-->        <!-- 都可用LoginRegisterAction来处理,method属性使用{1} -->        <!-- 这个{1}代表进行模式匹配时第一个*所代替的字符串 -->        <action name="*Action" class="csdn.slow.app.action.LoginRegisterAction" method="{1}">            <result name="error">/WebContent/error.jsp</result>            <result name="success">/WebContent/welcome.jsp</result>        </action>    </package></struts>

☞注意:
①< action…/>元素的class属性也可以使用{N}表达式,即:

<action name="*Action" class="csdn.slow.app.action.{1}Action">    ... </action>

②< action…/>元素的class属性和method属性同时使用{N}表达式,即:

<action name="*_*" class="actions.{1} method="{2}">    ... </action>

③处理所有匹配Crud_*的请求:

<action name="Crud_*" class="slow.Crud method="{1}">    ... </action>

④在< result…/>子元素中使用{N}表达式

<action name="*">    <result>/{1}.jsp</result></action>

☞注意:
①如果有URL为abcAction.action的请求,如果struts.xml文件中有名为abcAction的Action,则一定由该Action来处理用户请求;如果struts.xml文件中没有名为abcAction的Action,则搜寻name属性值能匹配abcAction的Action,例如name为*Action或*, *Action并不会比*更优先匹配abcAction的请求,而是先找到哪个Action,就会由哪个Action来处理用户请求。


配置默认Action

<!-- 配置一个默认Action,默认Action为simpleViewResultAction --><default-action-ref name="simpleViewResultAction"/>

配置Action的默认处理类

<!-- 配置Action的默认处理类 --><default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>
0 0
原创粉丝点击