拦截器
1. 概述:
struts2是框架,封装了很多功能,这些功能都封装在拦截器中
每次都执行默认的拦截器,位置在struts2-core包下的struts-default.xml
2. **执行顺序: action对象创建之后,action方法执行之前(可以用debug方式验证)**
>action中没有直接调用拦截器的方法,其在执行过程中使用的aop思想,使用配置文件方式操作拦截器,执行多个拦截器时采用责任链模式,执行完拦截器后 才执行action中的方法
3. 底层原理:
1. AOP(底层就是代理模式) 方法增强,又不修改源代码
2. 责任链模式:
要执行多个操作,有添加,修改,删除三个操作
首先执行添加,执行后,做类似于放行的操作;然后执行 修改,执行后 还是要放行才会执行删除操作。
类似filter中的过滤链: 一个请求可以有多个过滤器过滤,每个过滤器只有放行,才能到下一个过滤器
4. **自定义拦截器**
1. 创建类,继承MethodFilterInterceptor 类(好处是可以让action中的某个方法不进行拦截)
2. 重写类中方法
protected String doInterceptor(ActionInvocation invocation) {
//todo..这里面就写拦截逻辑
// 最后调用invoke方法,类似放行,之后才会执行action中的方法
return invocation.invoke()
//如果不放行 就返回一个result中的值,返回到之前页面或者其他
//return "login" 比如返回到login对应的jsp页面
}
3. 配置action与拦截器的关系(也叫注册拦截器)
1. 在要拦截的action标签所在的*package标签里* 声明
<interceptor name="" class=""></interceptor>
2. 在具体的*action标签里* 使用 声明的拦截器
<interceptor-ref name=""> </interceptor-ref>
3. 如果使用了自定义的拦截器,那struts默认的拦截器就没用了,需要再配置一下默认拦截器
<interceptor-ref name="defaultStack"></interceptor-ref>
4. 配置部分方法不拦截: <param name="excludeMethods">
</interceptor-ref name="">
<param name="excludeMethods">method1,method2</param>
</interceptor-ref>
注意区别
1. 拦截器与过滤器的区别:
1. 拦截器: 只可以拦截action,底层依赖的是反射,在访问action时加载
2. 过滤器: 理论上可以拦截任意内容,比如:html,jsp,servlet,图片路径等,底层依赖的是Servlet,服务器启动就加载了
2. Servlet和Action的区别:
1. servlet: 默认第一次访问时创建,单实例对象
2. action : 每次访问时都创建一个,多实例对象