Struts2 使用 Convention Plugin 实现零配置

Struts2中使用Convention Plugin(CP)实现零配置。

零配置并不是没有配置,而是通过约定来实现配置最小化,也就是人们常说的约定大于配置。

使用CP可以实现零配置。

1CP中,struts.convention.result.path配置可以指定结果页面文件存放的目录,默认的目录是/WEB-INF/content/,通过在struts.xml中配置:

<constant name="struts.convention.result.path" value="/WEB-INF/mytemplates/"/>

 将页面文件目录指定成/WEB-INF/mytemplates/目录 (struts.xmlstruts的主配置文件,它将覆盖其它依赖的配置文件中相同的配置项)

当然,也可以指定绝对路径(/WEB-INF/目录开始的路径),因此可以不需要此配置。建议使用绝对路径以更清晰的指定输出的页面文件路径。

2CP会自动扫描包名中存在strutsstruts2actionactions(1),类名以Action结尾的(2),并实现了com.opensymphony.xwork2.Action(3)的所有action(这里把(1)(2)(3)称为action的三要素)。这是CP扫描类的规则,这个规则也可以通过配置更改,但不建议更改,一般来说使用默认的足够了,应该尽量使程序简单化。

3,如何访问那些Actions

在以前那种配置文件中,访问action需要namespaceaction的资源名称两项

就以类com.example.actions.admin.IndexAction为例

首先它符合action三要素:包名存在actions关键字,类名以Action结尾,并且实现了com.opensymphony.xwork2.Action(假设),所以这个类能够被CP扫描到。

这个类的的namespace是什么?在CP中,namespace是在包名中以actions(或其它3个)开始之后的部分,如本例中的即是/admin

如何定位这个action的资源名称?按CP规则,类去掉Action,然后将大写字母转成小写,即得到它的资源名称,如例中的资源名称是index如果类名存在多个大写字母,如MyIndexAction,则所有转换成小写后以’-’分割,即my-index

至此,可以定位这个action的资源位置为:/admin/index.action(以action结尾是struts2的默认规则)

4,Action可以返回html页面,jsp页面,或者FreeMarkerVelocity这样的模板页面。如何定义返回内容?通过注解!

5,CP中同样也支持了大量的注解(Annotations),如@Action ,@Actions ,@Results,@Result ,@Namespace ,@ResultPath等,

建议不需要学那么多,@Results@Result 就足够了,因为使用太多注解为使程序复杂化,增加以后维护成本。简单性是程序设计追求的第一原则。

在类级别定义返回结果内容,例如

@Results({
  @Result(name="success", location="success.jsp"),
  @Result(name="error", location="error.ftl", type="freemarker")
})
public class TestAction extends ActionSupport {
  
  public String execute() {
    return SUCCESS;
  }

  public String error() {
    return ERROR;
  }
}

TestAction定义了两个结果类型,一个是返回successindex.jsp,另一个是返回errorerror.ftl模板页。

在方法级别也可以定义返回结果,但不建议(使程序复杂化了)

 

6,最后,当我们使用CP时,如果要加入自己的拦截器或者进行异常处理,则需要定义一个自己package,并继承convention-default package(这个package是导入CP后成为主package,它继承了struts-default),同时还要将struts.convention.default.parent.package配置将自己的package定义成主package

 

建议大家尽量使用CP的默认的配置,以最大程度实现零配置!

纯个人经验之谈,欢迎交流~

你可能感兴趣的:(struts2,plugin,convention,零配置)