Struts拦截器
使用过Struts2的开发人员都知道,Struts2的Action之所以如此强大(比如请求参数能够自动完成类型转换,并且填充到Action中的属性;Action中属性的一些验证),是因为在这个Action被调用之前(具体可以理解为Action.execute方法执行之前),有系列的拦截器为我们完成了很多任务。Struts2内置提供了10多种拦截器,常见的有Parameter拦截器、Validation拦截器和File Upload拦截器。虽然这些内置的拦截器可以满足我们绝大部分的项目需求,但是,需求是多变的,我们总会遇到我们要编写自定制拦截器来完成某个任务,下面讲讲怎么在Struts2中自定制拦截器,并附上具体的案例。
Struts拦截器的定制
Struts拦截器的定制需要我们自己的Struts拦截器实现Interceptor接口,Interceptor接口原型如下:
public interface Interceptor { void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception; } |
init方法:负责初始化资源
destroy方法:在对象销毁之前调用,负责销毁占用的资源
intercept方法:完成一些具体的任务
参数ActionInvocation:这个参数主要包含了两个对象,被调动的Action实例和一个Result实例。
并不是所有的Interceptor实现都会拥有资源的,如果每次都要我们去实现init方法和destroy方法,也是很令人厌烦的,所以Struts2为我们提供了AbstractInterceptor抽象类,这个类的原型如下:
public abstract class AbstractInterceptor { public void init() {} public void destroy() {} public abstract String intercept(ActionInvocation) throws Exception; } |
一个自己定制的intercor,应该如下:
public class MyInterceptor extends AbstractInterceptor { //code declear your resource here... //code getter and setter here.. public void init() { //code initial your resource here... } public void destroy() { //code release your resource here... } public String intercept(ActionInvocation invocation) { //code fufil your task return invocation.invoke(); } } |
Struts拦截器的注册
拦截器定义好了,还需要在struts.xm文件进行注册,我们需要在包下即package元素下去注册拦截器
<package name="somepackage" namespace="/" extends="struts-default"> <interceptor name="my" class="com.daniel.interceptor.MyInterceptor"/> </package> |
在interceptor元素下,可以配置param子元素,该子元素的属性有name,这个子元素可以将值注入到Interceptor的属性当中。
Struts拦截器实例
以下实例是通过拦截器为一个Action注入属性值。
拦截器MsgInjectionInterceptor
@SuppressWarnings("serial")
public class MsgInjectionInterceptor extends AbstractInterceptor {
/**
* 拦截器属性,通过<param>可以为拦截器属性注入值
*/
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
Action action = (Action) arg0.getAction();
try
{
MsgAction msgAction = (MsgAction) action;
msgAction.setMsg(msg);
}
catch(ClassCastException e)
{
e.printStackTrace();
}
return arg0.invoke();
}
}
Action类
@SuppressWarnings("serial")
public class MsgAction extends ActionSupport {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(msg);
return super.execute();
}
}
配置struts.xml
<package name="action" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="msgInjection" class="com.daniel.struts.interceptors.MsgInjectionInterceptor">
<param name="msg">hello</param>
</interceptor>
<interceptor name="appendMsg" class="com.daniel.struts.interceptors.AppendMsgInterceptor"></interceptor>
</interceptors>
<action name="MsgAction" class="com.daniel.struts.action.MsgAction">
<interceptor-ref name="msgInjection"></interceptor-ref>
<interceptor-ref name="appendMsg"></interceptor-ref>
<interceptor-ref name="basicStack"></interceptor-ref>
<result>/index.jsp</result>
</action>
</package>