说说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还保持疑问的话。建议大家亲自画画图,理清楚调用的过程。
下一节 我们看看源码
说说struts2中拦截器的请求流程一(模拟大致流程)的更多相关文章
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- Structs2 中拦截器获取请求参数
前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...
- struts2中拦截器与过滤器之间的区别
首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) ...
- 转: Struts2中拦截器与过滤器的区别及执行顺序
当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会 ...
- struts2中拦截器与过滤器的区别
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器. 3.拦截器只能对Action请求起作用,而过滤器则可以对几乎 ...
- Struts2中拦截器的使用与配置
一,拦截器是什么? 拦截器是在Action执行之前和之后执行的代码,是一个类似于过滤器的类: 二,拦截器的作用 拦截器拦截Action的请求,在Action之前或之后实现某项功能: 三,拦截器的特点 ...
- 2018.11.29 Struts2中拦截器的学习&项目的实际运用
struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...
- Struts2 中拦截器和Action的调用关系(写的很好)
http://blog.csdn.net/hackerain/article/details/6991082
- 通俗易懂之SpringMVC&Struts2前端拦截器详解
直接进入主题吧!一,配置Struts2的拦截器分两步走1配置对应的拦截器类:2在配置文件Struts.xml中进行配置拦截器同时在Strust2中配置拦截器类有三种方法1实现Interceptor接口 ...
随机推荐
- python命令行参数解析模块argparse和docopt
http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...
- J2EE中MVC的各层的设计原则及其编写注意事项
总结了下J2EE的MVC模式开发原则,很多细节处理好了是很有利于开发与维护的. 下面就从各层说起. 视图层 主要是客户端的显示,主要是JSP和HTML,随着Web的不断发展,许多基于Javascrip ...
- 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
提示:hash表 #include <iostream> using namespace std; #define N 100 #define RANGE 100 int* getRand ...
- Dynamics CRM2013 Odata的filter中含有日期字段时遇到的一个奇葩问题
在使用Odata拼写filter时我们一般都用工具,因为手写是件极不靠谱且错误率极高的事,下图是我用query designer拼出来的一个filter,因为时间是参数,所以在拷贝出下面这段filte ...
- spark下使用submit提交任务后报jar包已存在错误
使用spark submit进行任务提交,离线跑数据,提交后的一段时间内可以application可以正常运行.过了一段时间后,就抛出以下错误: org.apache.spark.SparkExcep ...
- java的断言(assert)
概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...
- Android初级教程:如何自定义一个状态选择器
有这样一种场景:点击一下某个按钮或者图片(view),改变了样式(一般改变背景颜色).这个时候一种解决方案,可能就是状态选择器.接下来就介绍如何实现状态选择器: 步骤: 一.新建这样的文件夹:res/ ...
- 如何将Provisioning Profile安装到开发的Mac系统上
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- 【一天一道Leetcode】#203.Remove Linked List Elements
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道le ...
- malloc、calloc、relloc
1.malloc void * malloc(size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针. 2.calloc void ...