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. 详解Android Activity---Activity的生命周期

    转载注明来自:  http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期:  Activity的生命周期大概可以归为三部分 整个的生命周期:o ...

  2. Spring Security @PreAuthorize 拦截无效

    1. 在使用spring security的时候使用注解,@PreAuthorize("hasAnyRole('ROLE_Admin')") 放在对方法的访问权限进行控制失效,其中 ...

  3. Java List Remove时要注意的细节

    1.如果你是在遍历的时候去remove一个对象 for(int i = 0, length = list.size(); i<length; i++){} 这种遍历需要每次remove时,对i- ...

  4. forEach( ) map( ) for( in ) for ( of )

    ====forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索 ...

  5. Spring Boot 使用Redis缓存

    本文示例源码,请看这里 Spring Cache的官方文档,请看这里 缓存存储 Spring 提供了很多缓存管理器,例如: SimpleCacheManager EhCacheCacheManager ...

  6. python基础(7):字符编码

    今天我们进入字符编码的学习.字符编码是一个多理论少结论的知识点,我会总结很多的知识点.我们只需要通读当作了解即可,最后我会总结需要我们理解掌握的重点. 一.学习字符编码的计算机基础储备 1.计算机软件 ...

  7. (转)log4j(五)——如何控制不同目的地的日志输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 package test.log4j.test5; /** * @author l ...

  8. iOS开发实战-时光记账Demo 网络版

    之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ...

  9. OpenFlow协议1.0及1.3版本分析

    OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...

  10. C#控制台应用程序之旅游资源与线路管理系统

    利用C#语言及SQL Server数据库编写的一个简化版旅游资源与线路管理系统 数据库中包含三张表:hotel表.tourist_spot表.lines表 用户分为管理员和普通用户,管理员拥有最高权限 ...