Struts2引入Convention(约定)插件支持零配置。约定优于配置。
一、约定Action
1.安装Convention插件
将Struts2项目下的struts-convention-plugin-2.2.1.jar文件复制到Struts2应用的WEB-INF\lib路径下即可,会搜索位于action、actions、struts、struts2包下的所有Java类,
Convention插件会把如下两种Java类当成Action 处理:
(1)所有实现了com.opensymphony.xwork2.Action的Java类。
(2)所有类名以Action结尾的Java类
Struts2的Convention插件还允许设置如下三个常量:
(1)struts.convention.exclude.packages:指定不扫描哪些包下的Java类
(2)struts.convention.package.locators:Convention插件使用该常量指定的包作为搜索Action的根包。对于actions.lee.LoginAction类,按约定原本映射到/lee/login;如果将该常量设置为lee,则该Action将会映射到/login。
(3) struts.convention.action.packages:Convention插件以该常量指定包作为根包来搜索Action。会搜索位于action、actions、struts、struts2包以及该常量定义的包下的所有Java类。
Action的URL映射
(1)如果该Action类名包含Action后缀,将该Action类名的Action后缀去掉。否则不做任何处理。如org.actions.LoginAction映射到/login.action
(2)将Action类名的驼峰写法转成中划线写法,如org.actions.books.GetBooks映射到/books/get-books.action
二、约定Result
Action处理用户请求之后会返回一个字符串作为逻辑视图,该逻辑视图必须映射到实际的物理视图才有意义。Convention默认也为作为逻辑视图和物理视图之间的映射提供了约定。
下图是Convention支持的一些映射实例:
三、Action链的约定
如果希望一个Action处理结束后不是进入视图页面,而是进行另一个Action形成Action链,则通过Convention插件只需遵守如下三个约定即可:
(1)第一个Action返回的逻辑视图字符串没有对应的视图资源
(2)第二个Action与第一个Action处于同一个包下
(3)第二个Action映射的URL为:firstactionName+ resultcode
四、自动重加载映射
配置Struts2的两个常量(web.xml、struts.xml、struts.properties都可进行配置):
<!-- 配置Struts2应用处于开发模式 -->
<constant name=”struts.devMode” value=”true”/>
<!-- 配置Convention插件自动重加载映射 -->
<constant name=”struts.convention.classes.reload”value=”true”/>
五、Convention插件相关Annotation
Struts2的Convention插件主要集中在管理Action和Result映射之上,而Struts2的配置文件除了管理Action、Result之外,还需要管理拦截器、异常处理等相关信息,Convention使用Annotation来管理这些配置。除此之外,Convention还允许使用Annotation管理Action和Result的配置,从而覆盖Convention约定。