1.什么是拦截器:
拦截器是动态拦截Action调用的对象。它提供了一种机制使得开发者可以定义action执行之前或之后执行的代码,也可以在一个action执行前将其阻止。
2.AOP:
提到拦截器,我们不得不提到AOP.
AOP(Aspect-Oriented Programming)译为:“面向切面编程”或者“面向方面编程”。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。拦截器的就是实现AOP的一种策略。
下图是拦截器的工作原理简略图:
3.拦截器的作用:
我们可以用Interceptor在Action的方法执行之前或者之后做一些处理,struts的核心功能正是由拦截器来实现的,比如捕获异常、数据校验、安全审查等等。
4.拦截器的工作原理:
Interceptor Stack(拦截器堆)中有顺序的存储着多个Interceptor,他们联接成链状,然后按照添加的顺序,依次调用。这里用到了递归调用,我认为这是设计者的聪明之处。
DefaultActionInvocation类持有拦截器链的引用,以及action的引用,是控制递归调用的重要类。
关于递归更深入的探讨,请猛击:http://candy-code.iteye.com/blog/1443427
下面我们就来模拟一下Interceptor的工作原理
5.Interceptor模拟:
Invocation.java
package com.interceptor.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 模拟DefaultActionInvocation
* 所有的拦截器存放在一个ArrayList中
* 该类应当持有拦截器数组的引用和Action的引用
*/
public class Invocation{
private List<Interceptor> interceptors = new ArrayList<Interceptor>();
private Iterator<Interceptor> interator;
private Action action;
/**
* 初始化拦截器和action
* 用new 模拟
* 实际上Invocation是从struts.xml读取内容,并初始化的
*/
public Invocation(){
//按顺序加入Interceptor
interceptors.add(new FirstInterceptor());
interceptors.add(new SecondInterceptor());
interceptors.add(new ThirdInterceptor());
interator = interceptors.iterator();
action = new Action();
}
/**
* 这是一个递归方法
*方法直接或间接地调用自身即为递归
* invoke()调用intercept(),intercept()又调用invoke()
* 实际上就是 第一个拦截器调用第二个拦截,第二个调用第三个,依次类推
*/
public void invoke(){
Interceptor interceptor;
//若链表中仍有Interceptor,则调用下一个Interceptor
if(interator.hasNext()){
interceptor = interator.next();
interceptor.intercept(this);
}
//链表中中没有Interceptor了,则调用Action
else{
action.execute();
}
}
}
Interceptor.java
package com.interceptor.test;
//模拟com.opensymphony.xwork2.interceptor.Interceptor接口
//所有拦截器都应该实现该接口或者继承自Interceptor的子类
public interface Interceptor {
//这是拦截器类的最重要的方法
//invocation用于存储拦截器链表
public void intercept(Invocation invocation);
}
FirstInterceptor.java
package com.interceptor.test;
//第一个拦截器
public class FirstInterceptor implements Interceptor{
@Override
public void intercept(Invocation invocation) {
//向控制输出信息,来模拟action调用前的处理工作
System.out.println("first interceptor -->be called");
//回调DefaultAcctionInvocation的方法
invocation.invoke();
//模拟action调用后的处理工作
System.out.println("first interceptor -->return");
}
}
SecondInterceptor.java
package com.interceptor.test;
//第二个拦截器
public class SecondInterceptor implements Interceptor{
@Override
public void intercept(Invocation invocation) {
System.out.println("Second interceptor -->be called");
invocation.invoke();
System.out.println("Second interceptor -->return");
}
}
ThirdInterceptor.java
package com.interceptor.test;
//第三个拦截器
public class ThirdInterceptor implements Interceptor{
@Override
public void intercept(Invocation invocation) {
System.out.println("Third interceptor -->be called");
invocation.invoke();
System.out.println("Third interceptor -->return");
}
}
Main.java
package com.interceptor.test;
//用于启动模拟程序
//模拟StrutsActionProxy的execute()方法
public class Main {
// 创建Invocation,并调用其invoke()方法
public static void main(String[] args) {
new Invocation().invoke();
}
}
Action.java
package com.interceptor.test;
public class Action {
public String execute(){
System.out.println("Action-->execute");
return "success";
}
}
控制台输出结果为:
first interceptor -->be called
Second interceptor -->be called
Third interceptor -->be called
Action-->execute
Third interceptor -->return
Second interceptor -->return
first interceptor -->return
相信看到输出结果之后,不用过多的解释,你也会对Interceptor的工作原理有更具体的了解了。
分享到:
相关推荐
Struts 2是Java Web开发中的一个开源框架,它的核心机制之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要的角色,允许开发者在请求处理前后插入自定义的逻辑,增强了系统的可扩展性和灵活性。 ### 拦截...
总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...
自定义拦截器需要继承`org.apache.struts2.interceptor.Interceptor`接口或实现`com.opensymphony.xwork2.interceptor.Interceptor`抽象类,并实现相应的拦截方法。 6. **AOP的优势**: - AOP使开发者能够将关注点...
在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它提供了一种灵活的方式来增强或修改请求处理流程,而无需侵入实际的业务逻辑。下面我们将深入探讨Struts2拦截器的实现原理。 首先,让我们理解一下拦截...
Struts2的架构设计采用了拦截器(Interceptor)机制,允许开发人员定义一系列的拦截器来处理HTTP请求和响应。其工作流程大致如下: 1. 用户的浏览器发起一个HTTP请求。 2. 该请求被Struts2框架捕获,请求会被封装...
首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以处理诸如验证、日志、事务管理等通用任务。通过灵活配置,开发者可以构建出满足各种需求的...
2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...
在Struts2中,拦截器是一个实现了`Interceptor`接口或者继承自`AbstractInterceptor`抽象类的Java类。它们通过`com.opensymphony.xwork2.interceptor.Interceptor`接口中的三个方法——`intercept()`、`destroy()`和...
拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...
- **定义**: 拦截器(Interceptor)是Struts2框架的一个核心特性。它负责在Action执行前后进行一系列操作。 - **功能**: Struts2框架的许多核心功能都是通过拦截器实现的,例如防止表单重复提交、类型转换、对象组装...
拦截器(Interceptor)是Struts2的另一个重要组成部分,它允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 三、MVC模式 在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model...
同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...
Interceptor是拦截器,类似于AOP(面向切面编程)的概念,允许在Action调用前后插入自定义逻辑,如日志记录、权限检查等。Result则负责将Action执行后的结果呈现给用户,可以是JSP、JSON、XML等不同格式。 Struts2...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 Struts 2的新表单标志的使用 13 Struts 2与AJAX
首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,它通过提供更灵活的配置、更强大的拦截器(Interceptor)体系以及与Spring等其他框架的无缝集成,提升了开发效率和应用性能。框架的核心组件包括Action、...
07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts 2中实现CRUD 11 Struts 2中的OGNL 12 trus 2的新表单标志的使用 13 Struts 2与AJAX