本文可作为北京尚学堂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还保持疑问的话。建议大家亲自画画图,理清楚调用的过程。

下一节 我们看看源码

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

  1. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  2. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

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

    首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) ...

  4. 转: Struts2中拦截器与过滤器的区别及执行顺序

    当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会 ...

  5. struts2中拦截器与过滤器的区别

    1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器.  3.拦截器只能对Action请求起作用,而过滤器则可以对几乎 ...

  6. Struts2中拦截器的使用与配置

    一,拦截器是什么? 拦截器是在Action执行之前和之后执行的代码,是一个类似于过滤器的类: 二,拦截器的作用 拦截器拦截Action的请求,在Action之前或之后实现某项功能: 三,拦截器的特点 ...

  7. 2018.11.29 Struts2中拦截器的学习&项目的实际运用

    struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...

  8. Struts2 中拦截器和Action的调用关系(写的很好)

    http://blog.csdn.net/hackerain/article/details/6991082

  9. 通俗易懂之SpringMVC&Struts2前端拦截器详解

    直接进入主题吧!一,配置Struts2的拦截器分两步走1配置对应的拦截器类:2在配置文件Struts.xml中进行配置拦截器同时在Strust2中配置拦截器类有三种方法1实现Interceptor接口 ...

随机推荐

  1. 【SSH系列】Hibernate映射-- 多对一单向关联映射

    在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...

  2. 剑指Offer——知识点储备-网络基础

    剑指Offer--知识点储备-网络基础 计算机网络 http和https的区别 (1)http是http协议运行在tcp之上,所传输的内容都是明文,客户端和服务器端都无法验证对方的身份. (2)htt ...

  3. 百度编辑器UEditor常用设置函数

    最近在研究UEditor的使用,下面是附上传送门: 这是API文档http://ueditor.baidu.com/doc/ 这是下载地址http://ueditor.baidu.com/websit ...

  4. activiti 任务节点 处理人设置

    1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 我们在使用activiti 工作流引擎的时候, ...

  5. Android开发基础规范(一)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52602487 前言:Androi ...

  6. Xcode中的变量模板(variable template)的用法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 你可能经常会写一些小的代码片段,里面自然少不了一些关键的变量. ...

  7. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broa ...

  8. Dynamics CRM 后台通过组织服务获取时间字段值的准确转换

    做CRM开发的都知道,在系统时间字段的处理上是有讲究的,因为数据库中存的是UTC时间,CRM的界面时间字段会根据个人设置中的时区以及格式自动调整,这是最基本的一面,那还有很多使用时间的场景,比如脚本使 ...

  9. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧

    因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android ...

  10. 查看LOV对应查询语句的研究

    一.获取当前会话id 1.方法一 tools: Help > About 2.方法二 打开个性化定义界面(如果没有权限,到系统配置文件设置中,查看是否是"隐藏诊断菜单"被设置 ...