浅谈Spring中HandlerMapping的使用

 更新时间:2023年08月31日 10:18:21   作者:沐雨金鳞  
这篇文章主要介绍了浅谈Spring中HandlerMapping的使用,Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理,这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等,需要的朋友可以参考下

HandlerMapping

  • Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理(这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等)

来看一个http请求的入口DispatcherServlet:

  • DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。

可以看出,springmvc的DispatcherServlet是在Servelt的基础上做了扩展处理。

doService方法为servlet处理请求的入口,DispatcherServlet中做了方法覆盖,doService方法中的doDispatch(request,response)方法,是springmvc处理整个请求流程的关键。

  • mappedHandler =getHandler(processedRequest);
  • 这行代码实现了为请求寻找处理handler,返回的是HandlerExecutionChain;
  • HandlerAdapter ha =getHandlerAdapter(mappedHandler.getHandler());
  • 找到处理handler后,再去找匹配的HandlerAdapter,HandlerAdapter将完成后续处理。

继续看是如何找到请求对应的处理handler的:

可以看出是从类变量this.handlerMappings中循环获取,当找到与之匹配的HandlerMapping时,返回类型为HandlerExecutionChain的handler。

这里this.handlerMappings中的值是从哪获取的呢?DispatcherServlet初始化的时候会给this.handlerMappings赋值:

  • 从这里可以看出,在servlet初始化的时候,会对springmvc的HandlerMappings、HandlerAdapters等做初始化。
  • 这里三个步骤,先对springmvc.xml里配置的HandlerMapping进行初始化、实例化,再对this.handlerMappings赋值,最后对this.handlerMappings进行排序。
  • 这里的排序就是对HandlerMapping的order属性进行排序,这样,order属性值小的,就可以先对请求进行匹配。

从tomcat启动日志里可以看到HandlerMapping的初始化:

 这里涉及到两个HandlerMapping:

  • 第一个是BeanNameUrlHandlerMapping,初始化时会将urlpath做映射存储;
  • 第二个是RequestMappingHandlerMapping,初始化时会将Controller中配置@RequestMapping注解的方法做映射存储。

HandlerMapping初始化时,会将映射与handler存储到map里;处理请求时,从map里取出对应的处理handler。

这就是HandlerMapping在springmvc里的大致处理流程。

到此这篇关于浅谈Spring中HandlerMapping的使用的文章就介绍到这了,更多相关HandlerMapping的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RabbitMQ实现消息可靠性传递过程讲解

    RabbitMQ实现消息可靠性传递过程讲解

    消息的可靠性传递是指保证消息百分百发送到消息队列中去,这篇文章主要介绍了RabbitMQ实现消息可靠性传递过程,感兴趣想要详细了解可以参考下文
    2023-05-05
  • java多态中的就近原则介绍

    java多态中的就近原则介绍

    大家好,本篇文章主要讲的是java多态中的就近原则介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)

    使用springboot跳转到指定页面和(重定向,请求转发的实例)

    这篇文章主要介绍了使用springboot跳转到指定页面和(重定向,请求转发的实例),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • springboot集成nacos读取nacos配置数据的原理

    springboot集成nacos读取nacos配置数据的原理

    这篇文章主要介绍了springboot集成nacos读取nacos配置数据的原理,文中有详细的代码流程,对大家学习springboot集成nacos有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Java中的Scanner、BufferedReader 和 StreamTokenizer使用详解

    Java中的Scanner、BufferedReader 和 StreamTokenizer使用详解

    Scanner是Java 中一个用于解析原始类型(如 int、double 等)和字符串的类,它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使用,本文介绍Java中的Scanner、BufferedReader 和 StreamTokenizer的相关知识,感兴趣的朋友一起看看吧
    2025-02-02
  • Spring HandlerInterceptor实现原理代码解析

    Spring HandlerInterceptor实现原理代码解析

    这篇文章主要介绍了Spring HandlerInterceptor实现原理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 初次使用IDEA创建maven项目的教程

    初次使用IDEA创建maven项目的教程

    这篇文章主要介绍了初次使用IDEA创建maven项目的教程讲解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 详解Java的位运算

    详解Java的位运算

    这篇文章主要介绍了详解Java的位运算,程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作,需要的朋友可以参考下
    2023-04-04
  • Java程序员面试中的多线程问题总结

    Java程序员面试中的多线程问题总结

    这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。
    2016-11-11
  • Maven中plugins与pluginManagement的区别说明

    Maven中plugins与pluginManagement的区别说明

    这篇文章主要介绍了Maven中plugins与pluginManagement的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论