Struts2---Action

Action


  • action创建的几种方法
  • action的访问方法
  • action的调用原理
  • result标签

Action 是用来处理操作请求的,它是由StrutsPrepareAndExecuteFilter分发过来的

Action 创建的几种方法

  • POJO类(PlainOldJavaObjects 简单的java对象),不需要继承任何父类,实现任何接口
public class TestAction {
    public String execute() {
        return "success";
    }
}

这种方法是通过Struts框架通过反射实现的步骤:

  • Struts2框架通过读取Struts.xml文件来获取action的完整路径
  • Object object = Class.forName(“完整类名”).newInstance();
  • Method method = Class.forName(“完整类名”).getMethod(“execute”);
  • method.invoke(object);

execute() 方法的要求:

  • 方法的权限修饰符为public
  • 返回一个字符串
  • 方法没有参数
  • 实现action接口
public class TestAction implements Action {
    /**
     * 可以不重写execute方法,用自定义的方法,但是
     * 在配置文件中需要显示指定方法名method=要执行的方法
     */
    @Override
    public String execute() {
        return "success";
    }
}

Action接口中定义五种逻辑视图名称(常量):

public static final String SUCCESS = "success";  // 数据处理成功 (成功页面)
public static final String NONE = "none";  // 页面不跳转  return null; 效果一样
public static final String ERROR = "error";  // 数据处理发送错误 (错误页面)
public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
  • 继承ActionSupport类(推荐)
    • 其实ActionSupport类中,已经实现了Action接口
    • 而且可以在Action中使用表单校验、错误信息设置、读取国际化信息三个功能,所以推荐使用
public class TestAction extends ActionSupport {
    /**
     * 可以不重写execute方法,用自定义的方法,但是
     * 在配置文件中需要显示指定方法名method=要执行的方法
     */
    @Override
    public String execute() {
        return "success";
    }
}

Action的访问

在配置<action>元素的时候,没有制定method属性,默认执行Acting类中的execute方法。

1、基本访问

在JSP页面中,有以下的action访问路径

<a href="${pageContext.request.contextPath}/book/update.action">测试</a>

struts.xml 配置文件

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/book" extends="struts-default">
        <action name="add" class="cn.sunny.action.BookAction" method="add">
            <result name="success">/success.jsp</result>
        </action>
        <action name="update" class="cn.sunny.action.BookAction" method="update">
            <result name="success">/success.jsp</result>
        </action>
        <action name="delete" class="cn.sunny.action.BookAction" method="delete">
            <result name="success">/success.jsp</result>
        </action>
        <action name="search" class="cn.sunny.action.BookAction" method="search">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

通过<package>的namespace与<action>的name属性结合与请求资源路径对比,可以知道访问哪一个action,在通过<action>的class知道访问哪一个Action类,通过method知道访问哪一个方法。

2、使用通配符

使用通配符* 简化struts.xml 配置

JSP页面:

<a href="${pageContext.request.contextPath}/book/Book_add">book_add</a><br>
<a href="${pageContext.request.contextPath}/book/Book_update">book_update</a><br>
<a href="${pageContext.request.contextPath}/book/Book_delete">book_delete</a><br>
<a href="${pageContext.request.contextPath}/book/Book_search">book_search</a><br> 

action 配置:

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/book" extends="struts-default">
        <action name="*_*" class="cn.itcast.action.{1}Action" method="{2}">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

上面配置方法解说:

<action>中的name属性的值中每一个"*“代表长度不为0的任意字符串,name=”_"表示页面访问的action名称必须为为类似book_add.action、book _update.action形式。

如果在name属性定义了通配符之后,可以在class属性、method属性、<result>的name属性以及返回的jsp页面名字中都可以使用通配符,{1}代表第一个*,{2}代表第二个*。


3、动态调用

当在<action>中不配置method属性同时又不希望执行默认的execute方法时,可以使用动态方法调用,访问的方式为"action名"+"!"+“方法名”:

<a href="${pageContext.request.contextPath}/book/book!add">bookadd</a>

action配置

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" namespace="/book" extends="struts-default">
        <action name="book" class="cn.sunny.action.BookAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

Action 名称的搜索顺序

  1. 获取请求路径的URL,例如Url为:

<a href="${pageContext.request.contextPath}/path1/path2/path3/update.action">测试</a>

  1. 首先寻找namespace为/path1/path2/path3的package。如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第3步;
  2. 寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第4步;
  3. 寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为update的action,如果仍然不存在这个package,则去默认的namespace的package中寻找名字为update的action(默认的namespace值为"/"),如果还是找不到,页面提示找不到action。

package 中的默认值

  1. 如果没有为package指定namespace,则默认的namespace值为"/";
  2. 如果action中没有指定class,则默认的class为ActionSupport;
  3. 如果action中没有指定method,则默认的method为execute;
  4. 如果result中没有指定name,则默认的name为success。

result标签

  • 根据action方法的返回值,配置到不同的路径里面

  • 如果 action方法返回值为none 或者 返回类型void 可以不用加result标签,否则会报错

  • 标签属性

    • name属性: 和方法返回值一样,可以到不同的路径里面
    • type 属性
    • 配置如何到路径中,(转发或重定向)
    • 属性默认值,做转发操作
  • 内容 :Struts(3) — 结果页配置


最后更新:2018.10.31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值