从struts2.1开始,struts2不再推荐用CodeBehind作为零配置插件,而是使用Convention插件来支持零配置。
Struts2的Convention插件的特点是“约定优于配置”
1、使用Convention插件
将struts2-convention-plugin.jar放置到应用的/WEB-INF/lib下即可。
对于Convention插件而言,他会自动搜索位于action,actions,struts和struts2包下的java类,将两种java类当做Action来处理:
1)所有实现了Action接口的java类
2)所有以Action结尾的java类
Convention插件有三个常量,分别为:
1)struts.convention.exclude.packages:指定不扫描哪些包下的java类,这些包下的Java类不会被映射成Action
2)struts.convention.package.locators:使用该常量指定的包作为搜寻Action的根包。例如:对于action.lee.LoginAction类,按约定原本应该映射到/lee/login,如果设置该常量为lee,那Action将会被映射到/login
3)struts.convention.action.packages:struts2除了会扫描action,actions,struts和struts2包之外,还会以该常量指定的包作为根包来搜索Action。
2、映射Action的约定
2.1 命名空间
action,actions,struts,struts2被映射成根命名空间,这些包下的子包被命名成相应的命名空间。例如com.hy.cc.actions.book.GetBooks映射的Action的命名空间就是/book
Action的name属性,根据类名来映射,遵循两步原则:
1)如果该Action类名包含Action后缀,则将Action类名的Action后缀去掉,否则不做任何处理。
2)将Action类名的驼峰写法转换成中线写法(所有字母小写,单词和单词之间以中画线隔开)。
例如:LoginAction映射成login,GetBooks映射成get-books,AddEmployeeAction映射成add-employee。
3、映射Result的映射
默认情况下,Convention总会到WEB-INF/content路径下定位物理资源,定位资源的约定是:actionurl+resultcode+suffix,如果找不到对应的视图资源,Convention会试图用actionurl+suffix作为物理资源视图。
例如:actions.lee.LoginAction返回success字符串时,Convention优先考虑使用/WEB-INF/content/lee目录下的login-success.jsp作为视图资源,如果找不到,login.jsp也可以作为视图资源。
4、Aciton链的约定
如果一个Action结束后,不进入视图页面,而是进入另外一个Action,形成Action链,需要遵守三个约定:
1)第一个Action返回的逻辑视图没有对应的视图资源
2)第二个Action和第一个Action放在同一个包下。
3)第二个Action映射的地址为:firstactionurl+resultcode
前面的配置虽然简单,但是只能映射Action和Result,无法映射如拦截器、异常处理等信息,Convention使用Annotation来管理这些信息,并且可以用Annotation来管理Action和Result,从而覆盖Convention的约定
5、Annotation
5.1 Action相关的Annotation
@Action修饰Action类里的方法,用于将该方法映射到指定的URL。
@Action可以指定一个value值,用于指定该Action映射的URL
@Action可以指定一个params属性,用于指定参数名和参数值。
@Actions也用于修饰Action类里的方法,将该方法映射成多个URL。
5.2 Result相关的Annotation
与Result配置相关的三个Annotation分别是@Result,@Results和@ResultPath
@Result用于定义逻辑视图和物理视图之间的关系,属性包括:
1)name:必选。相当<result/>中的name属性的作用。
2)type:可选。相当<result/>中的type属性的作用。
3)location:可选。相当于<result></result>中间部分的内容,用于指定实际物理视图的位置。
4)params:可选,参数设置。
@Result的两种用法:
1)Action级的Result映射。
2)方法级别的Result映射。
@Results:用于组织多个@Result。
@ResultPath:用于修饰包和Action类。
例子:
5.3 包和命名空间相关的Annotation
@Namespace:修饰Action及所在包的命名空间。
@Namespaces:组织多个Namespace。
@ParentPackage:指定Action所在包的父包。
5.4异常处理相关的Annotation
@ExcepitonMapping 和 @ExceptionMappings
5.5 拦截器相关的Annotation
@InterceptorRef 和 @InterceptorRefs