博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2之Action
阅读量:6257 次
发布时间:2019-06-22

本文共 5600 字,大约阅读时间需要 18 分钟。

Struts2之Action

MVC模式中需要有一个控制器来负责浏览器与服务器之间的通信,实现用户与服务器的交互。在Struts2框架中实现这一功能的是Action,它是整个框架最核心的部分。Action负责存储数据和状态,与应用的具体业务逻辑打交道。

一、Action简介

实现Struts2框架的Action有两种方案:

  1. 实现框架所提供的Action接口
  2. 使用框架所提供的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实例

  1. 实现了Action接口,实现了execute方法
    用来改变jsp中文本颜色
  2. 继承了ActionSupport基类,并重写了execute()方法
    判断输入的参数是不是质数

五、Action中的校验初步

  1. 在Action的execute()方法中手动实现
  2. 使用ActionSupport类中的validate()方法
    与基本的Action相比,ActionSupport实现了很多的成员函数,特别是为校验提供了很多的成员函数,而且ActionSupport更是实现了validate()方法,将检验与业务逻辑的流程独立开来。
  3. 使用注解校验

六、小结

  1. 阐述了 Struts2 中最基础、但同时也是最核心的Action,分别详细讲解了以实现Action接口和继承ActionSupport基类去实现一个Action,并对这两种方法的优缺点进行了比较。
  2. 通过分别通过两个例子验证这两种实现Action接口的方法,以期加深读者对这两者方式的印象。
  3. 接着介绍了简单的Action校验,校验是应用程序不可或缺的部分,而注释校验带来的便利是肯定的。
  4. 熟练掌握Action的编写是使用Struts2框架的基础,也是比较有技巧的一部分。

附:使用Struts2的注解校验

如果程序员不想自己写校验代码,也可以使用Struts2提供的校验功能代码。

同时Struts提供了注解来实现校验。

Struts2本身提供了许多校验器供供编程人员使用,这些校验器可以方便的校验像输入是否为空、是否符合特定的格式(比如Date格式、email格式)等规则。

Struts2每一种校验都有特定的类来实现。

编程过程中只要导入包com.opensymphony.xwork2.validator.annotations,就可以使用这些校验器。

要使用注解实现校验,可以按照一下的步骤

  1. 创建一个类或者接口,一般创建继承com.opensymphony.xwork2.ActionSupport的类。
  2. 为类创建字段变量,并为这些变量创建getter和setter方法
  3. 使用com.opensymphony.xwork2.annotations.Validation注解上面的Action类
    告诉Struts2将为该类使用注解校验。
  4. 为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 {}

做了这个例子之后还是有错误:

  1. 把该写在jsp上写到了s if中去了,结果页面中啥都没有
  2. 另外field这个单词经常拼写成filed
  3. 验证功能还是挺强大的,利用现有资源可以少写很多代码

转载地址:http://lixsa.baihongyu.com/

你可能感兴趣的文章
css
查看>>
装饰设计模式
查看>>
《Linux内核原理与分析》第八周作业
查看>>
企业级工作流解决方案(二)--微服务总体介绍
查看>>
Bonbo Git Server
查看>>
取消文件默认打开方式
查看>>
JVM 调试工具
查看>>
Linux C 语言 获取系统时间信息
查看>>
pku 1182 食物链
查看>>
echarts使用笔记四:双Y轴
查看>>
删除操作系统服务(Delete OS Service)
查看>>
effective JAVA 阅读笔记。
查看>>
Core Data: 多线程大量数据同步
查看>>
二分法查找
查看>>
浏览器推荐 --- 搜狗浏览器
查看>>
感冒 类型
查看>>
DataGridView 清空数据
查看>>
iis网站发布相关问题
查看>>
信息安全实验四:information-security
查看>>
【CF1141E】Superhero Battle
查看>>