您的位置:首页 > 编程语言 > Java开发

Struts2学习笔记五 拦截器

2017-08-08 18:41 381 查看
拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

Struts2中,拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取Action中可重用的部分的方式。

拦截器链:就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

拦截器的实现原理

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。

Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

自定义拦截器

方式1:实现Interceptor接口

//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
@Override
//初始化方法
public void init() {

}

@Override
//拦截方法
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}

@Override
//销毁方法
public void destroy() {

}
}


方式2:继承AbstractInterceptor类

//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {

@Override
public String intercept(ActionInvocation arg0) throws Exception {

return null;
}

}


方式3:继承MethodFilterInterceptor类

//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
//    定制哪些方法需要拦截.
//    定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{

@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = invocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");

return result;
    //return "success";//不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转
}

}


只有当自定义的拦截器需要打开系统资源时,才需要覆盖init()方法和distory()方法。所以继承会更方便。

拦截器的配置

步骤1:注册拦截器

要想让拦截器起作用,首先要对它进行配置。定义拦截器的语法格式如下:

<interceptors>
<!--name指定拦截器的名称,class指定拦截器实现类-->
<interceptor name="interceptorName" class="interceptorClass">
<!--可选,name指定参数的名称 ;paramValue指定参数的值-->
<param name="paramName">paramValue</param>
</interceptor>
</interceptors>


比如:

<?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>
<package name="inter" namespace="/" extends="struts-default" >
<interceptors>
<!-- 1.注册拦截器 -->
<interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>
<!-- 2.注册拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
<interceptor-ref name="myInter3">
<!-- 指定哪些方法不拦截
<param name="excludeMethods">add,delete</param> -->
<!-- 指定哪些方法需要拦截 -->
<param name="includeMethods">add,delete</param>
</interceptor-ref>
<!-- 引用默认的拦截器栈(20个) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3.指定包中的默认拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >
<!-- 为Action单独指定走哪个拦截器(栈)
<interceptor-ref name="myStack"></interceptor-ref>-->
<result name="success" type="dispatcher" >/index.jsp</result>
</action>
</package>

</struts>


View Code

Struts2标签库

Struts2标签库整理【完整】

Struts2 标签库详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: