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

1、Action的创建方式

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

 public class TestAction {
public String execute() {
return "success";
}
}

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

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

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

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

3)继承ActionSupport类(推荐)

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

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

2、Action的访问

在配置<action>元素时,没有指定method属性,默认执行Action类中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>

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

 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。

Struts2学习笔记(三)——Action详解的更多相关文章

  1. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

  2. Struts2学习笔记(二)——配置详解

    1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...

  3. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  4. [C#] 类型学习笔记二:详解对象之间的比较

    继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...

  5. [原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  7. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  8. Struts2学习笔记(六)——Action处理请求参数

    在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...

  9. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

随机推荐

  1. java中变量赋值的理解

    1.当赋值的值超出声明变量的范围时候,会报错! byte a =200 //会报错,因超出范围. byte a =(byte)200;//进行一个强制转换,就不会报错,不过会超出范围,超出部分会从头开 ...

  2. ubuntu(linux)新装系统恢复备份后无法进入系统问题的解决

    1. 引子: 可以跳过直接看3.~5. 我们可能会遇到这样的状况,从ubuntu转到别的系统,兜兜转转又回到了ubuntu. 比如说: Fedora升级后一大堆BUG,与java有关的软件渲染都糟糕的 ...

  3. 华为OJ之最长公共子序列

    题目描述: 对于两个给定的字符串,给出他们的最长公共子序列. 题目分析: 1,在之前的博文(http://www.cnblogs.com/yonguo123/p/6711360.html)中我们讨论了 ...

  4. 浮点数的陷阱--double i != 10 基本都是对的,不管怎么赋值

    #include <stdio.h>int main(){    double i;    for(i = 10; i != 10, i < 12; i += 0.1)       ...

  5. JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

  6. 使用travis-ci自动部署github上的项目

    travis-ci是什么? 一个使用yaml格式配置用于持续集成完成自动化测试部署的开源项目 官网:https://travis-ci.org/ 使用travis-ci集成vue.js项目 首先,您需 ...

  7. Android studio java.lang.UnsatisfiedLinkError

    最近开始转android Studio 本来以为新的开发工具会大大的提高效率 .结果我错了.今天踩了一天的坑. 我的项目中用到了so的文件.通常情况下在 eclipse中我们在libs/armeabi ...

  8. codeforces 475D. CGCDSSQ

    D. CGCDSSQ time limit per test 2 seconds memory limit per test 256 megabytes Given a sequence of int ...

  9. c3p0数据库连接池+mysql数据库基本使用方法

           一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接.因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒), 连接就会被自动释放掉. ...

  10. RSA简介(二)——模幂算法

    RSA最终加密.解密都要用到模乘的幂运算,简称模幂运算. 回忆一下RSA,从明文A到B B=Ae1%N 对B解密,就是 A=Be2%N 其中,一般来说,加密公钥中的e1一般会比较小,取65537居多, ...