Struts2的Convention插件 --- 基于注解的Action映射

来源:互联网 发布:电动缝纫机电机数据 编辑:程序博客网 时间:2024/05/29 03:44

新项目采用了Struts2的最新版本--Struts2.3.4,也摒弃了烦琐的配置文件,转而采用Annotation来配置Action映射,以前我没有接触过这方面的知识,最近一段时间了解不少相关知识,多是阅读网络博客所得,但大多博客是很零散而且并不完全正确,还有一点不好的就是大家转来转去,资源虽多,但大同小异,很少是自己敲键盘敲出来的。除了博客还看了本书,多少了解了一些相关内容,现在断断续续地写在这里,以免遗忘。

看网络博客Struts2以前是采用Codebehind作为零配置插件,从Struts2.1开始Codebehind就被遗弃了,而是改为使用Convention插件来支持零配置。和Codebehind相比,Convention插件更彻底,该插件可以完全抛弃配置信息,不仅不需要是使用struts.xml文件进行配置,甚至也可以不需要使用Annotation进行配置,而是由struts2根据约定自动配置(记得有人说过:约定优于配置)。

使用的jar包为struts2-convention-plugin-2.3.4.jar

Convention插件的jar包中有一个struts-plugin.xml配置文件,里面配置了大量的配置常量,这些常量都是可以改写的,只要在我们项目中的struts.xml配置文件中覆盖就可以了。插件的零配置约定也就是由这些常量来定义。

一、Action映射问题

默认情况下,Convention插件会自动搜索位于action,actions,struts,struts2包下的所有java类来寻找Action,并将action,actions,struts,struts2下的Action映射到根命名空间,它们的子包下的Action被按包路径组织成相应的命名空间。
如com.zyh.action.UserAction类被映射为/user.action,而com.zyh.action.user.UserAction则被映射为/user/user.action
这个是有常量配置的,就是在上面提到的xml文件中,如下:
<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>

当我们需要改变Action所在包时,可以将改常量覆盖,需要注意的是如果改变了改常量,那么Struts2的映射根路径也会改变。
如我们将该常量覆盖为: 
<constant name="struts.convention.package.locators" value="test"/>

那么test包下符合条件的Action被映射到根命名空间,其子包下的Action则按照包路径来组织命名空间。如
com.zyh.test.UserAction映射为/user.action,而com.zyh.test.user.UserAction映射为/user/user.action,以此类推。
默认情况下搜索结果会将以下两种类作为Struts2的Action:
1)实现了Action接口或者继承ActionSupport类的类。
2)以Action结尾的类(如UserAction)。这个也是可配的,在struts.plugin.xml文件中如下:  
<constant name="struts.convention.action.suffix" value="Action"/>

也就是说即使我们的类没有实现Action接口或者继承ActionSupport类,也同样可以作为Struts2的Action,不过有一点需要说明,在网络上我没有发现有将该问题说明白的,在我实验过程中,以Action后缀结尾的普通类(没有实现Action接口或者继承ActionSupport类)并不能总是被映射成Action,是有条件的,就是该类中应该有execute方法,如果没有,则无法被Convention插件识别。

这个结论不知道是不是权威,我也是看到介绍去实验,随便写了一个以Action结尾的普通类,却始终无法映射成Action,后来拷了一个其它项目的类(仅比前者多一个execute方法)却可以映射,据此得出结论,还有待验证。

二、Config-Browser插件

说到这,推荐一下Struts2的另一个插件struts2-config-browser-plugin-2.3.4.jar,有了它可以很方便的查看自己项目中的Action映射情况,使用很简单,将jar包拷至项目的类路径即可,启动服务器后在浏览器中输入:
http://localhost:8888/应用名/config-browser/index.action

可以查看常量配置、命名空间以及Action映射等信息。

三、Action的name问题

映射Action的name时,遵循如下规则:

1) 如果该Action类名包含Action后缀,将该Action类名的Action后缀去掉,否则不做任何处理。

2) 将Action类名的驼峰写法(每个单词首字母大写、其他字母小写的写法)转成中画线写法(所有字母小写,单词与单词之间以中画线-隔开)

这个也是可以配置的,配置如下:  
<constant name="struts.convention.action.name.separator" value="-"/>

示例:LoginAction映射的Acion的name属性为login,GetBooks映射的Action的name的属性为get-books,AddEmployeeAction映射的Action的name属性为add-employeet等等。

映射方法是用感叹号!来指定,即在Action的name后面用!+方法名的方式来指定访问的方法,如UserLoginAction的login方法,我们访问时应该如:user-login!login.action这样来访问。

四、Action返回视图资源的约定

默认情况下,Convention总会到WEB应用的WEB-INF/content路径下定位物理资源,定位资源的约定是:actionURL+result_code+suffix。当某个逻辑视图找不到对应的试图资源时,Convention会自动视图使用ActionURL+suffix作为物理视图资源。

如:actions.fore.LoginAction 返回success字符串时,Convention优先考虑使用WEB-INF/content/fore目录下的login-success.jsp作为视图资源。如果找不到该文件,login.jsp也可作为对应的试图资源。如果返回input字符串,Convention会将WEB-INF/content/fore里面查找login-input.jsp

视图资源位置的定义在struts-plugin.xml中也可以找到,默认定义如下:  
<constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
我们同样可以覆盖该定义,从而使其到我们指定的路径下寻找视图资源。


好多东西说起来挺复杂,用起来却更容易理解,struts2的convention插件东西也挺复杂,就记这一点,有空再补...
原创粉丝点击