Struts2拦截器原理:当请求struts2的action时,Struts2会查找配置文件,并根据拦截器配置实例化相对的拦截器对象,然后形成拦截器栈,拦截器栈一般是由自定义拦截器+默认拦截器(17个)组成,最后按栈的先进出的顺序执行拦截器栈中的拦截器。
Struts2拦截器是在访问某个Action或Action的某个方法之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
所谓AOP,即面向切面编程,AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
比如登陆模块,整个过程是这样的:
用户请求->action接收请求并数据库验证->根据验证结果返回不同的视图
这样一看似乎没什么问题,但如果是购物模块,流程就是这样的:
用户发送购物请求->action接收请求并处理业务逻辑->返回视图
但如果这个用户没有登陆,却请求了购物的action,这样就会有问题了,所谓切面,我们就在这个流程中加一个东西,就是拦截器,很明显,要加在发送请求和接收请求之间:
用户发送购物请求->拦截器拦截请求并判断是否登陆->action接收请求并处理业务逻辑->返回视图
以上面的购物为例,拦截器使用步骤如下:
配置拦截器
在struts.xml中配置拦截器:
1 | < interceptors > |
编写拦截器
定义拦截器类实现com.opensymphony.xwork2.interceptor.Interceptor
接口:
1 | public class MyInterceptor implements Interceptor{ |
Action
action就写了一个登陆和购物模块,简单的模拟一下,有一个实体类对象user,给出setter和getter方法后struts2可以自动装配,只要前端name对应起来,即表单name要写为user.name等
1 | public class LoginAction extends ActionSupport{ |
action配置
配置action(struts.xml),项目结构:
1 | <package name="login" namespace="/login" extends="struts-default"> |
Final
jsp页面就不贴了,就是一个登陆表单,此demo实现的是如果登陆之前访问buyAction是会被拦截到然后转发到login.jsp,登陆之后则会放行,即正常进入buyAction.