• Struts2拦截器再认识


    拦截器(Interceptor)是 Struts 2 的核心组成部分。

    1. Struts2 很多功能都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、数据类型转换和数据校验等等。
    2. Struts2 拦截器在访问某个 Action 方法之前或之后实施拦截 Struts2 拦截器是可插拔的, 拦截器是 AOP(面向切面编程) 的一种实现.
    3. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时,
    4. Struts2 拦截器链中的拦截器就会按其之前定义的顺序被依次调用

    规则

    下面说明了栈的调用次序:

     1 <package name="default" extends="struts-default">
     2         <!--配置拦截器-->
     3         <interceptors>
     4             <interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor">
     5                 <param name="value" >YEN</param>
     6             </interceptor>
     7             <interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor>
     8         //次序为 FirstInterceptor==》SecondInterceptor===》defaultStack===》SecondInterceptor====》FirstInterceptor
    9 <interceptor-stack name="AllInterceptor"> 10 <interceptor-ref name="FirstInterceptor"></interceptor-ref> 11 <interceptor-ref name="SecondInterceptor"></interceptor-ref> 12 <interceptor-ref name="defaultStack"></interceptor-ref> 13 </interceptor-stack> 14 </interceptors> 15 16 <action name="LoginAction" class="Action.LoginAction"> 17 <interceptor-ref name="AllInterceptor"></interceptor-ref> 18 <result name="success">success.jsp</result> 19 </action>

    struts2自带的拦截器:

    自定义规则

    struts2提供的 interceptor-stack 不是让我们偷懒的,很多时候,我定义自己很多的拦截器,每一个拦截器在不同业务场景下是不同的,我们不能为了图方便,把所以拦截器全部配置为一个拦截器栈来使用,这回极大的加强服务器的负担,

    比如说:methodFirstceptor 是一个方法拦截器,我们配置需要拦截的方法,而function 拦截器又不需要拦截相关的方法,所以就没有必要把他们放在一起。

    <!-- 拦截器栈配置属于自己的拦截器规则 -->
                <interceptor-stack name="mystack">
                    <interceptor-ref name="methodFirstceptor"></interceptor-ref>
                    <interceptor-ref name="funtion"></interceptor-ref>
                    <interceptor-ref name="defaultStack">
                        <param name="fileUpload.maximumSize">2097152</param>
                        <!-- <param name="fileUpload.allowedTypes">text/html,text/xml</param> -->
                        <param name="fileUpload.allowedExtensions">html,dtd,xml</param>
                    </interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>

     注意:默认拦截器 也叫全局拦截器 (也就是说我们 一定要注意在配置 默认拦截器的时候 不要加过多无用的拦截器,只要那些都需要作用到每个Action上的拦截器,才能配置拦截器栈 以及默认拦截器)

    1   <!-- 为此包下的所有action应用拦截器 -->  
    2         <default-interceptor-ref name="permissionStack" />  

    普通拦截器:

     1 //可以实现Interceptor
     2 public class MyInterceptor extends AbstractInterceptor {
     3 
     4     /**
     5      * 
     6      */
     7     private static final long serialVersionUID = 1L;
     8     @Override
     9     public String intercept(ActionInvocation invocation) throws Exception {
    10         
    11         System.out.println("before invocation.invoke...");
    12         
    13         //可以不调用
    14         String result = invocation.invoke();
    15         
    16         System.out.println("after invocation.invoke...");
    17         
    18         return "success";
    19     }
    20 }

    方法拦截器:

     1 public class MethodFirstceptor extends MethodFilterInterceptor {
     2     /**
     3      * 
     4      */
     5     private static final long serialVersionUID = 1L;
     6 
     7     @Override
     8     protected String doIntercept(ActionInvocation aInvocation) throws Exception {
     9         System.out.println("进入方法拦截器");
    10         String str = aInvocation.invoke();
    11         System.out.println("退出方法拦截器");
    12         return str;
    13     }
    14 
    15     @Override
    16     public Set<String> getExcludeMethodsSet() {
    17         // TODO Auto-generated method stub
    18         return super.getExcludeMethodsSet();
    19     }
    20 
    21     @Override
    22     public Set<String> getIncludeMethodsSet() {
    23         // TODO Auto-generated method stub
    24         return super.getIncludeMethodsSet();
    25     }
    26 }

    struts2配置文件:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 
     6 <struts>
     7 
     8 
     9     <!-- 配置国际化资源文件 -->
    10     <constant name="struts.custom.i18n.resources" value="i18n"></constant>
    11     <constant name="struts.devMode" value="true"></constant>
    12 
    13     <package name="default" namespace="/" extends="struts-default">
    14 
    15         <interceptors>
    16         <!--方法拦截器配置 -->
    17             <interceptor name="methodFirstceptor"
    18                 class="interceptors.MethodFirstceptor">
    19                 <!--配置参数 :拦截什么方法 -->
    20                 <!--includeMethods控制能访问哪些 -->
    21                 <param name="includeMethods">add</param>
    22                 <!--excludeMethods控制能访问哪些 -->
    23             </interceptor>
    24 
    25             <!-- 自定义拦截器 -->
    26             <interceptor name="hello"
    27                 class="interceptors.MyInterceptor"></interceptor>
    28 
    29             <!-- 拦截器栈配置属于自己的拦截器规则 -->
    30             <interceptor-stack name="mystack">
    31                 <interceptor-ref name="methodFirstceptor"></interceptor-ref>
    32                 <interceptor-ref name="hello"></interceptor-ref>
    33                 <interceptor-ref name="defaultStack">
    34                     <param name="fileUpload.maximumSize">2097152</param>
    35                     <!-- <param name="fileUpload.allowedTypes">text/html,text/xml</param> -->
    36                     <param name="fileUpload.allowedExtensions">html,dtd,xml</param>
    37                 </interceptor-ref>
    38                 <interceptor-ref name="defaultStack"></interceptor-ref>
    39             </interceptor-stack>
    40 
    41         </interceptors>
    42 
    43         <default-interceptor-ref name="mystack"></default-interceptor-ref>
    44     
    45         <!-- 执行默认的方法的时候 是不会被拦截的 -->
    46         <action name="loginAction" class="action.LoginAction">
    47             <interceptor-ref name="mystack"></interceptor-ref>
    48             <result>/success.jsp</result>
    49         </action>
    50         
    51         <!-- 执行要拦截的方法 -->
    52         <action name="addAction" class="action.LoginAction" method="add">
    53             <interceptor-ref name="mystack"></interceptor-ref>
    54             <result>/success.jsp</result>
    55         </action>
    56         
    57         
    58 
    59 
    60         <action name="testUpload" class="upload.UploadAction">
    61             <result>/success.jsp</result>
    62             <result name="input">/upload.jsp</result>
    63         </action>
    64 
    65         <action name="testUpload2" class="upload.MulUploadAction">
    66             <result>/success.jsp</result>
    67             <result name="input">/uploadmul.jsp</result>
    68         </action>
    69 
    70         <action name="testDownload" class="download.DownLoadAction">
    71             <result type="stream">
    72                 <param name="bufferSize">2048</param>
    73                 <!-- <param name="contentType">${contentType}</param> -->
    74                 <!-- 调用当前action中的getContentType()方法 -->
    75                 <param name="contentDisposition">attachment;filename=${filename}</param>
    76                 <param name="inputStream">${inputStream}</param>
    77                 <!-- 调用当前action中的getInputStream()方法 -->
    78             </result>
    79         </action>
    80 
    81         <!-- 表单重复提交问题 -->
    82 
    83         <action name="testToken" class="token.TokenAction">
    84             <interceptor-ref name="mystack"></interceptor-ref>
    85             <!-- 会转到标记为invalid-token的页面 -->
    86             <!-- <interceptor-ref name="token"></interceptor-ref> -->
    87             <!-- 停留在当前页面,不做任何操作 -->
    88             <interceptor-ref name="tokenSession"></interceptor-ref>
    89             <!-- 必须调用默认的拦截器 -->
    90             <interceptor-ref name="defaultStack"></interceptor-ref>
    91             <result>/success.jsp</result>
    92             <result name="invalid.token">/token-error.jsp</result>
    93         </action>
    94 
    95     </package>
    96 
    97 
    98 </struts>

    <package name="default" extends="struts-default"><!--配置拦截器--><interceptors><interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor"><param name="value" >YEN</param></interceptor><interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor><interceptor-stack name="AllInterceptor"><interceptor-ref name="FirstInterceptor"></interceptor-ref><interceptor-ref name="SecondInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="LoginAction" class="Action.LoginAction"><interceptor-ref name="AllInterceptor"></interceptor-ref><result name="success">success.jsp</result></action>

     

  • 相关阅读:
    最大值和最小值
    GetLevelDesc函数
    21. D3DSprite
    SetFileAttributes和GetFileAttributes
    24. 幕外渲染
    D3D修改view矩阵与修改world矩阵的区别
    23. 保存纹理(保存屏幕截图)
    C++之solmyr小品文
    C++二进制文件写操作
    22. 凸凹贴图
  • 原文地址:https://www.cnblogs.com/dgwblog/p/9658031.html
Copyright © 2020-2023  润新知