Struts2中使用Convention Plugin(CP)实现零配置。
零配置并不是没有配置,而是通过约定来实现配置最小化,也就是人们常说的约定大于配置。
使用CP可以实现零配置。
1,CP中,struts.convention.result.path配置可以指定结果页面文件存放的目录,默认的目录是/WEB-INF/content/,通过在struts.xml中配置:
<constant name="struts.convention.result.path" value="/WEB-INF/mytemplates/"/>
将页面文件目录指定成/WEB-INF/mytemplates/目录 (struts.xml是struts的主配置文件,它将覆盖其它依赖的配置文件中相同的配置项)
当然,也可以指定绝对路径(从/WEB-INF/目录开始的路径),因此可以不需要此配置。建议使用绝对路径以更清晰的指定输出的页面文件路径。
2,CP会自动扫描包名中存在struts、struts2、action或actions的(1),类名以Action结尾的(2),并实现了com.opensymphony.xwork2.Action类(3)的所有action类(这里把(1)(2)(3)称为action的三要素)。这是CP扫描类的规则,这个规则也可以通过配置更改,但不建议更改,一般来说使用默认的足够了,应该尽量使程序简单化。
3,如何访问那些Actions?
在以前那种配置文件中,访问action需要namespace和action的资源名称两项
就以类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页面,或者FreeMarker、Velocity这样的模板页面。如何定义返回内容?通过注解!
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定义了两个结果类型,一个是返回success的index.jsp,另一个是返回error的error.ftl模板页。
在方法级别也可以定义返回结果,但不建议(使程序复杂化了)。
6,最后,当我们使用CP时,如果要加入自己的拦截器或者进行异常处理,则需要定义一个自己package,并继承convention-default package(这个package是导入CP后成为主package,它继承了struts-default),同时还要将struts.convention.default.parent.package配置将自己的package定义成主package。
建议大家尽量使用CP的默认的配置,以最大程度实现零配置!
纯个人经验之谈,欢迎交流~