Struts2学习笔记(三)——Action详解
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详解的更多相关文章
- Struts2学习笔记二 配置详解
Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...
- Struts2学习笔记(二)——配置详解
1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...
- [C#] 类型学习笔记二:详解对象之间的比较
继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...
- [原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Android学习笔记之Activity详解
1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Struts2学习笔记(六)——Action处理请求参数
在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...
- Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY <源路径> .. ...
随机推荐
- jvm 加载class文件过程
jvm 加载class文件分为装载-链接-初始化三个过程. load -------->link verify prepare resolve ---------->initial ...
- 华为CloudIDE免费公测,带你出坑带你飞
你的代码仓库上线了吗?是不是有时候遇到这样的问题? 只想浏览一下代码,却发现线上浏览效果不佳,高亮显示什么的都没有.而在桌面端浏览要需要先同步代码,再用桌面端的IDE打开.尤其是使用git的时候,先要 ...
- 工具 | 代码调试利器fiddle介绍
我们开发的系统运行在用户的环境上,为了保护我们的代码和提升性能,前端javascript是经过压缩的.压缩的代码难于定位,当前只有chrome对压缩的代码支持格式化,但是变量和函数简化后,定位依然困难 ...
- ReactiveCocoa有关集合类的使用
Sequences 集合 表示一个不可变的序列值且不能包含空值, 1.实现NSArray的快速遍历 NSArray *numbers = @[@1, @2, @3, @4, @5, @6]; //通 ...
- RSA简介(一)——数论原理
RSA是最常用的非对称加密算法. 所谓非对称加密,就是说有两个密钥,一个密钥加密只可以用另外一个密钥解密,一般一个作为公钥,公开给所有人用来加密用,而另一个用来解密其他拥有公钥的加密结果,叫做私钥.另 ...
- year:2017 month:8 day:3
2017-08-03 JAVAse 1:静态变量和成员变量的区别: 所属不同:静态变量属于类,所以也称为类变量 成员变量属于对象,也称为实例变量 内存中位置不同:静态变量存储余方法区的静态区 成员变量 ...
- for’ loop initial declarations are only allowed in C99 mode
今天做南邮编程在线的编程题,编程首先计算Fibonacci数列1,1,2,3,5,8,13,21,......的前n项(n不超过40)存入一维整型数组f中,再按%12d的格式输出每项的值,每6项换一行 ...
- Docker实践 - 安装Docker并在容器里运行tomcat
安装Docker yum install docker 本文使用的系统是centos7,ubuntu使用以下命令 sudo apt-get update sudo apt-get install do ...
- Git时光机穿梭之管理修改
现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就是一个修改 ...
- Abp(.NetCore)开发与发布过程3-部署Ubuntu站点
以下是笔者在 Ubuntu 16.0-64bit 环境下 发布 ABP(.NetCore)的全过程.特此记录,希望对大家有所帮助. 准备的工具 1.PuTTY(ssh,如果不想每次都用阿里云的远程登录 ...