Spring MVC分析篇——HandleMapping

  Sping MVC是一个web开发框架,用于处理Http请求,那首先要做的第一件事情就是要为每个url找到对应的java类及方法。至于寻找的方式就有很多了,简单的做法,可以用一个Map保存所有url和“java类及方法”之间的映射;复杂一点的,使用注解来定义方法和url的关系……所以,自然而然的,我们可以抽象出一个接口来表示这个寻找动作,不同的人可以按照自己的需求订制这种寻找过程。
  那么这个接口应该如何设计呢,很容易想到的是,这个接口有一个方法,入参是HttpServletRequest,出参是java类和方法。那么问题的关键就落到了这个出参上面。关于出参的定义,最主要的是解决下面几个问题:

  • 返回的出参必须具有执行请求的能力,简单说就是能够解析入参,执行java方法,返回结果。要实现这个就比较复杂了,因为参数的解析方式多种多样,每个java类的会有很多方法,每个方法的出入参也千差万别。所以SpingMVC在设计的时候,将这个复杂的逻辑交给了HandleAdaptor,HandleMapping只需要返回需要执行的类就行了。
  • 以前,我们定义拦截器可以实现Filter接口,然后在web.xml配置需要拦截的path就行,但是这样的拦截器没法交给SpingMVC管理,为了实现统一的管理,SpringMVC实现自定义了拦截器接口。定义拦截器接口、实现拦截器都很简单,麻烦的时候,拦截器什么时候应该调用,应该拦截哪些请求。最好的办法是每次处理请求时,返回java类的时候,一并返回这次请求的拦截器。

基于上面的几点,于是乎就有了 HandleMapping接口。

public interface HandlerMapping {
	/**
	 * 获取请求对应的处理类和拦截器
	 */
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

/**
 * 返回结果:包括具体的Handler,拦截器
 */
public class HandlerExecutionChain {

	// 具体的Handler,不等同于Controller哟。因为HandlerMapping的实现方式有很多,最早的版本,其实handler就是实现了Controller接口的对象,后来的注解版本,其实已经是HandleMethod对象了。不管怎么样,这个handler就是一个可执行请求的对象。
	private final Object handler;
    
    // 拦截器数组,下面还有一个拦截器列表,为什么会有两个,待续……
	private HandlerInterceptor[] interceptors;

	private List<HandlerInterceptor> interceptorList;

	private int interceptorIndex = -1;
    
    // ………………此处省略一批方法
}

HandleMapping类图
HandleMapping类图

SpringMVC自带的HandleMapping实现有3种。

  1. SimpleUrlHandlerMapping
  2. BeanNameUrlHandlerMapping
  3. RequestMappingHandlerMapping
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值