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类图
《Spring MVC分析篇——HandleMapping》

SpringMVC自带的HandleMapping实现有3种。

  1. SimpleUrlHandlerMapping
  2. BeanNameUrlHandlerMapping
  3. RequestMappingHandlerMapping
    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/u011983531/article/details/83688929
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞