Struts2之Action
Struts2之Action
MVC模式中需要有一个控制器来负责浏览器与服务器之间的通信,实现用户与服务器的交互。在Struts2框架中实现这一功能的是Action,它是整个框架最核心的部分。Action负责存储数据和状态,与应用的具体业务逻辑打交道。
一、Action简介
实现Struts2框架的Action有两种方案:
- 实现框架所提供的Action接口
- 使用框架所提供的ActionSupport基类
无论使用哪一种都必须实现execute()方法,返回的则是逻辑视图名。
二、返回结果
Action执行完了之后的返回类型为字符串,也就是逻辑视图名,根据它才能控制页面跳转,所在位置为com.opensyphony.xwork2.action中,就是框架所定义的接口。
com.opensyphony.xwork2.action
package com.opensymphony.xwork2;
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
注意:对于返回类型的含义没有强制性要求,用户可以在控制器执行成功的情况下返回SUCCESS,并为之配置出错的返回页面,系统不会报错,但是出于对代码可读性和可维护性的考虑,还是按照返回类型的字面含义去配置它,例如Action正确执行则返回SUCCESS,出错则返回ERROR,需要返回到输入界面则返回INPUT等等。
Action中用到的是大写的返回类型名,而在配置文件struts.xml中则对应的是小写的字符串值,配置文件将控制器Action,返回结果类型以及物理视图对应起来。
三、execute()方法
Struts2中所有的Action都要实现execute()方法。用户的业务逻辑就是在该方法中处理,然后通过返回类型对到对应的视图,Action的作用就相当于Struts2改进的MVC模式的派发器作用。
实现execute()方法有两种方法,一个是实现com.opensymphony.xwork2.action接口,还有一种是从com.opensyphony.xwork2.ActionSupport基类派生。
方法一:实现Action接口
public class helloworld implements Action {
public String execute() {
return logicView;
}
}
可以看出实现Action的接口要求很简单,同时分析上下文给出的Action源文件可以发现功能有限,没有给出开发者所需的额外功能,因此这样的实现方法比较适合简单的Action,对于稍复杂的应用应该考虑使用继承ActionSupport基类。
方法二:继承ActionSupport基类
public class helloworld extends ActionSupport {
public String execute() {
return logicView;
}
}
表面上这两个Action没有太大的差别,都是实现了execute方法,然后返回一个字符串类型的逻辑视图。ActionSupport除了提供近30的成员函数涵盖了国际化、校验、出错处理等各个方面来处理用户的业务逻辑。所以如果用户的业务逻辑不是足够简单的话,就应该选择从ActionSupport基类中派生出自己的Action。
P.S.
一般来说接口要比较常用些,这次看到一个继承比接口要牛叉的了。
ActionSupport基类中有很多很有用的成员函数,这里就不一一列出来了,但不是所有的都会经常使用,一般常用的都是些出错处理函数,如hasErrors()、hasFieldErrors()等等。
ActionSupport源代码来自:com.opensyphony.xwork2.ActionSupport
package com.opensymphony.xwork2;
public class ActionSupport implements Action,Validateable,ValidationAware,TextProvider,LocaleProvider,Serializable,ContinuableObject {
protected transient static final Log LOG = LogFactory.getLog(ActionSupport.class);
private transient final TextProvider textProvider = new TextProviderSupport(getClass(),, this);
private final ValidationAwareSupport validationAware = new ValidationAwareSupport();
// 设置 Action 级别的所有错误
public void setActionErrors(Collection errorMessages) {
validationAware.setActionErrors(errorMessages);
}
// 获得 Action 级别的错误集合
public Collection getActionErrors() {
return validationAware.getActionErrors();
}
/*省略语句*/
public Map getErrors() {
return getFieldErrors();
}
/*省略语句*/
public Locale getLocale() {
return ActionContext.getContext().getLocale();
}
// 基于键获得指定的键值,不存在则返回 NULL
public String getText(String aTextName) {
return textProvider.getText(aTextName);
}
// 向 Action 添加一个 Action 级别的错误
public void addActionError(String anErrorMessage) {
validationAware.addActionError(anErrorMessage);
}
/*省略语句*/
public String doInput() throws Exception {
return INPUT;
}
// 是否有 Action 级别的错误
public boolean hasActionErrors() {
return validationAware.hasActionErrors();
}
// 清除所有的错误和信息
public void clearErrorsAndMessages() {
validationAware.clearErrorsAndMessages();
}
// 默认的空校验器
public void validate() {
}
// 暂停 Action 的执行,抛出异常,并转向对应返回类型
public void pause(String result) {
}
}
果然ActionSupport类的内容还是挺丰富的。
ValidationAware这个类对于ActionSupport类是一个非常重要的类,所有的Error,Message和FieldError都间接存放在ValidationAware这个类中。
validationAware类源码:com.opensyphony.xwork2.validationAware
public class ValidationAwareSupport implements ValidationAware, Serializable {
private Collection actionErrors;
private Collection actionMessages;
private Map fieldErrors;
/*省略语句*/
}
由此可以看出,Error,Message是存放在Collection中,而FieldError存放在Map结构中。所以Action对这三个变量的操作其实是对这三种数据结构的操作。
四、Action实例
- 实现了Action接口,实现了execute方法
用来改变jsp中文本颜色 - 继承了ActionSupport基类,并重写了execute()方法
判断输入的参数是不是质数
五、Action中的校验初步
- 在Action的execute()方法中手动实现
- 使用ActionSupport类中的validate()方法
与基本的Action相比,ActionSupport实现了很多的成员函数,特别是为校验提供了很多的成员函数,而且ActionSupport更是实现了validate()方法,将检验与业务逻辑的流程独立开来。 - 使用注解校验
六、小结
- 阐述了 Struts2 中最基础、但同时也是最核心的Action,分别详细讲解了以实现Action接口和继承ActionSupport基类去实现一个Action,并对这两种方法的优缺点进行了比较。
- 通过分别通过两个例子验证这两种实现Action接口的方法,以期加深读者对这两者方式的印象。
- 接着介绍了简单的Action校验,校验是应用程序不可或缺的部分,而注释校验带来的便利是肯定的。
- 熟练掌握Action的编写是使用Struts2框架的基础,也是比较有技巧的一部分。
附:使用Struts2的注解校验
如果程序员不想自己写校验代码,也可以使用Struts2提供的校验功能代码。
同时Struts提供了注解来实现校验。
Struts2本身提供了许多校验器供供编程人员使用,这些校验器可以方便的校验像输入是否为空、是否符合特定的格式(比如Date格式、email格式)等规则。
Struts2每一种校验都有特定的类来实现。
编程过程中只要导入包com.opensymphony.xwork2.validator.annotations,就可以使用这些校验器。
要使用注解实现校验,可以按照一下的步骤
- 创建一个类或者接口,一般创建继承com.opensymphony.xwork2.ActionSupport的类。
- 为类创建字段变量,并为这些变量创建getter和setter方法
- 使用com.opensymphony.xwork2.annotations.Validation注解上面的Action类
告诉Struts2将为该类使用注解校验。 - 为setter()方法或execute()方法添加校验器。这里是实现对不同字段使用不同校验器的地方。注意使用哪个注解校验器就要导入对应校验器
例一,声明要使用注解了:
@Validation()
public calss AnnotationAction extends ActionSupport { }
例二,对setter()方法进行注解:
@IntRangeFieldValidator(
type=ValidatorType.FIELD,min="6",max="10",
message="age must between ${min} and ${max}, current value is ${bar}.")
public void setAge(int age) {
this.age = age;
}
例三,对execute()方法中的表达式进行注解:
expression = { @ExpressionValidator(
expression = "password == confirm",
message = "password must equal to confirm.
password=${password},confirm=${confirm}.})})
public String execute() throws Exception {
}
做了这个例子之后还是有错误:
- 把该写在jsp上写到了s if中去了,结果页面中啥都没有
- 另外field这个单词经常拼写成filed
- 验证功能还是挺强大的,利用现有资源可以少写很多代码
Struts2之Action的更多相关文章
- struts2的action是多例,servlet是单例
struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的 属性不一样,操作得出的 ...
- Struts2中Action接收参数的四种形式
1.Struts2的Action接收参数的三种形式. a. 使用Action的属性接收(直接在action中利用get方法来接收参数): login.js ...
- Struts2中Action取得表单数据的几种方法
Struts2中Action取得表单数据的几种方法 Struts2中Action获得表单数据的几种方法struts2 Action获取表单传值 1.通过属性驱动式JSP: <form act ...
- Struts2的Action(二)
Struts2的Action可以是一个POJO(即简单的javaBean),也实现Action接口,或者继承ActionSupport类. 1.Action接口: public interface A ...
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- struts1 和 struts2中Action什么时候实例化
精帖1:http://blog.csdn.net/lfsf802/article/details/7277013 精帖1:http://blog.csdn.net/wmj2003/article/de ...
- struts2的action从request获取参数值的几种方式
使用jquery框架的ajax能够方便的向后台传递参数,以$.post为例,参数有2种方式字符串和键值对:$.post(url, "name=aty&age=25")和$. ...
- struts2 修改action的后缀
struts2 修改action的后缀 struts2 的默认后缀是 .action 虽然很直观,但是很烦琐.很多人喜欢将请求的后缀改为 .do 在struts2中修改action后缀有两种比较简单的 ...
- 关于struts2中action请求会执行两次的问题
关于struts2中action请求会执行两次的问题 在struts2中发现,调用action中的方法,方法会被执行两次,后来发现调用的方法是get开头的,把它改为其他名称开头的后,就不会执行 ...
随机推荐
- Android中如何解决输入法键盘和activity页面遮挡的问题
不希望遮挡设置activity属性android:windowSoftInputMode="adjustPan" 希望动态调整高度android:windowSoftInputMo ...
- 同时使用python2和Python3
问题:thrift生成的是python2代码,之前使用的是Python3因此需要同时使用两个版本. 方案:将python3的可执行文件重命名为python3(默认为Python),这样使用pyhton ...
- Ueditor 1.4.3.1 使用 ThinkPHP 3.2.3 的上传类进行图片上传
在 ThinkPHP 3.2.3 中集成百度编辑器最新版 Ueditor 1.4.3.1,同时将编辑器自带的上传类替换成 ThinkPHP 3.2.3 中的上传类. ① 下载编辑器(下载地址:http ...
- LNMP环境简易安装流程
1.关闭防火墙 [root@CentOS ~]# chkconfig iptables off 2.关闭selinux vi /etc/sysconfig/selinux //将SELINUX=enf ...
- 往sde中导入要素类报错000732
sde可以成功连接,可以在Server中注册. 但是向sde中导入要素类报错000732,如图所示. 点击红色圆圈提示 ERROR 000732. 将路径修改为绝对路径即可,如下图所示.
- m=m++,结果让你大吃一惊。
如图,本来以为m=m++和m++是同一个效果,没想到m的值居然还是0. 原来m++是一个表达式,是有返回值的,它的返回值就是m自加前的值,Java对自加是这样处理的:首先把m的值(注意是值,不是引用) ...
- 在eclipse中将SVN项目check下来的正确步骤
学习下面的方法后再也不用从svncheck到本地后再导入到eclipse里了. 1. 首先Import,在弹出框里选择SVN-从SVN检出项目,然后按照提示一步一步直到选中了目标项目,然后点击next ...
- JS 获取 地址栏 参数
法一:正则表达式 /** * 采用正则表达式获取地址栏参数: **/ var GetQueryString = function (name) { var reg = new RegExp(" ...
- wpa gui
wpa gui是wpa_supplicant的ui工具. wpa_supplicant源码中包含了wpa_gui, 在目录wpa_gui-qt4中. 先运行wpa supplicant,再运行wpa ...
- github 或者gitlab 设置添加SSH, 避免每次提交重复输入用户名
克隆项目二种方式: 1. 使用https url克隆, 复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...