http://blog.youkuaiyun.com/CMTobby/archive/2007/09/02/1769390.aspx
Struts2 官方文档在讲述配置的时候,一开始就来了个“ 0 配置” (Zero Configuration) ,大意就是说在 struts 应用中不使用任何 xml 文件或者 properties 文件,元数据 (Metadate) 都用通过约定 (convention) 和注解 (annotation) 来表达的,而且这是 struts2 的一个新特性,目前仍在测试中,相关文档也很粗略。接下来的一部分讲述的就是 Annotation ,我粗略的看了一下,估计它就是“ 0 配置”的核心所在,我拿文档中最简单的一个例子来看一下:
@Result(name= "success" , value= "/home.page" , type=TilesResult.class)
public class HomeAction extends ActionSupport {
// ...
}
红底的部分就是我们所说的 Annotation ,它说明这个当这个 action 返回值为 ”success” 时页面就跳转值 /home.pag ,就相当于我们在 struts.xml 中配置的 result 元素,采用了这个 Annotiation 之后我们就不用写配置文件了,实现了所谓的“ 0 配置”。一般我们在配置 actio 的时候都会出现多个 result ,这时 Annotation 就可以这么写:
@Results({
@Result(name= "success" , value= "/home.page" , type=TilesResult.class),
@Result(name= "homeError" , value= "/homeError.page" , type=tilesResult.class)
})
还有一个问题,如果没有配置文件我们如何知道去哪儿调用哪个 action 呢?为了完成这个功能我们需要这样配置 web.xml 文件:
<filter>
<filter-name> struts2 </filter-name>
<filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
<init-param>
<param-name> actionPackages </param-name>
<param-value> com.foo.bar,com.baz.quux </param-value>
</init-param>
</filter>
其实也没什么特殊的,就是给我们的 Controller 加了一个参数 actionPackages ,从字面上理解, Controller 将会从 com.foo.bar 和 com.baz.quux 这两个包中去寻找 action ,具体的流程是这样的:
1 .系统首先通过 web.xml 文件装载 FilterDispatcher 类,它要有 actionPackages 参数
2 . FilterDispatcher 会初始化一个 Dispatcher ,并传递 actionPackages 的值
3 . Dispatcher 会初始化一个 ClasspathConfigurationProvider 对象,用它来存放一个或多个Configuration Providers
4 . Dispatcher 给 ConfigurationManager 对象 增加一个 ClasspathConfigurationProvider 来处理 actionPackages 参数
5 . Someone 会调用 ClasspathConfigurationProvider 的loadpackages 方法
6 .Loadpackages 会首先利用ResolverUtil 从所列package( 就是 actionPackages 参数的值 ) 中找到所有实现了Action 接口和名字带有Action 后缀的类,然后这些类会集中放入一个Set 集合中,然后这个Set 中的每个类都会被传递给processActionClass 方法
7 .processActionClass 首先确定命名空间,然后捕捉任何ParentPackage 和Results 类型的Annotation ,接着创建一个ActionConfig ,设置action name ,package name 以及results 。
步骤7 获取action 名字的规则是这样的:将action name 从任何“Action ”后缀前面截取掉,如果action name 含有“/ ”的话,那么将最后一个“/ ”后面的第一个字母变为小写。还是举例来进行说明吧:
如果我们的 actionPackages 参数是 com.myapp.actions ,我们的Action 类是 com.myapp.actions. member .EditAction ,那么我们可以通过下面的url 来访问这个类:http://server/myapp/member/edit.action . 也就是子包(subpackage) 将成为namespace ,而action 类名将成为action name 。如果类名有一个“Action ”后缀,那么它将被去掉。
至此我们就实现我们的“0 配置”了,^_^ ,Annotation 在其中还是扮演着非常重要的作用的,除了我们前面已提到的Result Annotation 这个Action Annotations 外,还有Interceptor Annotations 、Validation Annotations 和Type Conversion Annotations ,因为项目中基本上没有用到这个新特性,我也就没有深入的看这些Annotations 的详细使用方法了。