• Struts2学习笔记(三)——Action详解


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

    1、Action的创建方式

    1) POJO类(PlainOldJavaObjects简单的Java对象),不需要继承任何父类,实现任何接口

    1 public class TestAction {
    2     public String execute() {
    3         return "success";
    4     }
    5 }

    这种方式是Struts2框架通过反射来实现的,步骤:

    • struts2框架通过读取struts.xml配置文件获得完整的Action类名;
    • object = Class.forName("完整类名").newInstance();
    • Method method = Class.forName("完整类名").getMethod("execute"); 
    • method.invoke(object); 

    2)实现Action接口

     1 public class TestAction implements Action {
     2     /**
     3      * 可以不重写execute方法,用自定义的方法,但是
     4      * 在配置文件中需要显示指定方法名method=要执行的方法
     5      */
     6     @Override
     7     public String execute() {
     8         return "success";
     9     }
    10 }

    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"; // 主要权限认证 (登陆页面)

    五种逻辑视图用来解决Action处理数据后,跳转页面

    3)继承ActionSupport类(推荐)

    其实ActionSupport类本身已经实现了Action接口,而且可以在Action中使用表单校验、错误信息设置、读取国际化信息三个功能,所以推荐使用。

     1 public class TestAction extends ActionSupport {
     2     /**
     3      * 可以不重写execute方法,用自定义的方法,但是
     4      * 在配置文件中需要显示指定方法名method=要执行的方法
     5      */
     6     @Override
     7     public String execute() {
     8         return "success";
     9     }
    10 }

    2、Action的访问

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

    1)基本访问

    在jsp页面中有下面的action访问路径:

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

    struts.xml的配置文件:

     1 <struts>
     2     <constant name="struts.devMode" value="true" />
     3     <package name="default" namespace="/book" extends="struts-default">
     4         <action name="add" class="cn.sunny.action.BookAction" method="add">
     5             <result name="success">/success.jsp</result>
     6         </action>
     7         <action name="update" class="cn.sunny.action.BookAction" method="update">
     8             <result name="success">/success.jsp</result>
     9         </action>
    10         <action name="delete" class="cn.sunny.action.BookAction" method="delete">
    11             <result name="success">/success.jsp</result>
    12         </action>
    13         <action name="search" class="cn.sunny.action.BookAction" method="search">
    14             <result name="success">/success.jsp</result>
    15         </action>
    16     </package>
    17 </struts>

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

    2)使用通配符

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

    jsp页面:

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

    action的配置:

    1 <struts>
    2     <constant name="struts.devMode" value="true" />
    3     <package name="default" namespace="/book" extends="struts-default">
    4         <action name="*_*" class="cn.itcast.action.{1}Action" method="{2}">
    5             <result name="success">/success.jsp</result>
    6         </action>
    7     </package>
    8 </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配置:

    1 <struts>
    2     <constant name="struts.devMode" value="true" />
    3     <package name="default" namespace="/book" extends="struts-default">
    4         <action name="book" class="cn.sunny.action.BookAction">
    5             <result name="success">/success.jsp</result>
    6         </action>
    7     </package>
    8 </struts>

    注意事项:在struts2的常量配置中有一项可以设置关闭动态方法调用,默认是允许:

    1 struts.enable.DynamicMethodInvocation = true

     3、Action名称搜索顺序

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

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

    2)首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第3步;

    3)寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第4步;

    4)寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为update的action,如果仍然不存在这个package,则去默认的namespace的package中寻找名字为update的action(默认的namespace值为"/"),如果还是找不到,页面提示找不到action。

    4、package配置中默认值

    1)如果没有为package指定namespace,则默认的namespace值为"/";

    2)如果action中没有指定class,则默认的class为ActionSupport;

    3)如果action中没有指定method,则默认的method为execute;

    4)如果result中没有指定name,则默认的name为success。

  • 相关阅读:
    INVALID_STATE_ERR: DOM Exception 11
    测试用户的网络环境
    CentOS修改IP、DNS、网关
    读《结网》
    命名函数表达式
    JavaScript中的编码函数
    linux下C程序printf没有立即输出的问题及我的Makefile文件
    学习使用vimperator
    thinkpad e40 安装 nvidia显卡驱动之后
    fedora:在命令行下删除文件到回收站
  • 原文地址:https://www.cnblogs.com/xiaolongSunny/p/4637486.html
Copyright © 2020-2023  润新知