一、Struts2的拦截器(interceptor)

作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强、权限控制),需要拦截器组件

1、struts2内置拦截器
    
    1.1 struts-default.xml中配置好的拦截器
       struts2框架已经定义好并使用的拦截器
       发送请求 -----> interceptor1---->interceptor2 ------>......-----> DemoAction
            
       在struts-default.xml文件中已经声明了多个拦截器
            
       <interceptors>
        ... ...
         <!--声明拦截器-->
         <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
          ... ...
                
         <!--声明拦截器栈-->
         <interceptor-stack name="basicStack">
          ... ...
         <interceptor-ref name="exception"/>
          ... ...
         </interceptor-stack>
                
       </interceptors>
            
       <!-- 默认的拦截器引用 -->
       <default-interceptor-ref name="defaultStack"/>
            
    1.2 源码分析interceptor的执行过程(简化源码)
        --->StrutsPrepareAndExecuteFilter
        --->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        --->execute.executeAction(request, response, mapping);
        --->dispatcher.serviceAction(request, response, mapping);
        --->ActionProxy proxy = createActionProxy();
        --->proxy.execute();
        --->retCode = invocation.invoke();
        --->
          Iterator<InterceptorMapping> interceptors;
                
          //判断迭代器集合中是否还有下一个(递归)
          if (interceptors.hasNext()) {
             final InterceptorMapping interceptor = interceptors.next(); //获得当前InterceptorMapping对象
             resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
                       获得拦截器对象本身  调用该拦截器内部的拦截方法intercept    
        
             } else {
               resultCode = invokeActionOnly(); //仅仅执行当前要访问目标Action
             }
                
            PS:
              resultCode:逻辑视图名,字符串
                    
              总结:
                 如果在interceptor中调用invocation.invoke(); 代表放行
                 如果在interceptor中return 字符串,代表不放行 , 且return的字符串就是要匹配的逻辑视图
                
             PS:
              <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
                 class InterceptorMapping{
                 private String name;  //modelDriven
                 private Interceptor interceptor;  //class对应全限定名的对象
                }
        
细节点:拦截器的作用范围
           1、当前包下所有的Action都执行配置的拦截器
                <default-interceptor-ref name="my"></default-interceptor-ref>
           2、action可以执行自己局部的interceptor
                <action name="target_*" class="com.itheima.action.TargetAction" method="{1}">
                <interceptor-ref name="my"></interceptor-ref>
                <result name="success">/success.jsp</result>
                </action>
                
            3、action中的方法可以执行局部的interceptor
                 例如:访问target的show方法执行my拦截器  访问target的xxx方法不执行my拦截器
                
                 class MyInterceptor3 extends MethodFilterInterceptor
                
                <interceptor-ref name="my3">
                    <param name="excludeMethods">xxx</param>
                </interceptor-ref>

2、struts2自定义拦截器
    开发步骤:
      1、自定义拦截器类 实现interceptor接口(继承interceptor的实现类)
      2、实现intercept方法,该方法封装拦截功能的逻辑代码
      3、在struts.xml中配置拦截器
          声明拦截器
          使用拦截器
      4、测试
    
   
二、Struts2的注解开发

Struts2的注解开发 主要 是对Action的xml配置替代
    
    Struts2注解开发需要导入额外jar包:Struts2-convention-plugin.jar

作用到类上的注解
    @Namespce()
    @ParentPackage()
    @Results({})
    @Result(name,type,location)
    @InterceptorRefs({})
    @InterceptorRef()

作用到方法的注解
    @Action(
        value="",
        results={},
        interceptorRefs={}
    )
    
    
   注意
        struts默认扫描action,actions,struts,struts2这4个包的注解  手动配置扩充包名称
        <constant name="struts.convention.package.locators" value="action,actions,struts,struts2,web"/>

Struts2知识点小结(四)--拦截器与注解开发的更多相关文章

  1. Struts2(十四)拦截器实现权限管理

    一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...

  2. 框架学习之Struts2(四)---拦截器和标签

    一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...

  3. SpringMVC(AbstractController,拦截器,注解)

    1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndVie ...

  4. Struts2基础学习(五)—拦截器

    一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...

  5. 【struts2】预定义拦截器

    1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...

  6. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  7. Struts2 (四) — 拦截器

    一.拦截器 1.概述 1.1什么是拦截器 ​ 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. ​ 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...

  8. struts2(三) 输入校验和拦截器

    前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...

  9. Struts2 源码分析——拦截器的机制

    本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...

随机推荐

  1. 弹性布局学习-详解 align-items(四)

    目录 弹性布局学习-介绍(一)  弹性布局学习-详解 flex-direction[决定主轴的方向](二) 弹性布局学习-详解 justify-content(三) 弹性布局学习-详解 align-i ...

  2. 02.ArrayList和HashTable

    ArrayList集合 数组的缺点: (1).数组只能存储相同类型的数据. (2).数组的长度要在定义时确定. 集合的好处: (1).集合可以存储多种不同类型的数据. (2).集合的长度是可以任意改变 ...

  3. [转]Tomcat优化之内存、并发、缓存

    1.Tomcat内存优化 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS 参数. JAVA_OPTS ...

  4. -ms-zoom property

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  6. adnroid 自定义ProgressDialog加载中

    用来记录自己所用到的知识 前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了一个加载中的logo图用来提高用户体验. 于是就在网上找了 ...

  7. 域名和DNS服务器

    概念性的东西: 域名:     ①.百度:域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理 ...

  8. VC++动态链接库(DLL)编程

    一.概论 1:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/698632.html 2:http://pcedu.pconline.com. ...

  9. 《浪潮之巅》(第2版):精彩的IT商战史

    2011年看过第一版.以为看新版会跳过大部分看过的内容,结果发现还是从头到尾看了一遍,2011年看过的内容已经记不太确切了:) 另外IT的历史太精彩了,许多故事都知道,再看还是挺有意思.当然作者的文字 ...

  10. Java程序员面试题集2

    51.类ExampleA 继承Exception,类ExampleB 继承ExampleA. 有如下代码片断: try{ throw new ExampleB("b") }catc ...