Annotation对Struts2.x的支持
Struts2.x如要想要使用Annotation,则需要导入asm-3.3.jar、asm-commons-3.3.jar和struts2-convention-plugin-2.3.37.jar。并且修改web.xml文件,使其支持Annotation。
在web.xml文件里的filter元素里加入init-param元素,如下所示:
<init-param>
<param-name>actionPages</param-name>
<!--所有需要使用Annotation的Action类都应该放在此包中-->
<param-value>com.bank.action</param-value>
</init-param>
所有Struts2.x项目的开发都离不开Struts.xml文件,如果使用Annotation进行开发,则需要在Struts.xml文件中设置一些通用配置,示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 是否开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 添加包并配置在根目录下,添加全局配置,以供其它包继承 -->
<package name="root" namespace="/" extends="struts-default">
<!-- 适用于整个项目的拦截器配置 -->
<interceptors>
<interceptor name="MyInterceptor" class="com.bank.interceptor.MyInterceptor" />
<interceptor-stack name="initInterceptor">
<interceptor-ref name="MyInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 设置全局跳转路径 -->
<global-results>
<result name="input">pages/errors.jsp</result>
<result name="forward">pages/forward.jsp</result>
</global-results>
</package>
</struts>
使用注解配置Action
Struts2提供了四个与Action相关的注解,分别为ParentPackage、Namespace、Result和Action。
- ParentPackage注解用于指定Action所在包要继承的父包,该注解只有一个value参数,用于指定要继承的父包。
- Namespace注解用于指定Action所在包的命名空间。该注解只有一个value参数,用于指定Action所属于的命名空间。
- Result注解用于定义一个Result映射,该注解包含四个参数,如下:
- name:可选参数,用于指定Result的逻辑名,默认值为success。
- location:必选参数,用于指定Result对应资源的URL。
- type:可选参数,用于指定Result的跳转类型,例如:redirect、dispatcher等。
- params:可选参数,用于为Result指定要传递的参数,格式为:{key1,value1,key2,value2,…}
- Action注解对应于struts.xml文件中的action元素。该注解可用于Action类上,也可用于方法上,该注解包含以下属性:
- value:可选参数,表示Action的名字。
- results:可选参数,表示Action的多个Result映射,该属性用于定义一组Result映射。也可用@results实现相同的功能。
- interceptorRefs:可选参数,表示Action的多个拦截器,该属性用于定义一组拦截器。
- params:可选参数,表示传递给Action的参数,格式为:{key1,value1,key2,value2,…}
- exceptionMappings:可选参数,用于指定Action的异常处理类。它是一个Exception-Mapping的数组属性。
【范例】: 在web.xml文件中声明的包下定义一个Action,并添加注解:
package com.bank.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.*;
@SuppressWarnings("serial")
@ParentPackage("root")
@Namespace(value="/pages")//定义了自己的命名空间
@Action(value="TestAction")
@Results(value = {
@Result(name="success",location="/pages/hello.jsp",type="dispatcher"),
@Result(name="error",location="/pages/error.jsp",type="redirect")
})
public class TestAction extends ActionSupport {
public String hello(){
String msg = super.getText("message.gub");
ServletActionContext.getRequest().setAttribute("msg",msg);
return ActionSupport.SUCCESS;
}
@Actions(value={
@Action(value="Hello"),@Action(value="Insert")
})
public void insert(){
System.out.println("======insert======");
}
}
使用注解配置拦截器
Struts2中编写的Action如果想使用Annotation的方式进行拦截器的配置,则可以使用以下两个注解:
- InterceptorRef注解用于指定本Action要配置的Interceptor,该注解只有一个value参数,用于指定要配置的Interceptor名称(如果是自己定义的Interceptor,则需要先在Struts.xml文件中注册)
- InterceptorRefs注解包含多个InterceptorRef注解,可以为本Action配置多个拦截器。该注解只有一个value参数,用于指定要配置的多个InterceptorRef。
【范例】:
@InterceptorRef(value="timer")//配置一个Interceptor
@InterceptorRefs(value={//配置多个Interceptor
@InterceptorRef(value="timer"),
@InterceptorRef(value="MyInterceptor"),
@InterceptorRef(value="defaultStack")
})