1. 拦截器简介:
拦截器应用了软件开发中的一个重要思想 -- AOP(Aspect Oriented Programming,面向切面程序设计)。AOP可以看做是OOP(Object Oriented Programming,面向对象程序设计)的补充和完善,它可以将影响多个类的公共行为封装到一个可重用模块。
2. 拦截器实现原理:
电梯是自动开门和关门的,那么拦截器也同样有这种功能。
方法可以在不调用的情况下自动执行吗?其实我们这里所指的自动执行是指通过代码驱动来实现方法的执行的。
所谓的拦截其实就是动态地生成一个代理对象,这个对象中包含了拦截器方法的调用。当调用这个对象时,就会同时调用拦截器的方法,从而实现动态调用拦截器方法的目的。
实现过程如图所示:
3. Struts 2拦截器原理:
Struts 2拦截器动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。
通常情况下,拦截器都是通过代理的方式调用。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据配置实例化相应的拦截器对象,然后将这些对象组成一个列表,最后逐个调用列表中的拦截器。
如图所示:
4. Struts 2架构剖析
5. Struts2执行流程
1、客户端向Servlet容器(如Tomcat)提交一个请求
2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)
3、核心控制器(如FilterDispatcher)被调用,询问ActionMapper来决定请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (Action代理)
5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
9、拦截器被再次执行
10、过滤器被再次执行
未完待续。。。