学习目标:
1、了解Struts2的注解的使用
学习过程:
struts2除了提供xml的方式配置action外,还可以使用注解的方式进行配置,这样我们就可以实现“零配置”了,当然struts.xml这个总配置文件还是需要的。
一、导入注解的插件包
struts2-convention-plugin-2.3.16
二、使用注解
注解的功能和使用xml配置的功能是一样的,只不过是换了一种写法而已,struts2的常用的主机功能如下:
@ParentPackage,这个注解对应了xml文件中的package节点extends属性,继承父包,一般我们使用struts-default。
@Namespace,命名空间,也就是xml文件中<package>的namespace属性。
@Action,这个注解对应<action>节点。这个注解可以应用于action类上,也可以应用于方法上。这个注解中有几个属性:
value,表示action的URL,也就是<action>节点中的name属性。
results,表示action的多个result;这个属性是一个数组属性,因此可以定义多个Result。
interceptorRefs,表示action的多个拦截器。这个属性也是一个数组属性,因此可以定义多个拦截器。
params,这是一个String类型的数组,它按照name/value的形式组织,是传给action的参数。
exceptionMappings,这是异常属性,它是一个ExceptionMapping的数组属性,表示action的异常,在使用时必须引用相应的拦截器。
@Result,这个注解对应了<result>节点。这个注解只能应用于action类上。这个注解中也有几个属性:
name,表示action方法的返回值,也就是<result>节点的name属性。
location,表示view层文件的位置。
type,是result的类型,比如redirect、redirectAction等等
params(),是一个String数组。也是以name/value形式传送给result的参数。
我们可以新建一个GoodsAction类,实现代码如下:
//继承的父包和命名空间的配置
@ParentPackage("struts-default")
@Namespace("/goods")
public class GoodsAction extends ActionSupport {
//最简单的配置
@Action("listgoods")
public String listGoods() {
System.out.println("listgoods");
return SUCCESS;
}
//result的使用
@Action(value = "addgoods", results = {
@Result(name = "success", location = "/success.jsp", type = "redirect", params = {"abc", "liubao" }),
@Result(name = "error", location = "/error.jsp") })
public String addgoods() {
System.out.println("listgoods");
return SUCCESS;
}
//拦截器的引用
@Action(value = "updategoods", results = {
@Result(name = "success", location = "/success.jsp", type = "redirect", params = { "abc", "liubao" }),
@Result(name = "error", location = "/error.jsp") }, interceptorRefs = {
@InterceptorRef("timer"), @InterceptorRef("defaultStack") })
public String updategoods() {
System.out.println("listgoods");
return ERROR;
}
}
这样,我们就不需要为在xml配置文件中定义了。
三、注解和使用XML配置那个更好
注解和XML那个好一点?其实这是一个见仁见智的问题,完全是个人喜好。虽然使用配置文件可以使用通配符的方式实现零配置,但是不好维护;我们也可以使用<include>标签导入外部文件来实现模块化,但是配置起来还是显得有点麻烦。所以,我个人感觉注解使用起来相对容易一点,不用每一次写action类的时候都需要打开一个xm写l配置信息。
但是,struts.xml还是需要的,我们自定义的拦截器和resultType等等这些扩展功能还是需要在struts.xml中定义的。其他建议使用注解的方式。