通过在Struts2中使用struts.xml和Struts2注解结合来配置Action,可以简化配置文件代码量,又使配置变得更加灵活。在Strtus2中有以下几个注解:
- @ParentPackage:
- @Namespace:
- @Results和Result注解:
@ParentPackage:
它相当于<package>中的extends属性,也就是设置当前包的父包。其中它有一个value属性,它相当于<package>中的name属性值。
@Namespace
是用来指定当前包的命名空间的。它只有一个value属性,表示命名空间的名字。
@Results和@Result注解要在一起使用
@Results注解有一个@Result数组型的value 属性。
@Result注解有以下四个参数:
- name:String类型,表示结果名,默认是Action.SUCCESS。
- type: Class类型,相当于<result>标签的type属性,默认值是NullResult.class。
- value:String类型,结果值,可以是有效的Web资源URL。
- params:String[]类型。相当于<result>标签的<param>子标签。格式为{key1,key2..}
注意:Struts2注解有一个约定,Action名字就是名为XxxAction动作类的xxx。也就是说Action类为LoginAction,则Action类名为login。
以下是convention-plugin的约定:以下修改都是在Struts.xml中。
1、struts.convention.result.path
默认所有的结果页面都存储在WEB-INF/content下,通过设置struts.convention.result.path这个属性的值来改变到其他路径。
<constant name="struts.convention.result.path" value="/" />
这个表示所有的结果位于网站根目录下了。
2、struts.convention.package.locators
默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。通过设置struts.convention.package.locators属性来修改这个配置。
<constant name="struts.convention.package.locators" value="web,action" />
这个表示包路径包含web和action的将被视为Action存在的路径来进行搜索。
3、命名空间从定义的.package.locators标示开始到包结束的部分,就是命名空间。
Com.ustb.web.user.userAction的命名空间是:”/user”。
Com.ustb.web.user.detail.UserAction的命名空间是:”/user/detail”
实例分析:
@Action(value="wsh",results={ @Result( name="success" , location="success.jsp"),
@Result( name="login" , location="error.jsp" )})
public String execute() {
ActionContext context = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) context.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("wsh".equals(username) && "butterfly".equals(password)) {
return SUCCESS;
} else {
return LOGIN;
}
}
struts.xml文件中的内容如下:
<constant name="struts.convention.package.locators" value="action" />
<constant name="struts.convention.result.path" value="/" />