A.拦截器是什么

 --- Interceptor:拦截器,起到拦截Action的作用。

 ---Filter:过滤器,过滤从客户端向服务器发送的请求。

 ---Interceptor:拦截器,拦截是客户端对Action的访问。更细粒度化的拦截。(拦截Action中的具体的方法)。Struts2框架核心的功能都是依赖拦截器实现。

 

B.Struts2的执行流程

          

 

客户端向服务器发送一个Action的请求,执行核心过滤器(doFilter)方法。在这个方法中,调用executeAction()方法,在这个方法内部调用dispatcher.serviceAction();在这个方法内部创建一个Action代理,最终执行的是Action代理中的execute(),在代理中执行的execute方法中调用ActionInvocation的invoke方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action,根据Action的返回的结果进行页面跳转。

 

c.拦截器入门

  1.搭建Struts2环境

    

  2.编写拦截器类

       --编写一个类实现Interceptor接口或者继承AbstractInterceptor。当然继承AbstractInterceptor的子类MethodFilterInterceptor更好,里面两个变量专门可以拦截或者放行某些方法。

自定义拦截器:   

public class MyInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("自定义拦截器开始执行");
        String obj = invocation.invoke();
        System.out.println("自定义拦截器执行结束");
        return obj;
    }
}

配置拦截器:

 1.定义拦截器方式配置

 

<package name="struts" extends="struts-default"><interceptors>    <!--配置自己的拦截器-->
            <interceptor name="MyInterceptor" class="com.xxx.web.action.MyInterceptor"/>
        </interceptors>
        <action name="upload" class="com.xxx.web.action.FileUploadAction">
            <interceptor-ref name="MyInterceptor"></interceptor-ref>   <!--引入拦截器,让它生效-->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result>/File/success.jsp</result>
        </action>
    </package>

 

  2.自定义拦截器栈

<interceptors>
            <interceptor name="MyInterceptor" class="com.xxx.web.action.MyInterceptor"/>
            <interceptor-stack name="mystack">              <!--直接定义自己的拦截器栈,将所有需要的拦截器放进去,在action中直接放拦截器栈声明生效就行了-->
                <interceptor-ref name="MyInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <action name="upload" class="com.xxx.web.action.FileUploadAction">
            <interceptor-ref name="mystack"></interceptor-ref>
            <result>/File/success.jsp</result>
        </action>

上面两种方式都有一个defaultStack,这是struts2框架的拦截器栈,如下图所示,里面有很多拦截器,如国际化,校验,文件上传等等,想要运行struts2,就需要该defaultStack拦截器栈,当然,如果你可以做出比他更好,功能更强的,那就用你自己的就行,只要配置了自定义拦截器栈,原先struts2的拦截器就不会生效,要想原先的生效,要加上defaultStack就行。

 

                        

 

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程