zoukankan      html  css  js  c++  java
  • Struts2知识点小结(四)--拦截器与注解开发

    一、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"/>

  • 相关阅读:
    WEB前端开发工具的初识
    Linux常见问题的处理方法(长期更新)
    eclipse+tomcat开发web项目
    Android适配--百分比的适配
    TCP通信丢包原因总结
    android 实现类似微信缓存和即时更新好友头像
    是否应该开启WebView硬件加速?
    Android通过浏览器打开app页面并且传递值
    设计模式(五)责任链模式
    Android 最新 Support V4 包大拆分有用吗?
  • 原文地址:https://www.cnblogs.com/itworkerlittlewrite/p/9445375.html
Copyright © 2011-2022 走看看