核心组件拦截器底层解剖

1.拦截器介绍

struts2的核心就是拦截器,param,modelDriven,validation,servletAPI等等这些都是拦截器完成的功能。

 

 

        服务器启动时实例化StrustPrepareAndExecuteFilter,读取struts所有的配置文件,吧struts.xml中的每一个Action实例化,当一个请求访问的时候,StrutsPrepareAndExecuteFilter会把请求拦截下来,匹配一个ActionMapper,然后ActionMapper创建ActionProxy,然后去执行默认的拦截器栈,在执行Action,然后返回结果,然后默认拦截器在反向执行(做一些运行期的监控和清理工作,不是每一个拦截器都执行后置拦截),最后把响应结果返回给页面。

2.自定义拦截器

自定义拦截器我们需要继承Abstractcetor

创建拦截器类:

package interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("前置拦截执行。。。");
        // 让拦截器向下走并且返回结果代码
        String invoke = actionInvocation.invoke();
        System.out.println("后置拦截执行");
        return invoke;
    }
}

 

配置拦截器:

<package name="hello" extends="struts-default" namespace="/person">
    <!--拦截器配置-->
    <interceptors>
        <interceptor name="myInterceptor" class="interceptor.MyInterceptor"></interceptor>
    </interceptors>

    <action name="hello" class="action.HelloWorld10" method="Save">
        <!--引用拦截器-->
        <interceptor-ref name="myInterceptor"></interceptor-ref>
        <result name="success">/success.jsp</result>
        <result name="input">/index.jsp</result>
    </action>
</package>

 

可从执行结果看到执行顺序:前置拦截-》action->页面执行-》后置拦截。

3.拦截器和拦截器栈实战配置

 

<package name="mydefault" extends="struts-default" abstract="true">
    <!--拦截器配置-->
    <interceptors>
        <!--自定义拦截器-->
        <interceptor name="myInterceptor" class="interceptor.MyInterceptor"></interceptor>
        <!--拦截器栈:是把多个拦截器集中到一起统一被继承引用-->
        <interceptor-stack name="myStack">
            <!--拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="myInterceptor"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
    <!--把myStack作为默认拦截器,只要继承了mydefault,执行Action时就会自动先执行myStack中的所有拦截器-->
    <default-interceptor-ref name="myStack"></default-interceptor-ref>
</package>
<package name="hello" extends="mydefault" namespace="/person">
    <action name="hello" class="action.HelloWorld10" method="Save">
        <!--引用拦截器-->
        <!--  <interceptor-ref name="myInterceptor"></interceptor-ref>-->
        <result name="success">/success.jsp</result>
        <result name="input">/index.jsp</result>
    </action>
</package>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值