玩技术,Geeker
一个原创技术文章分享网站

Struts2学习之实现Action

前言

在车水马龙的路口,交警负责指挥着一切的有序进行;在业务繁杂的Web应用中,Controller负责着一切的正常的执行。

对于使用Struts2框架进行开发的我们来说,Action就是这个Controller,它才是核心。我们要需要编写大量的Action类,并在struts.xml配置文件中配置Action。对于用户的请求,一般都是直接到达Action,它里面包含了大量的对用户请求的处理逻辑,根据业务对用户的请求进行中转,从而对请求者生成响应。

说了这么多,就说明一个事,Action很重要!!!那这篇文章就来说说在Struts2中该怎么去实现一个Action。

再看LoginAction

在《Struts2学习之初见Struts2》这篇文章中,基于Struts2框架实现了一个小Demo程序,我们再回过头来看看这个小Demo程序中的LoginAction。将这个LoginAction类简化一下,就得到这样的一个Action框架:

public class LoginAction extends ActionSupport
{
    // 请求中带的属性
    private String attr1;
    private String attr2;

    public String getattr1()
    {
        return attr1;
    }

    public void setattr1(String attr1)
    {
        this.attr1 = attr1;
    }

    public String getattr2()
    {
        return attr2;
    }

    public void setattr2(String attr2)
    {
        this.attr2 = attr2;
    }

    public String execute() throws Exception
    {
        // 返回处理结果字符串
        return resultstr;
    }
}

这个LoginAction类继承自ActionSupport类,先不说这个ActionSupport类。在Struts2框架中,为了最大程度的解耦和重用代码,并没有要求我们实现的Action类去继承某个基类或者接口,就是说,我们不继承任何基类或实现任何接口,之前的Demo程序依然可以运行,这是其一。

Struts2通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,而且需要为这些属性提供对应的setter和getter方法,这是其二。

由于Struts2框架要调用我们编写的Action类中的某个方法来处理客户端请求,而这个方法就是execute(),不带任何参数,返回一个处理结果字符串即可,这是其三。

综上所述,实现Action并没有什么特定要求,就是一个普通的Java类和一堆setter和getter方法,外加一个不带参数的execute()的方法即可;所以说,做到上述三点,这就是一个Action类。

Action接口和ActionSupport基类

上面说了就算LoginAction不继承任何基类或实现任何接口,Demo程序也可以很好的运行,那么为什么还要继承这个ActionSupport基类呢?

LoginActionexecute方法中,都会返回一个结果字符串,这里就会出现一个问题,有的人觉的失败了应该返回error,而又有的人觉的失败了得返回failed;这就引起了一个问题,十个人可能就有十个返回样式,没有一个统一的返回值,以至于无形的就增加了项目维护成本。所以,为了让开发的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";
    public String execute() throws Exception;
}

Action接口只定义了一个execute方法和五个字符串常量,它的作用是统一execute方法的返回值。但是LoginAction却没有实现Action接口,而是继承了一个叫做ActionSupport的类,这又是为什么呢?

先来看看ActionSupport的定义:

/**
 * Provides a default implementation for the most common actions.
 * See the documentation for all the interfaces this class implements for more detailed information.
 */
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();
    }

    ...
}

可以看到ActionSupport是一个默认的Action实现类,它提供了许多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等;我们在编写Action类时,如果继承了ActionSupport类,则会大大简化Action的开发。

由于ActionSupport实现了Action接口,完全符合一个Action类的编写要求,所以我们可以直接使用ActionSupport作为业务控制器;而实际上,如果我们在struts.xml中配置Action时,没有指定class属性,系统则自动使用ActionSupport类作为Action处理类。

说了这么多,继承了ActionSupport就是为了方便开发者编写Action类;让开发者将注意力集中到业务的开发过程中去,而不是纠缠于这些细节的东东。

总结

之前有人就说我,你咋学的这么细?说实话,这些框架用起来的确很简单,因为框架就是为了提高开发效率,简化开发步骤,但是一旦程序出了问题,如果不能很好的驾驭这些框架的话,很可能为项目带来极大的风险;这就好比武林人士练功,内功不深,就去练九阳神功,到时候很有可能就走火入魔了。但话又说回来,我这里也是最基础的学习,还没有到达源码级别的分析,等把这里的基础总结完了,再深入源码一探究竟。

果冻想-一个原创技术文章分享网站。

2016年01月10日 于呼和浩特。

未经允许不得转载:果冻想 » Struts2学习之实现Action

分享到:更多 ()

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    For me & my husband, it has taken a cancer diagnosis and extended time away from our three kids to rattle our cage. We’re back home but of course nothing will be &#ra#0;no8m2l&28221; again and we are learning that this is a good (hard) thing.

    Arnie1周前 (03-16)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻