1.实现一个拦截器
在struts框架提供了Interceptor接口,和AbstractInterceptor抽象类(实现了Interceptor接口的初始化和销毁方法,且为空实现)供我们为程序扩展自己的拦截器。当我们不关注初始化和销毁方法时,直接继承AbstractInterceptor抽象类即可
2.拦截器的配置
在struts的配置文件中,所有的Interceptor都配置在<interceptors>这个节点下。这个节点下负责配置 拦截器interceptor 以及 拦截器栈interceptor-stack。而interceptor-stack的配置是基于interceptor之上的。
3.拦截器和过滤器一样,是在web容器(tomcat)启动的时候初始化,在web容器关闭的时候销毁的,且过滤器在拦截器之前初始化,也在拦截器之前销毁;进行拦截的时候,过滤器先于拦截器执行
4.拦截器和过滤器的区别
1)最大的区别是:过滤器是JEE规范,拦截器不是(拦截器是框架自己实现的)。由于这一点可以带出下面的各种不同
2)过滤器可以过滤所有请求;而拦截器只能拦截action请求
3)过滤器由容器调用,依赖容器;而拦截器由框架内部调用,依赖框架
4)过滤器被调用时这个时候每次访问创建的对应的ActionContext,ValueStack,Action对象还没有创建呢(即使调用ActionContext.getContext()方法返回的也是null),所有不可能取到;而拦截器被调用这些对象就已经创建了
a.)过滤器被调用时,传递进去的参数都是servlet api原生的参数;而拦截器被调用时传递进去的是ActionInvocation invocation对象,进而可以通过调用该对象的方法访问ActionContext对象以及ValueStack对象,比如invocation.getStack(),invocation.getInvocationContext(),且在拦截器中用ValueStack vStack2 = ActionContext.getContext().getValueStack();ValueStack vStack1 = invocation.getStack();这俩种方法得到的是同一个对象
b)过滤中只能拦截到action用原生servlet api 存放的数据(指拦截action返回到页面的数据);而 拦截器中既可以获取包装的api中的对象,也可以获得原生的 api中的数据,但是使用的的api要一一对应,否则获得是null。(这点和el,ognl获取数包装和原生的数据不同(页面取值更通用)。)
c)拦截器中拦截页面传递过来的数据要用原生的api,不能用包装的api,否则获取不到为null
根据以上俩点,可以判断过滤器和拦截器的使用场景:要访问ValueStack中的对象就要使用拦截器;要让过滤器拦截到数据,action中就要用原生的api存放数据
5)最后就是实现的方式不同了 过滤器是基于函数回调 ,而拦截器是基于Java的反射机制的