说说struts2中拦截器的请求流程一(模拟大致流程)

本文可作为北京尚学堂struts2课程的学习笔记。

首先 什么是拦截器?拦截器能干什么?

拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了。能做什么操作呢?你想让action在运行之前干什么就能干什么,而且action本身并“不知道”自己被拦截了。

文章主要分析了拦截器部分的流程,对于环境的获取与初始化并没有涉及,对这部分感兴趣的朋友可以参考

http://www.cnblogs.com/liuling/p/2013-8-10-01.html

在真正进入源码分析阶段前,我先给大家一个小例子以帮助理解。

既然我们研究的是拦截器那么我们先写一个action和拦截器试试。

package inter;

public class FindNameAction {
	public void execute(){
		System.out.println("find name!");
	}
}

action没有继承任何接口,就只有一个execute。

package inter;

public interface Interceptor {
	void intercept(ActionInvocation invocation);
}

package inter;

public class FirstInterceptor implements Interceptor{

	@Override
	public void intercept(ActionInvocation invocation) {
		// TODO Auto-generated method stub
		System.out.println(1);
		invocation.invoke();
		System.out.println(-1);
	}
}

package inter;

public class SecondInterceptor implements Interceptor{

	@Override
	public void intercept(ActionInvocation invocation) {
		// TODO Auto-generated method stub
		System.out.println(2);
		invocation.invoke();
		System.out.println(-2);
	}
}

很简单吧 定义一个拦截器要实现的接口,然后有两个具体的拦截器。如果说代码里真有什么难懂的,就应该是ActionInvocaton了。别急,慢慢来。

ActionInvocation里面放置了,我们要最终操作的action类还有各种拦截器。

package inter;

import java.util.ArrayList;
import java.util.List;

public class ActionInvocation {
	List<Interceptor> interceptors=new ArrayList<Interceptor>();
	FindNameAction action=new FindNameAction();
	int index=-1;
	public ActionInvocation() {
		// TODO Auto-generated constructor stub
		interceptors.add(new FirstInterceptor());
		interceptors.add(new SecondInterceptor());
	}
	public void invoke(){
		index++;
		if (index<=interceptors.size()-1)
			interceptors.get(index).intercept(this);
		else
			action.execute();
	}
}

就像上面说的,ActionInvocation里面有两个变量。一个放置了所有的拦截器,一个是我们最终操作的action。

我们着重分析里面的invoke方法。

如果“拦截器栈”里面的拦截器还没有全部工作,就让它继续调用否则就直接做最核心的---最终的action工作。

纠结的地方就在这里了。上面我们定义的interceptor接口里,方法intercept的参数是一个ActionInvocation,在里面我们调用了ActionInvocation的invoke方法(在System.out.println(-1/-2)之前!!),而在invoke里面我们取出一个个interceptor又去调用他的intercept(参数是this,也就是ActionInvocation本身)。

循环往复了!!!

我们看看他的结果。

package inter;

public class Test {
	public static void main(String[] args) {
		new ActionInvocation().invoke();
	}
}

测试结果如下:

1

2

find name!

-2

-1

如果大家对find name后面又出现了数字,而且还是-2 -1不是-1 -2还保持疑问的话。建议大家亲自画画图,理清楚调用的过程。

下一节 我们看看源码

时间: 2024-10-29 19:09:01

说说struts2中拦截器的请求流程一(模拟大致流程)的相关文章

Struts2中拦截器的简单实现

Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行struts.xml中引用 的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法.在Struts2的拦截器体系中, Struts2的内建拦截器完成了该框架的大部分操作,所以实际的开发过程中通常都是使用系统的拦截器而已.当然我们也可以开发自己的拦截器,类似于过滤器的开发. 原理: Struts2拦截器的实现原理相对简单,当请求Stru

struts2中拦截器(interceptor)小结

什么是拦截器? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式.在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.Struts2内置了很多拦截器,每个拦截器完成相对独立的功能,多个拦截器的组合体成为拦截器栈.最为重要的拦截器栈是

struts2中拦截器与过滤器之间的区别

首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml        i. 下一步将会

Struts2中拦截器的使用

拦截器是Struts2框架的核心组成部分,框架的很多功能都是构建在拦截器基础之上.Struts2利用内建的拦截器完成了框架内的大部分操作,拦截器是AOP(面向方面编程)在Struts2框架中的具体实现. 下面是配置自定义拦截器的流程. 假设需要一个功能,在调用每个Action之前都能在控制台打印出Helloworld,要求使用Struts2拦截器来实现. 1.建立一个Action类MyAction.java和一个配置文件struts.xml,如下图. 2.编写MyAction.java实现一个年

struts2中拦截器的简介与配置使用

拦截器是struts2框架的核心,struts2很多的功能都是构建在拦截器基础之上的,它是动态拦截Action调用的对象,提供了一种机制,使得开发者能够在一个Action前后执行需要的代码,可以在一个Action执行前组织他的执行,也能在Action执行后做一些相应的工作.同时他也提供了一种可以提取Action中可重用部分的方式. 拦截器 struts2拦截器是在访问某个Action或它的某个方法 .字段之前或之后实施拦截,struts2拦截器是可插拔的,是AOP的一种实现(AOP是OOP(Ob

Struts2中拦截器的配置

在struts.xml文件中定义拦截器只需要给拦截器类指定一个拦截器名,这就完成了定义.拦截器使用<interceptor>标记来定义,格式如下 <interceptor name="拦截器名" class="拦截器类"></interceptor> 大部分情况下,如果有一个拦截器这样配置就够了.如果有多个拦截器,则需要写多个<interceptor>,而<interceptor>是写在<interc

struts2中拦截器和过滤器的比较

拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程(AOP)的就是在你的service或者一个方法前调用一个方法,或者在方法后调用

Struts2中拦截器

创建拦截器 package com.zhangpn.Intercepor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class PermissionIntercepor implements Interceptor{ @Ov

调查管理系统 -(6)自定义Struts2的拦截器&amp;自定义UserAware接口&amp;Action中模型赋值问题&amp;Hibernate懒加载问题

1.对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断.当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录.这个功能可以通过自定义Struts2的拦截器来完成. 2.当用户登录之后,由于是将用户的信息保存在session中的.这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAwar