zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Struts2学习笔记五 拦截器详解编程语言

笔记学习编程语言 详解 struts2 拦截器
2023-06-13 09:20:22 时间

拦截器,在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; 


//创建方式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" 

 !--可选,name指定参数的名称 ;paramValue指定参数的值-- 

 param name="paramName" paramValue /param 

 /interceptor 

 /interceptors 

比如:Struts2学习笔记五 拦截器详解编程语言

步骤2:配置拦截器栈

可以把多个拦截器组成一个拦截器栈。在使用时,可以将栈内的多个拦截器当成一个整体来引用。当拦截器栈被附加到一个Action上时,在执行Action之前必须先执行拦截器栈中的每一个拦截器。比如:

Struts2学习笔记五 拦截器详解编程语言

上面的代码中,定义的拦截器栈是myStack,在myStack栈中,除了引用了自定义的拦截器之外,还引用了一个内置拦截器栈defaultStack,这个拦截器是必须要引入的。

步骤3:指定包中默认拦截器栈

如下配置,整个包中所有的Action都会走这个拦截器栈。

Struts2学习笔记五 拦截器详解编程语言

如果只想某个action走这个拦截器栈,可以如下指定:

Struts2学习笔记五 拦截器详解编程语言

定制拦截方法

 Struts2学习笔记五 拦截器详解编程语言

全局结果集

Struts2学习笔记五 拦截器详解编程语言

最终配置如下:

Struts2学习笔记五 拦截器详解编程语言
Struts2学习笔记五 拦截器详解编程语言

 ?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" /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_*" method="{1}" 

 !-- 为Action单独指定走哪个拦截器(栈) 

 interceptor-ref name="myStack" /interceptor-ref -- 

 result name="success" type="dispatcher" /index.jsp /result 

 /action 

 /package 

 /struts 

 Struts2标签库

Struts2标签库整理【完整】

Struts2 标签库详解

7613.html

cjavaxml