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对应全限定名的对象
                    }
        

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

猜你喜欢

转载自www.cnblogs.com/itworkerlittlewrite/p/9445375.html
今日推荐