自定义拦截器
/**
* 自定义拦截器
* 步骤:
* 1.编写一个普通类,继承 AbstractInterceptor 类(也可以实现 Interceptor 接口)
* 2.配置拦截器
* 声明一个拦截器
引用拦截器:写在 action 标签的内部,当我们写了自己的拦截器时,默认拦截器栈就失效了
* 3.拦截器的放行
* invocation.invoke();
* 4.返回值的内容是:
* 动作方法的返回值
* 注意:如何想自定义返回值,必须要在拦截器放行之前 return
* 关于结果视图的执行时机以及拦截器的返回值问题
* **在放行之前,拦截器的的 返回值可以控制显示那个结果视图,一旦放行之后,它 一定会显示动作方法返回值所匹配的结果视图,此时已经不管拦截器返回什么内容,如下图,只能在 invocation.invoke()放行之前返回结果视图
* 5.多个拦截器的执行顺序的问题:**
* 是由引用顺序决定的,与申明顺序无关
如上图:我们先引用 myInterceptor 在引用 myInterceptor2在拦截器执行的时候就会根据顺序先执行先引入的
*/
下面是执行结果:
控制台输出了两次我们编写在拦截器中的输出语句,说明它执行了两次,步骤:
1.当页面访问 action 的时候被我们所定义的拦截器拦截了
2.在第一次拦截之后则执行了动作类中的 action方法
3.动作类的方法返回了结果视图,展示页面
4.拦截器放行,执行第二次拦截
注意:拦截器返回的值 itValue 则是 action 方法的返回值
解决引入了自己的拦截器后默认拦截器无效的问题:
首先,我们定义一个自己的拦截器栈,然后将默认的拦截器栈引入到自己的拦截器栈中,也将自己的拦截器引入进来,这样我们的 action 动作就只需要引入自己的拦截器栈就可以了。
实例:拦截用户是否登录
拦截器实例:拦截用户是否登录,如果用户未登录,则跳转到登录页面,如果用户登录了,则可以进行下一步操作 :
首先编写jsp页面
首页:
登录页面:
编写对应操作的Jsp页面,内容自定义
编写 action 动作类
编写拦截器类 注意:这里继承的是 MethodFilterInterceptor (继续往后看就知道用处了)
struts.xml配置:
声明我们的拦截器,并且自定义一个拦截器栈,在这个,我们吧我们的拦截器栈设置为默认拦截器栈,将我们的动作的 package 继续我们的拦截器 package,这样我们的 action 动作就不需要引入拦截器了,但是,我们的 login 动作是不需要被拦截的,因为它是登录操作,如果拦截了,就会造成死循环,我们该怎样办呢,有两个解决办法:
方法一(不推荐使用):
方法二
就是我上面所说的继承 MethodFilterInterceptor 类了
然后在我们声明的拦截器中配置告知拦截器需要拦截哪些方法,注意:是动作类中的动作方法,不是 struts.xml中的 action 动作
MethodFilterInterceptor 该类中有两个 Set 集合
excludeMethods:排除哪些方法,就是那些方法不需要被拦截器拦截
includeMethods:包含哪些方法,意思就是哪些方法需要被拦截器拦截
这里我们在配置的时候只需要配置一个就可以了,不用想,肯定是配置少的,比如说,我有3个动作方法需要被拦截,而 login 方法不需要被拦截,我肯定配置排除 login 方法
(人懒,就全部都截图了。。。)