拦截器

概述

基本概念

Intercetor, 即为拦截器。
    1) 在Struts2中,把每一个功能都用一个个的拦截器实现;用户想用struts的哪个功能的时候,可以自由组装使用。
    2) Struts2中,为了方法用户对拦截器的引用,提供了拦截器栈的定义,里面可以包含多个拦截器。文件夹(文件, 文件2)  拦截器栈(拦截器,拦截器2)
    3) Struts2中,如果用户没有指定执行哪些拦截器,struts2有一个默认执行的栈,defaultStack;
            一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行

拦截器的设计,就是基于组件设计的应用!

拦截器配置举例

struts-default.xml文件中,定义了struts提供的所有拦截器!
1. 定义拦截器以及拦截器栈
<interceptors>
    1.1 拦截器定义
    <interceptor name="" class="" /> 

    1.2 拦截器栈的定义
    <interceptor-stack name="defaultStack">
    引用了上面拦截器(1.1)
    </interceptor-stack>
</interceptors>

2. 默认执行的拦截器(栈)
<default-interceptor-ref name="defaultStack"/>

API

|-- Interceptor  拦截器接口
   |-- AbstractInterceptor  拦截器默认实现的抽象类; 一般用户只需要继承此类即可继续拦截器开发

|-- ActionInvocation 拦截器的执行状态,调用下一个拦截器或Action

自定义一个拦截器案例

步骤:
    1. 写拦截器类 (看生命周期)
    2. 配置

/**
 * 自定义拦截器
 */
public class HelloInterceptor implements Interceptor{

    // 启动时候执行
    public HelloInterceptor(){
        System.out.println("创建了拦截器对象");
    }

    // 启动时候执行
    @Override
    public void init() {
        System.out.println("执行了拦截器的初始化方法");
    }

    // 拦截器业务处理方法 (在访问action时候执行? 在execute之前执行?)
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("2. 拦截器,业务处理-开始");

        // 调用下一个拦截器或执行Action  (相当于chain.doFilter(..)
        // 获取的是: execute方法的返回值
        String resultFlag = invocation.invoke();

        System.out.println("4. 拦截器,业务处理-结束");

        return resultFlag;
    }


    @Override
    public void destroy() {
        System.out.println("销毁....");
    }


}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="hello" extends="struts-default">

        <!-- 【拦截器配置】 -->
        <interceptors>

            <!-- 配置用户自定义的拦截器 -->
            <interceptor name="helloInterceptor" class="cn.itcast.a_interceptor.HelloInterceptor"></interceptor>

            <!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
            <interceptor-stack name="helloStack">
                <!-- 引用默认栈 (一定要放到第一行)-->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用自定义拦截器 -->
                <interceptor-ref name="helloInterceptor"></interceptor-ref>
            </interceptor-stack>

        </interceptors>

        <!-- 【执行拦截器】 -->
        <default-interceptor-ref name="helloStack"></default-interceptor-ref>


        <!-- Action配置 -->
        <action name="hello" class="cn.itcast.a_interceptor.HelloAction">
            <result name="success"></result>
        </action>


    </package>
</struts>

拦截器执行流程

启动:
    创建所有拦截器、执行init()
访问:
    先创建Action,
    再执行拦截器,
    最后:拦截器放行,执行execute();

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值