`
Candy_Code
  • 浏览: 14539 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

struts2的灵魂——Interceptor(拦截器)

阅读更多

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的工作原理有更具体的了解了。
0
0
分享到:
评论
1 楼 liuwuping1206 2012-04-04  
写的非常好 谢谢了。。

相关推荐

    Struts 2的基石——拦截器(Interceptor)

    Struts 2是Java Web开发中的一个开源框架,它的核心机制之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要的角色,允许开发者在请求处理前后插入自定义的逻辑,增强了系统的可扩展性和灵活性。 ### 拦截...

    Struts拦截器案例——登陆

    总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...

    Struts2的拦截器——Struts2拦截器的基础知识.pptx

    自定义拦截器需要继承`org.apache.struts2.interceptor.Interceptor`接口或实现`com.opensymphony.xwork2.interceptor.Interceptor`抽象类,并实现相应的拦截方法。 6. **AOP的优势**: - AOP使开发者能够将关注点...

    Struts2拦截器的实现原理(csdn)————程序.pdf

    在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它提供了一种灵活的方式来增强或修改请求处理流程,而无需侵入实际的业务逻辑。下面我们将深入探讨Struts2拦截器的实现原理。 首先,让我们理解一下拦截...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    Struts2的架构设计采用了拦截器(Interceptor)机制,允许开发人员定义一系列的拦截器来处理HTTP请求和响应。其工作流程大致如下: 1. 用户的浏览器发起一个HTTP请求。 2. 该请求被Struts2框架捕获,请求会被封装...

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    首先,Struts2的核心在于它的拦截器(Interceptor)机制。拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以处理诸如验证、日志、事务管理等通用任务。通过灵活配置,开发者可以构建出满足各种需求的...

    在struts1中使用拦截器——saif-0.1.jar

    2. **创建拦截器**:在saif-0.1.jar中,开发者可能已经定义了一些继承自`org.apache.struts.interceptor.Interceptor`接口的类。这些类实现了拦截器的逻辑,如`doIntercept()`方法。 3. **配置拦截器**:在struts-...

    Struts2简单的拦截器示例

    在Struts2中,拦截器是一个实现了`Interceptor`接口或者继承自`AbstractInterceptor`抽象类的Java类。它们通过`com.opensymphony.xwork2.interceptor.Interceptor`接口中的三个方法——`intercept()`、`destroy()`和...

    struts 拦截器实现权限拦截

    拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_9_拦截器 共32页.pptx

    - **定义**: 拦截器(Interceptor)是Struts2框架的一个核心特性。它负责在Action执行前后进行一系列操作。 - **功能**: Struts2框架的许多核心功能都是通过拦截器实现的,例如防止表单重复提交、类型转换、对象组装...

    Struts2——教程

    拦截器(Interceptor)是Struts2的另一个重要组成部分,它允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 三、MVC模式 在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model...

    Struts2 ——2、各种Action写法和配置

    同时,熟悉Struts2的拦截器机制和DMI功能,可以更方便地实现业务逻辑的扩展和复用。对于源码的探索,有助于深入理解Struts2的工作原理,提升问题排查和性能优化的能力。在实际工作中,结合工具如IDEA的插件,可以...

    Struts2 技术内幕——深入解析Struts2架构设计.pdf.zip

    Interceptor是拦截器,类似于AOP(面向切面编程)的概念,允许在Action调用前后插入自定义逻辑,如日志记录、权限检查等。Result则负责将Action执行后的结果呈现给用户,可以是JSP、JSON、XML等不同格式。 Struts2...

    个人认为目前最完备的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 技术内幕——深入解析Struts2架构设计与实现原理.zip

    首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,它通过提供更灵活的配置、更强大的拦截器(Interceptor)体系以及与Spring等其他框架的无缝集成,提升了开发效率和应用性能。框架的核心组件包括Action、...

    struts2.0中文教程

    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

Global site tag (gtag.js) - Google Analytics