一、ActionSupport类

   com.opensymphony.xwork2.ActionSupport类时默认的动作类。只要某个动作声明没有给出一个动作类,Struts就会替它创建一个这个类的实例。在编写动作类时也需要对这个类进行扩展。该类提供了许多默认方法。这些方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。。如果让开发者的Action类继承该ActionSupport类,就会大大简化Action类的开发。

以下是ActionSupport类的源码:

package com.opensymphony.xwork2;import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {protected static Logger LOG = LoggerFactory.getLogger(ActionSupport.class);private final ValidationAwareSupport validationAware = new ValidationAwareSupport();private transient TextProvider textProvider;private Container container;public void setActionErrors(Collection<String> errorMessages) {validationAware.setActionErrors(errorMessages);}public Collection<String> getActionErrors() {return validationAware.getActionErrors();}public void setActionMessages(Collection<String> messages) {validationAware.setActionMessages(messages);}public Collection<String> getActionMessages() {return validationAware.getActionMessages();}/*** @deprecated Use {@link #getActionErrors()}.*/@Deprecatedpublic Collection<String> getErrorMessages() {return getActionErrors();}/*** @deprecated Use {@link #getFieldErrors()}.*/@Deprecatedpublic Map<String, List<String>> getErrors() {return getFieldErrors();}/*设置表单域校验错误信息*/public void setFieldErrors(Map<String, List<String>> errorMap) {validationAware.setFieldErrors(errorMap);}/*返回表单域错误校验信息*/public Map<String, List<String>> getFieldErrors() {return validationAware.getFieldErrors();}/*控制local的想关信息*/public Locale getLocale() {ActionContext ctx = ActionContext.getContext();if (ctx != null) {return ctx.getLocale();} else {if (LOG.isDebugEnabled()) {LOG.debug("Action context not initialized");}return null;}}public boolean hasKey(String key) {return getTextProvider().hasKey(key);}public String getText(String aTextName) {return getTextProvider().getText(aTextName);}/*返回国际化信息的方法*/public String getText(String aTextName, String defaultValue) {return getTextProvider().getText(aTextName, defaultValue);}public String getText(String aTextName, String defaultValue, String obj) {return getTextProvider().getText(aTextName, defaultValue, obj);}public String getText(String aTextName, List<?> args) {return getTextProvider().getText(aTextName, args);}public String getText(String key, String[] args) {return getTextProvider().getText(key, args);}public String getText(String aTextName, String defaultValue, List<?> args) {return getTextProvider().getText(aTextName, defaultValue, args);}public String getText(String key, String defaultValue, String[] args) {return getTextProvider().getText(key, defaultValue, args);}public String getText(String key, String defaultValue, List<?> args, ValueStack stack) {return getTextProvider().getText(key, defaultValue, args, stack);}public String getText(String key, String defaultValue, String[] args, ValueStack stack) {return getTextProvider().getText(key, defaultValue, args, stack);}/*** Dedicated method to support I10N and conversion errors** @param key message which contains formatting string* @param expr that should be formatted* @return formatted expr with format specified by key*/public String getFormatted(String key, String expr) {Map<String, Object> conversionErrors = ActionContext.getContext().getConversionErrors();if (conversionErrors.containsKey(expr)) {String[] vals = (String[]) conversionErrors.get(expr);return vals[0];} else {final ValueStack valueStack = ActionContext.getContext().getValueStack();final Object val = valueStack.findValue(expr);return getText(key, Arrays.asList(val));}}/*用于访问国际化资源包的方法*/public ResourceBundle getTexts() {return getTextProvider().getTexts();}public ResourceBundle getTexts(String aBundleName) {return getTextProvider().getTexts(aBundleName);}/*添加错误信息*/public void addActionError(String anErrorMessage) {validationAware.addActionError(anErrorMessage);}public void addActionMessage(String aMessage) {validationAware.addActionMessage(aMessage);}/*添加校验字段的错误信息*/public void addFieldError(String fieldName, String errorMessage) {validationAware.addFieldError(fieldName, errorMessage);}/*默认input方法,访问INPUT字符串*/public String input() throws Exception {return INPUT;}/*默认处理用户请求的execute方法,直接返回SUCCESS字符串*/public String execute() throws Exception {return SUCCESS;}public boolean hasActionErrors() {return validationAware.hasActionErrors();}public boolean hasActionMessages() {return validationAware.hasActionMessages();}public boolean hasErrors() {return validationAware.hasErrors();}public boolean hasFieldErrors() {return validationAware.hasFieldErrors();}public void clearFieldErrors() {validationAware.clearFieldErrors();}public void clearActionErrors() {validationAware.clearActionErrors();}public void clearMessages() {validationAware.clearMessages();}public void clearErrors() {validationAware.clearErrors();}/*清空错误信息的方法*/public void clearErrorsAndMessages() {validationAware.clearErrorsAndMessages();}/*空校验方法*/public void validate() {}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}public void pause(String result) {}private TextProvider getTextProvider() {if (textProvider == null) {TextProviderFactory tpf = new TextProviderFactory();if (container != null) {container.inject(tpf);}textProvider = tpf.createInstance(getClass(), this);}return textProvider;}@Injectpublic void setContainer(Container container) {this.container = container;}}
 ActionSupport类中除execute方法以外,还有许多其它方法提供给程序员使用。
eg:
如果想用自己的代码对用户输入进行验证,你需要覆盖validate方法;
如果想从属性文件里提取本地化的消息,可以选用getText方法的众多重载形式中的一种。

二、Action接口

为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。下面是标准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";/*定义处理用户请求的execute方法*/public String execute() throws Exception;}

该接口只定义了一个用于处理用户请求的execute方法和5个静态字段。execute方法必须返回一个字符串。5个静态字段的作用是统一该方法的返回值;

补充:

 如果想自己动手实现Action接口,而不是对ActionSupport类进行扩展,就必须自己提供一个execute方法的实现;一般来说,对ActionSupport类进行扩展要比自行实现Action接口简单的多。也即,对ActionSupport类进行扩展有助于编写动作类。

Struts2学习笔记(4)-ActionSupport类及Action接口详解相关推荐

  1. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  2. 【matcovnet学习笔记】objective,top1error,top5error详解

    [matcovnet学习笔记]objective,top1error,top5error详解 排名前1和前5的错误率是衡量某些解决方案成功与否的重要单位 ,要理解这三个概念,关键是要看懂下面这个多类误 ...

  3. python列表和元组的应用_python学习笔记之列表(list)与元组(tuple)详解

    前言 最近重新再看python的基础知识,感觉自己还是对于这些知识很陌生,需要用的时候还是需要翻书查阅,还是先注重基础吧--我要重新把python的教程阅读一遍,把以前自己忽略的部分学习,加强练习和记 ...

  4. 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

    本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...

  5. 2021-06-20-刘铁猛C#语言入门详解-学习笔记P20、21、22事件详解

    P20.21.22事件详解 一.P20.21.22内容总结 事件的概念P20 事件的应用P21:四个实例 事件的声明P22 问题辨析P22:事件与委托的关系 二.事件的概念P20 事件的角色:使对象或 ...

  6. Apollo星火计划学习笔记第六讲——Apollo感知模块详解实践2感知基础

    Apollo学习笔记 零.目录 一.Apollo感知框架介绍 1.1 检测和分类 1.2 跟踪 1.3 感知模块代码结构 1.3.1 感知模块入口 二.Lidar障碍物检测.红绿灯识别 2.1 Lid ...

  7. 【C++】【学习笔记】【递归与回溯问题详解与例题】排列问题;组合问题;二维平面回溯;flood fill问题;搜索问题(八皇后);

    目录 七.递归和回溯 1.回溯 2.回溯应用 - 排列问题 2.回溯应用 - 组合问题 3.回溯应用 - 二维平面 4.回溯应用 - floodfill算法 问题 4.回溯应用 - 搜索问题 - 八皇 ...

  8. [学习笔记 ]IAR的链接配置.icf文件详解——RT1052芯片的链接文件

    本文主要通过以下几个部分解释IAR中的链接配置icf文件: 1.参考解析IAR的ILink链接器icf配置文件介绍icf文件作用以及icf文件主要内容: 2.介绍icf常使用的命令 3.RT1052芯 ...

  9. Flutter学习笔记08-Padding Row Column Flex Expanded组件详解

    学习视频地址:https://www.bilibili.com/video/BV1S4411E7LY?p=27&spm_id_from=pageDriver&vd_source=cee ...

  10. Apollo星火计划学习笔记——第四讲Part2 Apollo定位模块详解与实践

    引言 内容概要,学习目标 了解自动驾驶定位的作用 熟悉常见的自动驾驶定位方法 掌握整个Apollo定位模块框架 独立开发定位模块 1. 定位的作用 1.1 定位及其相关知识点 定位: 获取当前的地理位 ...

最新文章

  1. 报错提示:java.lang.IllegalArgumentException: Target must not be null
  2. Linux下Tomcat的启动、关闭、杀死进程
  3. php 头部utf8,PHP去掉utf8格式文件中的bom头部_PHP教程
  4. 杂项-权限管理:RBAC
  5. android camera 实时滤镜,【Camera】Android平台Camera实时滤镜实现方法
  6. [游戏引擎中文版]YU-RIS 4.5 最新中文支持版
  7. 从“删库跑路”这件事聊聊数据安全那些事
  8. vue中进度条写法_vue实现简单loading进度条
  9. 磁盘工具无法修复磁盘怎么办
  10. java selenium sleep_【转】java-selenium三种等待方式
  11. Scrapy基础(八)————图片下载后将本地路径添加到Item中
  12. 程序员到CTO的Java技术路线图
  13. Nokia Symbian PKG sis文件就会及时更新了
  14. Bugku:杂项 啊哒
  15. 【matplotlib】21.多图合并【python3、numpy、pandas、matplotlib完结】
  16. 交互设计师必备的9种能力
  17. VMWare 虚拟机如何通过新增挂载点的方式扩展磁盘空间
  18. 消除Pe177,pe150警告
  19. RedisDesktopManager源码编译windows版(基于2022.1版本)
  20. hashmap是无序的但是实际输出有序?

热门文章

  1. 【非参数统计01】非参数统计基本概念:假设检验,经验分布,ARE,分位数,秩检验,U统计量
  2. 防火墙中查看用户流量
  3. 酒店管理系统数据库设计说明书
  4. E-prime 行为实验设计
  5. 游戏缺少d3dx9_XX.dll文件的解决办法
  6. Mac电脑查看JDK文档,CHM格式文档阅读
  7. NEWSCTF第二届--官方wp(2021.6.1萌新赛)
  8. PHP 基于 SW-X 框架,搭建RPC微服务支持
  9. C4D多边形建模快捷键
  10. 对饿了么app进行思维导图的分析