在车水马龙的路口,交警负责指挥着一切的有序进行;在业务繁杂的Web应用中,Controller负责着一切的正常的执行。
对于使用Struts2框架进行开发的我们来说,Action就是这个Controller,它才是核心。我们要需要编写大量的Action类,并在struts.xml配置文件中配置Action。对于用户的请求,一般都是直接到达Action,它里面包含了大量的对用户请求的处理逻辑,根据业务对用户的请求进行中转,从而对请求者生成响应。
说了这么多,就说明一个事,Action很重要!!!那这篇文章就来说说在Struts2中该怎么去实现一个Action。
在《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类。
上面说了就算LoginAction
不继承任何基类或实现任何接口,Demo程序也可以很好的运行,那么为什么还要继承这个ActionSupport
基类呢?
在LoginAction
的execute
方法中,都会返回一个结果字符串,这里就会出现一个问题,有的人觉的失败了应该返回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