受到大环境的影响:Sping、Hibernate、Struts等框架纷纷抛弃XML配置文件,改为使用Annotaction管理配置信息。
Struts2.1开始后,Struts2升级了“零配置”支持:抛弃了Codebehind插件,改为使用Convention插件,它完全抛弃了XML配置和Annotaction,改为根据“约定”来搜索Action,管理Action和Result映射。
一、Convention插件的相关常量
Convention插件主要解决Action管理、Result管理等常见、也最琐碎的配置。
常量名 | 说明 |
struts.convention.action.disableJarScanning | 设置是否从JAR包里搜索Action类,如果开发者喜欢将Action类打包成JAR,则应该将该常量设为tue,默认值为false |
struts.convention.action.packages | Convention以该常量指定包作为根包来搜索Action类 |
struts.convention.result.path | 设置Convention插件定位视图资源的根路径,默认为/WEB-INFO/content |
struts.convention.result.flatLayou | 如果设置为false,则可以将视图页面放置Action对应的目录(无需放入WEB-INFO/content) |
struts.convention.action.suffix | Convention搜索Action类的类名后缀,默认为Action |
struts.convention.action.disableScanning | 是否禁止通过包扫描Action,默认是false |
struts.convention.action.mapAllMatches | 设置即使没有@Action注释,依然创建Action映射。默认值为false |
struts.convention.action.checkImplementsAction | 设置Convention映射的Action所在包的默认父包。默认值是convention-default |
struts.convention.action.name.lowercase | 设置映射Action时,是否将Action的name属性值转换为所有字母小写,默认值是true |
struts.convention.aciton.name.separator | 设置映射Action时指定name属性值各单词之间的分隔符。默认值为中画线(“-”) |
struts.convention.package.locators | Convention插件使用该常量指定的包作为搜索Action的根包。默认值为action,actions,struts,struts2 |
struts.convention.package.locators.disable | 指定禁止从Action的根包里搜索Action。默认值为false |
struts.convention.exclude,packages | 指定排除在搜索Action之外的包。默认值为org.hibernate.* ... |
struts.convention.package.locators.basePackage | 如果指定了该常量,Convention只会以该常量值开始的包中搜索Action类 |
struts.convention.relative.result.types | 指定Convention映射的Result时默认支持的结果类型。默认值为dispatcher,velocity,freemarker |
struts.convention.redirect.to.slash | 设置是否重定向到斜线(/)。例如用户请求/foo,但/foo不存在时,如果设置该常量为可重定向到/foo/。默认值是true |
二、使用Convention
除了struts2的相关jar包外还需要引入:struts2-convention-plugin-2.1.6.jar
(1)、Aciton配置相关Annotation
与Action相关的两个Annotation是@Actions和@Action。
@Action主要用于修饰Action类里的方法,用于将该方法映射到指定的URL。相当与strus.xml文件中
value属性:指定该Action映射的URL
params属性:是一个字符串数组,用于将Action指定的参数名和参数值;格式:{"name1","value1","name}
@Action(value = "/login", //使用results属性为该方法指定Result映射 results = { @Result(name = "success", location = "/index.jsp")}) public String login() throws Exception { return "login"; }
@Actions 修饰类里的方法,用于将该方法映射到多个URL。
//使用@Actions将该方法映射成两个逻辑Action
@Actions({ @Action(value="/crazyit" ,params={"injectProp" , "疯狂Java联盟"}), @Action("/leegang") }) public String login() throws Exception { return "login"; }
(2)、Result配置相关的Annotation
与Result配置相关的Annotation:@ResultPath、@Result、@Results。
@result用于定义逻辑视图和物理视图之间的对应关系,相当于struts.xml中
name属性:必须属性,相当与
type属性:指定视图资源的类型,相当于
location属性:用于指定实际视图资源的位置。相当于
params属性:用于为该Result指定参数值,格式{name1,value1m,name2,value2...} 相当于
@ResultPath 则用于修饰包和Action类,用于改变被修饰Action所对应的物理视图资源的跟路径。
//namespace /abc/action @ResultPath("/zf") //为该Action指定2个Action级的Result映射 @Results({ @Result(name = "input", location = "/login.jsp"), @Result(name = "error", location = "/error.jsp") })
(3)、包和命名空间相关的Annotation
@Namespace:修饰Action类或其所在的包。
如:@Namespace(value="/zf")
@Namespaces:修改Action类或其所在的包。用于组合多个@Namespace
@ParentPackage:修饰Action类或其所在的包,用于指定被修饰的Action 所在包的父包
(4)、异常处理相关的Annotation
与异常相关的Annotation有@ExceptionMapping和@ExceptionMappings。
@ExceptionMapping 用于定义异常类和物理视图之间的对应关系,也就是相当于struts.xml 文件里的
@ExceptionMappings 用于组织多个@ExceptionMapping
//指定该Action到/abc目录下寻找物理视图资源 @ResultPath("/abc") //为该Action定义2个Action级的异常定义 @ExceptionMappings({ @ExceptionMapping(result="null" , exception = "java.lang.NullPointerException"), @ExceptionMapping(result="cantcast" , exception = "java.lang.ClassCastException") }) public class LoginAction { //使用@Action将该方法映射到/crazyit @Action(value="/crazyit", //使用exceptionMappings 属性为该方法指定异常定义 exceptionMappings = { @ExceptionMapping(result = "success" , exception = "java.sql.SQLException")} ) public String login() throws Exception { return "success"; } }
(4)拦截器配置相关的Annotation
与拦截器相关的Annotation有@InterceptorRef、@InterceptorRefs、@DefaultInterceptorRef。
@InterceptorRefs 用于组织多个@InterceptorRef。
value属性:为多个@InterceptorRef
@InterceptorRef 用于指定Action引用拦截器或者拦截器栈。相当于struts.xml中的
params属性:用于覆盖所引用该拦截器的默认参数值,格式满足{name1,value1,name2,value2,..} 相当于
@DefaultInterceptorRef 主要用于修饰包,用于指定该包的默认拦截器。相当于
value属性:指定默认拦截器的名字
三、相关配置
1、web.xml
struts2 org.apache.struts2.dispatcher.FilterDispatcher struts.convention.action.packages com.cn.actions struts2 /*
2、LoginAction.java
import org.apache.struts2.dispatcher.*; import org.apache.struts2.convention.annotation.*; public class LoginAction { //封装请求参数的username和password属性 private String username; private String password; private String injectProp; //依赖注入injectProp属性值的setter方法 public void setInjectProp(String injectProp) { this.injectProp = injectProp; } public String getInjectProp() { return this.injectProp; } //省略username和password的setter和getter方法 //username属性的setter和getter方法 public void setUsername(String username) { this.username = username; } public String getUsername() { return this.username; } //password属性的setter和getter方法 public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } //使用@Actions将该方法映射成两个逻辑Action @Actions({ @Action(value="/crazyit" ,params={"injectProp" , "疯狂Java联盟"}), @Action("/leegang") }) public String login() throws Exception { return "login"; } //将abc()方法映射到指定URL。 @Action("/other-url") public String abc() throws Exception { return "abc"; } }