struts2引入了Convention插件来支持零配置,不仅不需要使用srtuts.xml文件进行配置,甚至不需要使用Annotation进行配置。”约定优于配置”
1.Action的搜索和映射约定
开发者只需要将Struts2项目下的struts2-convention-plugin-2.3.16.3.jar文件复制到struts2应用的WEB-INF\lib路径下。
对于Convention插件而言,它会自动搜索位于action、actions、struts、struts2包下的所有Java类,Convention插件会把如下两种java类当成Acion处理:
- 所有实现了com.opensymphony.xwork2.Action的Java类
- 所有类名以Action结尾的Java类
struts2的Convention插件还允许设置如下三个常量: - struts.convention.exclude.packages:指定不扫描哪些包下的Java类
- struts.convention.package.locators:Convention插件使用该常量指定的包作为搜寻Action的根包。
- struts.convention.action.packages:Convention插件以该常量指定包作为根包来搜索Action类。
映射Action的name时,遵循如下两个规则: - 如果该Action类名包含Action后缀,将该Action类名的Action后缀去掉。否则不做任何处理。
- 将Action类名的驼峰写法(每个单词首字母大写、其他字母小写的写法)转成中划线写法(所有字母小写,单词与单词之间以中划线隔开)。
com.hyq.actions.LoginAction 映射到/login.action
com.hyq.actions.books.GetBooks 映射到/books/get-books.action
2.按约定映射Result
在默认情况下,Convention总会到Web应用的WEB-INF/content路径下定位物理资源,定位资源的约定是:actionName + resultcode + suffix。当某个逻辑视图找不到对应的视图资源时,Convention会自动试图使用actionName + suffix作为物理视图资源。
com.hyq.action.user.LoginAction返回success字符串时,Convention优先考虑使用WEB-INF\content\user目录下的login-success.jsp作为视图资源,如果找不到该文件,login.jsp也可作为对应的视图资源。
为了看到struts2应用里Action等各种资源的映射情况,struts2提供了Config Browser插件,该插件可以清楚地看出struts2应用下部署了哪些Action,以及每个Action详细的映射信息。struts2-config-browser-plugin-2.3.16.3.jar
Config Browser插件的首页地址为:Web_Context/config-browser/index.action
3.Action链的约定
希望一个Action处理结束后不是进入视图页面,而是进入另一个Action形成Action链,则通过Convention插件只需遵循如下三个约定:
- 第一个Action返回的逻辑视图字符串没有对应的视图资源。
- 第二个Action与第一个Action处于同一个包下。
- 第二个Action映射的URL为:firstactionName + resultcode
public class FirstAction extends ActionSupport{
public String execute(){
return "second";
}
}
public class FirstSecondAction extends ActionSupport{
public String execute(){
return SUCCESS;
}
}
4.自动重新加载
Convention插件完全支持自动重加载映射,可在web.xml、struts.xml、struts.properties文件中配置。
<!--配置struts2应用处于开发模式-->
<content name="struts.devMode" value="true"/>
<!--配置Convention插件自动重加载映射 -->
<content name="struts.convention.classes.reload" value="true"/>