SpringMVC和Struts2中拦截器实现思路思想

SpringMVC中拦截器的实现思想
springMVC中拦截器的实现主要是通过doFilte()方法的返回值(boolean)来控制拦截器是否继续向下执行,如果返回true执行,则放行到下一个拦截器或者放行到最终处理请求的方法中。如果在执行中途返回了false,则触发执行triggerAfter()方法,否则就一直执行完处理请求的那个方法再触发执行triggerAfter()方法。(注:after()方法和before()方法是在拦截请求之前和之后可以做一些事情,这里是通过拦截器来实现的,其实还可以用动态代理来实现,但是这里不进行讲述)
package org.springmvcinterceptor;

import java.util.ArrayList;
import java.util.List;

public class InterceptorExecutor {

private List<Interceptor> interceptorList=new ArrayList<>();
private int interceptorIndex=-1;

public InterceptorExecutor(){
    interceptorList.add(new Interceptor1());
    interceptorList.add(new Interceptor2());
    interceptorList.add(new Interceptor3());
}

/**
 * 控制执行所有过滤器中的方法
 */
public void execute(){
    for(int i=0;i<interceptorList.size();i++){
        if(interceptorList.get(i).doFilter()){
            interceptorList.get(i).before();
            interceptorList.get(i).doFilter();
            //记录好程序执行到哪个拦截器
            interceptorIndex=i;
        }else{
            triggerAfter();
        }
    }

}

/**
 * 当doFilter方法返回false时(即程序被拦截不放行时)
 * 触发执行之前执行过doFilter方法的拦截器的after方法
 */
public void triggerAfter(){
    for(int j=interceptorIndex-1;j>0;j--){
        interceptorList.get(j).after();
    }
}

}

package org.springmvcinterceptor;

public interface Interceptor {

boolean before();

boolean doFilter();

void after();

}

package org.springmvcinterceptor;

public class Interceptor1 implements Interceptor {
@Override
public boolean before() {
return true;
}

@Override
public boolean doFilter() {
    return false;
}

@Override
public void after() {

}

}

package org.springmvcinterceptor;

public class Interceptor2 implements Interceptor {
@Override
public boolean before() {
return true;
}

@Override
public boolean doFilter() {
    return false;
}

@Override
public void after() {

}

}

package org.springmvcinterceptor;

public class Interceptor3 implements Interceptor {
@Override
public boolean before() {
return false;
}

@Override
public boolean doFilter() {
    return false;
}

@Override
public void after() {

}

}


Struts2中拦截器的实现
struts2中的拦截器是通过递归的方式来实现的,假设有一个A,在类的构造方法中将所有元素放到list集合中,在A方法中调用类B的bm1()方法,并将A对象自身(this)传给B类,在B类中又调用A类中的am1()方法,在B类调用A类am1()方法之前可以做一些事情,类似于拦截器的before()方法,在之后做的事情类似于拦截器的after()方法,跳出递归的条件相当于执行完了最终处理请求的方法。

public class A {

private  C c = new C();
List<B> bList = new ArrayList<>();
public A(){
    bList.add(new B(1));
    bList.add(new B(2));
    bList.add(new B(3));
    bList.add(new B(4));
}

private  int i = -1;
public  void am1(){
    i++;
    if(i>= bList.size()) {
        c.cm1();
    }else {


        B b = bList.get(i);
        b.bm1(this);
        //System.out.println("method 1 in a----" + i);
    }
}

}

public class B {
private int id;

public B(int id) {
    this.id = id;
}

public  void bm1(A a){
    System.out.println("method 1 in B before*****" + id);
    a.am1();
    System.out.println("method 1 in b after -----"  + id);
}

}

public class Main {
public static void main(String[] args) {
A a = new A();
a.am1();
}
}

执行结果:

method 1 in B before*****1
method 1 in B before*****2
method 1 in B before*****3
method 1 in B before*****4
method 1 in c—–
method 1 in b after —–4
method 1 in b after —–3
method 1 in b after —–2
method 1 in b after —–1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crispin Deng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值