struts2学习之---Convention插件与"约定"支持

来源:互联网 发布:位面小蝴蝶知乎 编辑:程序博客网 时间:2024/06/05 22:51

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"/>
原创粉丝点击