[关闭]
@MrXiao 2017-12-21T16:08:43.000000Z 字数 4295 阅读 892

Struts2(5)——拦截器

Struts2


原文链接

1、简介

struts2中很多的核心功能都是拦截器完成的。比如:params(封装动态参数)、staticParams(静态参数封装)、i18n(国际化)、modelDrivern(模型驱动)、servletConfig(注入servletAPI)等。
作用:在执行动作前或后进行拦截

  1. <default-interceptor-ref name="defaultStack"/>
  1. <interceptor-stack name="defaultStack">
  2. <interceptor-ref name="exception"/>
  3. <interceptor-ref name="alias"/>
  4. <interceptor-ref name="servletConfig"/>
  5. <interceptor-ref name="i18n"/>
  6. <interceptor-ref name="prepare"/>
  7. <interceptor-ref name="chain"/>
  8. <interceptor-ref name="scopedModelDriven"/>
  9. <interceptor-ref name="modelDriven"/>
  10. <interceptor-ref name="fileUpload"/>
  11. <interceptor-ref name="checkbox"/>
  12. <interceptor-ref name="datetime"/>
  13. <interceptor-ref name="multiselect"/>
  14. <interceptor-ref name="staticParams"/>
  15. <interceptor-ref name="actionMappingParams"/>
  16. <interceptor-ref name="params"/>
  17. <interceptor-ref name="conversionError"/>
  18. <interceptor-ref name="validation">
  19. <param name="excludeMethods">input,back,cancel,browse</param>
  20. </interceptor-ref>
  21. <interceptor-ref name="workflow">
  22. <param name="excludeMethods">input,back,cancel,browse</param>
  23. </interceptor-ref>
  24. <interceptor-ref name="debugging"/>
  25. <interceptor-ref name="deprecation"/>
  26. </interceptor-stack>

2、运作图

此处输入图片的描述

结论:
动作方法执行前:拦截器会按照顺序依次进行拦截
执行动作方法
返回结果视图
拦截器会按照原来的顺序的相反顺序再次进行拦截

执行过程中:ActionInvocation保存了需要用到的数据

3、自定义拦截器

熟悉拦截器的体系:所有的拦截器都直接或间接的实现了Interceptor接口

此处输入图片的描述

3.1 创建拦截器类,继承AbstractInterceptor或实现Interceotor

  1. public class MyInterceptor extends AbstractInterceptor {
  2. private static final long serialVersionUID = -828084112876621948L;
  3. @Override
  4. public String intercept(ActionInvocation invocation) throws Exception {
  5. System.out.println("MyInterceptor拦截前");
  6. String invoke = invocation.invoke();//放行
  7. System.out.println("MyInterceptor拦截后");
  8. return invoke;
  9. }
  10. }

3.2 注册拦截器

在struts.xml中注册拦截器,可以针对单个action配置,也可全局配置

  1. 针对单个action配置

    首先在package中声明拦截器

    1. <interceptors>
    2. <interceptor name="myInterceptor" class="com.topvision.s2sm.plantform.interceptor.MyInterceptor"></interceptor>
    3. </interceptors>

    然后在action中声明引用该拦截器

    1. <action name="loginTest" class="com.topvision.s2sm.login.action.LoginAction" method="loginTest">
    2. <!--
    3. 如果没有声明拦截器,默认使用struts-default.xml中的defaultStack
    4. 如果声明了,则defaultStack失效
    5. -->
    6. <interceptor-ref name="myInterceptor"></interceptor-ref>
    7. <result>/WEB-INF/jsp/login/login.jsp</result>
    8. <result name="input">/error.jsp</result>
    9. </action>

    但是一般不用这种,因为Struts2有这么一种机制,一旦为Action指定了拦截器,那么就不会再为这个Action执行默认拦截器了,即defaultStack这个拦截器栈中的拦截器都不会执行,也就是说,这个Action没有输入校验、没有参数注入、没有国际化、没有…,这是不行的,所以我们需要在这个元素中再引用defaultStack拦截器栈。

  2. 全局配置(常用)

    创建一个拦截器栈,包含默认拦截器栈和自定义拦截器。

    1. <package name="default" extends="struts-default">
    2. <interceptors>
    3. <!-- 自定义拦截器 -->
    4. <interceptor name="myInterceptor" class="com.topvision.s2sm.plantform.interceptor.MyInterceptor"></interceptor>
    5. <!-- 自定义拦截器栈 -->
    6. <interceptor-stack name="myStack">
    7. <interceptor-ref name="defaultStack"/>
    8. <interceptor-ref name="myInterceptor"/>
    9. </interceptor-stack>
    10. </interceptors>
    11. <!-- 指定默认拦截器 -->
    12. <default-interceptor-ref name="myStack"></default-interceptor-ref>

4、MethodFilterInterceptor

是AbstractInterceptor的子类:
setIncludeMethods(String includeMethods):设置需要拦截的方法,多个方法用逗号分隔
setExcludeMethods(String excludeMethods):设置不需要拦截的方法,多个方法用逗号分隔

  1. public class MethodInterDemo extends MethodFilterInterceptor{
  2. private static final long serialVersionUID = -9060068603523571867L;
  3. @Override
  4. protected String doIntercept(ActionInvocation invocation) throws Exception {
  5. //拦截前操作
  6. String invoke = invocation.invoke();
  7. //拦截后操作
  8. return invoke;
  9. }
  10. }

配置xml

  1. <package name="default" extends="struts-default">
  2. <interceptors>
  3. <!-- 自定义拦截器 -->
  4. <interceptor name="myInterceptor" class="com.topvision.s2sm.plantform.interceptor.MyInterceptor"></interceptor>
  5. <interceptor name="methodInterceptor" class="com.topvision.s2sm.plantform.interceptor.MethodInterDemo"></interceptor>
  6. <!-- 自定义拦截器栈 -->
  7. <interceptor-stack name="myStack">
  8. <interceptor-ref name="defaultStack"/>
  9. <interceptor-ref name="myInterceptor"/>
  10. <interceptor-ref name="methodInterceptor"/>
  11. </interceptor-stack>
  12. </interceptors>
  13. <!-- 指定默认拦截器 -->
  14. <default-interceptor-ref name="myStack"></default-interceptor-ref>
  15. </package>

设置指定action

  1. <package name="login" namespace="/" extends="default">
  2. <action name="loginTest" class="com.topvision.s2sm.login.action.LoginAction" method="loginTest">
  3. <interceptor-ref name="myStack">
  4. <!-- 设置不需要methodInterDemo拦截的方法 -->
  5. <param name="methodInterDemo.excludeMethods">loginTest</param>
  6. <!-- 设置需要methodInterDemo拦截的方法 -->
  7. <param name="methodInterDemo.includeMethods">aaa</param>
  8. </interceptor-ref>
  9. <result>/WEB-INF/jsp/login/login.jsp</result>
  10. <result name="input">/error.jsp</result>
  11. </action>
  12. </package>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注