Struts2 中的拦截器和 servelt 中的过滤器是非常的相似的。如果学过过滤器的话,肯定能够感觉的到,尽管有些微的不同。可是struts2的拦截器到底如何使用呢,为什么会有这些配置呢? 接下来一一来看。
过滤器和拦截器是非常相似的,过滤器 public interface Filter 接口里面有三个方法:
init(FilterConfig filterConfig),
destroy(),
doFilter(ServletRequest request, ServletResponse response, FilterChain chain),
这里面的 doFilter() 方法是最重要的,在 struts2 中 String intercept(ActionInvocation invocation)就相当于此方法。
如何完成一个拦截器呢?在 struts2 中要实现一个接口 这个接口是什么呢?在哪呢?,是否在哪听说过?是 webwork 是我们以前听的最多的关于拦截器的框架, struts2 用了其中一个核心的东西,这个东西在是什么呢?是 xwork 。恩,有了它才可以拦截,好了我们在哪找呢?在 com.opensymphony.xwork2.interceptor 中找,里面有个 Interceptor 这是个接口,里面也有三个方法,有 init, destroy 和 intercept 三个方法,而在 struts2 里面的所有的拦截器都继承这个接口!
struts2接受客户端请求时,在执行action之前已经执行了自身默认的拦截器,这些拦截器完成struts2的大部分初始化的功能,比如设置属性值等。
执行完这些拦截器后,再执行action,返回客户端时,还得经过拦截器的拦截,最终返回客户端。下面我们开始模拟拦截器的实现过程:
1、新建自己的拦截器:
view plaincopy to clipboardprint?
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:36:14 PM
* 定义一个接口
*/
public interface MyInterceptor {
public void inteceptor(Invocation invocation) ;
}
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:36:14 PM
* 定义一个接口
*/
public interface MyInterceptor {
public void inteceptor(Invocation invocation) ;
}
2、拦截器的具体实现
view plaincopy to clipboardprint?
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:41:26 PM
*
* spring
* com.beckham.interceptors
* FirstInterceptor.java
*/
public class FirstInterceptor implements MyInterceptor {
public void inteceptor(Invocation invocation) {
System.out.println("第一个拦截器开始。。。。");
//调用invoke方法
invocation.invoke() ;
System.out.println("第一个拦截器结束.......");
}
}
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:41:26 PM
*
* spring
* com.beckham.interceptors
* FirstInterceptor.java
*/
public class FirstInterceptor implements MyInterceptor {
public void inteceptor(Invocation invocation) {
System.out.println("第一个拦截器开始。。。。");
//调用invoke方法
invocation.invoke() ;
System.out.println("第一个拦截器结束.......");
}
}
view plaincopy to clipboardprint?
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:42:22 PM
*
* spring
* com.beckham.interceptors
* SecondInterceptor.java
*/
public class SecondInterceptor implements MyInterceptor {
public void inteceptor(Invocation invocation) {
System.out.println("第二个拦截器开始.....");
//调用invoke方法
invocation.invoke() ;
System.out.println("第二个拦截器结束......");
}
}
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:42:22 PM
*
* spring
* com.beckham.interceptors
* SecondInterceptor.java
*/
public class SecondInterceptor implements MyInterceptor {
public void inteceptor(Invocation invocation) {
System.out.println("第二个拦截器开始.....");
//调用invoke方法
invocation.invoke() ;
System.out.println("第二个拦截器结束......");
}
}
3、需要执行的action
view plaincopy to clipboardprint?
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:45:30 PM
*
* spring
* com.beckham.interceptors
* Action.java
*/
public class Action {
public String execute() {
System.out.println("执行execute方法");
return null ;
}
}
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:45:30 PM
*
* spring
* com.beckham.interceptors
* Action.java
*/
public class Action {
public String execute() {
System.out.println("执行execute方法");
return null ;
}
}
4、控制器,该控制器调配执行拦截器和action
view plaincopy to clipboardprint?
package com.beckham.interceptors;
import java.util.ArrayList;
import java.util.List;
/**
* @author Owner
* Jan 14, 2010 2:46:44 PM
*
* spring
* com.beckham.interceptors
* Invocation.java
*/
public class Invocation {
List<MyInterceptor> interceptors = new ArrayList<MyInterceptor>();
int index = -1;
public Invocation() {
//需要执行的拦截器
this.interceptors.add(new FirstInterceptor());
this.interceptors.add(new SecondInterceptor());
}
public void invoke() {
index++;
if (index < interceptors.size()) {
//一次调用拦截器的inteceptor方法
interceptors.get(index).inteceptor(this);
} else {
//拦截器拦截完毕后执行action
new Action().execute();
}
}
}
package com.beckham.interceptors;
import java.util.ArrayList;
import java.util.List;
/**
* @author Owner
* Jan 14, 2010 2:46:44 PM
*
* spring
* com.beckham.interceptors
* Invocation.java
*/
public class Invocation {
List<MyInterceptor> interceptors = new ArrayList<MyInterceptor>();
int index = -1;
public Invocation() {
//需要执行的拦截器
this.interceptors.add(new FirstInterceptor());
this.interceptors.add(new SecondInterceptor());
}
public void invoke() {
index++;
if (index < interceptors.size()) {
//一次调用拦截器的inteceptor方法
interceptors.get(index).inteceptor(this);
} else {
//拦截器拦截完毕后执行action
new Action().execute();
}
}
}
5、main方法执行,在struts2框架中,前台的一个请求被过滤器拦截后就执行拦截,然后再执行action
view plaincopy to clipboardprint?
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:47:32 PM
*
* spring
* com.beckham.interceptors
* Test.java
*/
public class Test {
public static void main(String[] args) {
//struts2的拦截器入口就是invoke方法
new Invocation().invoke() ;
}
}
package com.beckham.interceptors;
/**
* @author Owner
* Jan 14, 2010 2:47:32 PM
*
* spring
* com.beckham.interceptors
* Test.java
*/
public class Test {
public static void main(String[] args) {
//struts2的拦截器入口就是invoke方法
new Invocation().invoke() ;
}
}
模拟结果:
第一个拦截器开始。。。。
第二个拦截器开始.....
执行execute方法
第二个拦截器结束......
第一个拦截器结束.......
从模拟结果分析,拦截器相当于包裹在action外面的屏障,要达到执行action的目的,需要穿过屏障-------->执行action-------->穿出屏障
拦截器的实现其实是aop编程思想,在实现相应逻辑的前后,加上其他逻辑的实现,而且没有任何依赖关系。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gaowenming/archive/2010/01/14/5189803.aspx
分享到:
相关推荐
在Struts2中,拦截器的使用主要基于两个方面:配置文件中的声明式使用和注解的编程式使用。首先,我们来看看配置文件中的声明式使用。在struts.xml或类似的配置文件中,你可以通过`<interceptor>`元素定义拦截器,并...
Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...
拦截器栈是Struts2中拦截器的组织方式,它将多个拦截器按照预设的顺序组合成一个链式结构。在Action的执行过程中,这些拦截器会被依次调用,每个拦截器都有机会在Action方法执行前后进行干预。拦截器栈的顺序至关...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...
解决Struts2中的中文乱码。该代码是用作Struts2的拦截器中
2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...
在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它允许开发者在动作执行前后插入自定义逻辑,比如权限检查、日志记录、性能监控等。本文将深入探讨如何使用Struts2实现拦截器,以及如何配置拦截器来实现...
首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...
在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...
拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。...
在Struts2中,拦截器(Interceptor)是核心功能之一,用于增强应用的功能和处理业务逻辑。拦截器是基于AOP(面向切面编程)的概念,可以在动作执行前后插入额外的操作,比如日志记录、权限检查、数据验证等。 标题...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...
struts2常用拦截器,struts2经常用到的拦截器,熟悉熟悉
在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...
拦截器是Struts2中的一个关键概念,它允许开发者在Action执行前后插入自定义的处理逻辑。例如,可以使用拦截器实现登录验证、日志记录、性能监控等功能。拦截器通过链式结构串联起来,形成一个执行栈,每个Action...
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。