Struts2的应用:自定制Interceptor拦截器

来源:互联网 发布:风中有朵雨做的云 知乎 编辑:程序博客网 时间:2024/05/03 02:23

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;
}一个Interceptor的实现类,可能会拥有一些资源,比如说文件、链接等等。

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;
}继承这个类,我们只需要实现intercept方法,就省事了。

一个自己定制的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();
  }
}需要注意的是,invocation.invoke()方法的调用会把当前ActionInvocation对象交给下一个Interceptor实例处理。

Struts拦截器的注册

拦截器定义好了,还需要在struts.xm文件进行注册,我们需要在包下即package元素下去注册拦截器

<package name="somepackage" namespace="/" extends="struts-default">
  <interceptor name="my" class="com.daniel.interceptor.MyInterceptor"/>
</package>一般对于name的命名是,如果你的类是xxxInterceptor,那么name命名就取用xxx

在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;}@Overridepublic String intercept(ActionInvocation arg0) throws Exception {// TODO Auto-generated method stubAction 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;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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>



0 0