零配置(zero configuration)的意思是不使用任何配置文件部署struts2应用,如struts.xml、struts.properties等。零配置并不是真的“零配置”,只是没有传统的配置文件struts.xml了,但是仍然需要使用@Annotation配置。@Annocation翻译为@注解、@标注,有些资料也翻译为@注释。
1、通过@注解实现Actin零配置
在@注解大行其道的今天,基本所有的框架都提供了@注解支持,例如Spring框架、Hibernate框架、EJB框架、Tomcat服务器等。
struts2也提供了@注解配置。零配置的原理是在Action类中使用@注解定义Action资源,如@Namespace定义命名空间,一般不常用。@Results定义结果集,可以包括多个@Result。@Result定义一个结果集。例如:
action方法:
package com.lmb.struts2.action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Namespace(value="/test") //命名空间
@Results({ //结果集
//三个结果页面
@Result(name="success",location="/success.jsp"),
@Result(name="redirect",location="/redirect.jsp",type="ServletRedirectResult.class"),
@Result(name="login",location="/login.jsp")
})
public class AnnotatedAction extends ActionSupport{
public String execute(){
return "login";
}
public String add() {
return "success";
}
public String login() {
return "login";
}
}
代码使用标注定义了namespace为/test,定义了3个Result,其中一个是重定向页面。struts2并没有提供配置Action访问名称的注解。该action可以使用默认的名称/struts2/annotated.action访问,即去掉类名中的Action,同时首字母小写。如果访问其中的add()方法,可以用
/struts2/annotated!add.action。如果配置了namespace=”/test”,则必须以/struts2/test/annotated.action访问。注意namespace必须以“/”开头。
2、web.xml中指定Action目录
零配置时必须在web.xml的Filter中指定被@注解标注的Action包的位置。参数actionPackages指定被@注解标注的Action所在的Package,否则会默认到struts.xml中加载Action配置。零配置时只加载有@注解的Action,不会加载没有@注解的Action。例如:
<!-- struts2的Filter,所有的请求都被映射到struts2上 -->
<filter>
<filter-name>struts2</filter-name>
<!-- Filter分发器实现 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name><!-- 零配置Action所在的包 -->
<param-value>com.lmb.struts2.action</param-value> <!-- 包名 -->
</init-param>
</filter>
struts加载时会自动部署本package吓得送油Action。如果某个Action位于本package下的另一个package下面,例如:com.lmb.struts2.action.test,则“/test”会被当成该Action的namespace。默认的“/test”也可以用@Namespace标注覆盖。
如果声明了actionPackages参数,则struts.xml中的配置会失效。目前,struts2只允许使用一种配置方式,要么使用struts.xml,要么使用零配置。未来版本中应该可以同时使用,请查阅室及使用的struts2版本。
更多更详细的struts2零配置请参看struts2的文档和其他博客:
http://struts.apache.org/docs/convention-plugin.html#ConventionPlugin-Annotationreference
http://www.cnblogs.com/fpjason/archive/2009/08/01/1536671.html
3、零配置的Action访问方式
目前,零配置时只能用action!method.action即“类名!方法名.action”的形式访问Action的方法。例如运行PersonAction的login()方法可以使用
http://localhost:8080/struts2/person!login.action.