iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring MVC启动之HandlerMapping作用及实现方法是什么
  • 454
分享到

Spring MVC启动之HandlerMapping作用及实现方法是什么

2023-07-05 18:07:53 454人浏览 薄情痞子
摘要

这篇“spring mvc启动之HandlerMapping作用及实现方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起

这篇“spring mvc启动之HandlerMapping作用及实现方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring MVC启动之HandlerMapping作用及实现方法是什么”文章吧。

    作用

    在 Spring MVC 框架中,HandlerMapping 是一个非常重要的组件,它的作用是将URL请求映射到相应的处理程序上。具体来说,HandlerMapping 会根据URL请求的路径、请求参数等信息,确定需要执行哪个处理程序,并将该处理程序返回给 DispatcherServlet。然后 DispatcherServlet 再将请求分配给相应的处理程序,处理程序处理完请求后,将结果返回给 DispatcherServlet,DispatcherServlet 再将结果返回给客户端。

    Spring MVC启动之HandlerMapping作用及实现方法是什么

    HandlerMapping的实现

            Spring MVC 框架中有多种不同的 HandlerMapping 实现,每种实现都有不同的作用和使用场景。下面将逐一介绍这些实现。

    BeanNameUrlHandlerMapping

            BeanNameUrlHandlerMapping 是 Spring MVC 框架中最简单的 HandlerMapping 实现,它的作用是将 URL 请求的路径映射到 Bean 的名称上。具体来说,当请求的路径与一个 Bean 的名称匹配时,BeanNameUrlHandlerMapping 会将该请求映射到对应的 Bean 上。

    例如:

    假设有一个名为 "/hello" 的请求

    我们可以在 Spring 配置文件中定义一个名为 "helloController" 的 Bean

    然后使用 BeanNameUrlHandlerMapping 将 "/hello" 请求映射到该 Bean 上

    这样,当客户端发送 "/hello" 请求时,DispatcherServlet 就会将该请求分配给 "helloController" 处理。

    BeanNameUrlHandlerMapping 的源码比较简单,它的核心代码如下所示:

    public class BeanNameUrlHandlerMapping extends AbstractUrlHandlerMapping {    protected Object getHandlerInternal(httpservletRequest request) throws Exception {        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);        return obtainHandler(lookupPath, request);    }}

            从代码中可以看出,BeanNameUrlHandlerMapping 实现了 AbstractUrlHandlerMapping 接口,并重写了其中的 getHandlerInternal 方法。该方法的作用是根据请求的 URL 路径查找相应的处理程序

    SimpleUrlHandlerMapping

    SimpleUrlHandlerMapping 是 Spring MVC 框架中另一种常用的 HandlerMapping 实现,它的作用是将 URL 请求的路径映射到处理程序上。与 BeanNameUrlHandlerMapping 不同的是,SimpleUrlHandlerMapping 可以将一个URL请求映射到多个处理程序上

    例如:

    假设有两个请求 "/hello" 和 "/world"

    我们可以使用 SimpleUrlHandlerMapping 将这两个请求分别映射到不同的处理程序上。具体来说,我们可以在 Spring 配置文件中定义多个 Bean,并分别为它们设置不同的URL路径。

    然后使用 SimpleUrlHandlerMapping 将这些URL路径与相应的处理程序进行映射。

    这样,当客户端发送一个请求时,SimpleUrlHandlerMapping 就会根据请求的URL路径查找相应的处理程序,并将请求分配给该处理程序处理。

    SimpleUrlHandlerMapping 的源码也比较简单,它的核心代码如下所示:

    public class SimpleUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);        Object handler = lookupHandler(lookupPath, request);        if (handler == null) {            handler = getDefaultHandler();        }        return handler;    }}

            从代码中可以看出,SimpleUrlHandlerMapping 同样实现了 AbstractUrlHandlerMapping 接口(在 AbstractDetectingUrlHandlerMapping 中继承),并重写了其中的 getHandlerInternal 方法。该方法的作用是根据请求的URL路径查找相应的处理程序。

    ControllerClassNameHandlerMapping

            ControllerClassNameHandlerMapping 是Spring MVC 框架中一种比较特殊的 HandlerMapping 实现,它的作用是将URL请求的路径映射到 Controller 类名上。具体来说,ControllerClassNameHandlerMapping 会根据请求的URL路径查找对应的 Controller 类名,并将该类返回给 DispatcherServlet,然后 DispatcherServlet 再将请求分配给该 Controller 类处理。

    例如:

    假设有一个名为 "/hello" 的请求

    我们可以定义一个名为 HelloController的Controller 类

    使用 ControllerClassNameHandlerMapping 将 "/hello" 请求映射到该类上。

    这样,当客户端发送 "/hello" 请求时,ControllerClassNameHandlerMapping 就会将该请求映射到 HelloController 处理。

    ControllerClassNameHandlerMapping 的源码也比较简单,它的核心代码如下所示:

    public class ControllerClassNameHandlerMapping extends AbstractControllerUrlHandlerMapping {    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {        String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);        String controllerClassName = getClassNameForUrlPath(lookupPath);        return obtainApplicationContext().getBean(controllerClassName);    }}

            从代码中可以看出,ControllerClassNameHandlerMapping 同样实现了 AbstractUrlHandlerMapping 接口,并重写了其中的 getHandlerInternal 方法。该方法的作用是根据请求的URL路径查找相应的 Controller 类名,并将该类返回给 DispatcherServlet。

    DefaultAnnotationHandlerMapping

            DefaultAnnotationHandlerMapping 是Spring MVC 框架中另一种比较常用的 HandlerMapping实 现,它的作用是将 URL 请求的路径映射到标注了 @RequestMapping 注解的方法上

            具体来说,DefaultAnnotationHandlerMapping 会扫描应用程序中所有标注了 @RequestMapping 注解的方法,并将这些方法与相应的URL路径进行映射。

            然后当客户端发送一个请求时,DefaultAnnotationHandlerMapping 就会根据请求的URL路径查找相应的处理程序,并将该处理程序返回给 DispatcherServlet,然后 DispatcherServlet 再将请求分配给该处理程序处理。

    例如:

    假设有一个名为 "/hello" 的请求

    我们可以在 Controller 类的某个方法上标注 @RequestMapping 注解

    将该方法与 "/hello" 请求进行映射。

    这样,当客户端发送 "/hello" 请求时,DefaultAnnotationHandlerMapping 就会将该请求映射到该方法上,然后将该方法返回给 DispatcherServlet 处理。

    DefaultAnnotationHandlerMapping 的源码比较复杂,因为它需要扫描应用程序中所有标注了 @RequestMapping 注解的方法。其核心代码如下所示:

    public class DefaultAnnotationHandlerMapping extends AbstractDetectingUrlHandlerMapping implements BeanFactoryAware, InitializingBean {    private final List<RequestMappingInfoHandlerMapping> handlerMappings = new ArrayList<>();    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {        for (RequestMappingInfoHandlerMapping hm : this.handlerMappings) {            HandlerExecutionChain handler = hm.getHandler(request);            if (handler != null) {                return handler;            }        }        return null;    }    public void afterPropertiesSet() throws Exception {        initHandlerMethods();    }    protected void initHandlerMethods() {        detectHandlerMethods();        if (logger.isInfoEnabled()) {            logger.info("Mapped " + this.handlerMethods.size() + " request handler methods");        }    }    protected void detectHandlerMethods() {        ...    }}

            从代码中可以看出,DefaultAnnotationHandlerMapping 同样实现了 AbstractUrlHandlerMapping 接口,并重写了其中的 getHandlerInternal 方法。该方法的作用是根据请求的 URL 路径查找相应的处理程序。

            与其他 HandlerMapping 不同的是,DefaultAnnotationHandlerMapping 还实现了 BeanFactoryAware和InitializingBean 接口,以便在初始化时扫描应用程序中所有标注了 @RequestMapping 注解的方法。

            具体来说,它会调用 detectHandlerMethods 方法,对应用程序中所有标注了 @RequestMapping 注解的方法进行扫描,并将这些方法与相应的URL路径进行映射。

    以上就是关于“Spring MVC启动之HandlerMapping作用及实现方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Spring MVC启动之HandlerMapping作用及实现方法是什么

    本文链接: https://www.lsjlt.com/news/354520.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Spring MVC启动之HandlerMapping作用及实现方法是什么
      这篇“Spring MVC启动之HandlerMapping作用及实现方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起...
      99+
      2023-07-05
    • Java之System.getProperty()的作用及使用方法是什么
      今天小编给大家分享一下Java之System.getProperty()的作用及使用方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2023-07-05
    • Docker启动常用容器命令及配置方法是什么
      这篇文章主要介绍了Docker启动常用容器命令及配置方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker启动常用容器命令及配置方法是什么文章都会有所收获,下面我们一起来看看吧。Docker 容器...
      99+
      2023-07-05
    • Java动态代理的原理及实现方法是什么
      本篇内容主要讲解“Java动态代理的原理及实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java动态代理的原理及实现方法是什么”吧!代理是指:某些场景下对象会找一个代理对象,来辅助...
      99+
      2023-07-02
    • Java中​HashMap的工作原理及实现方法是什么
      今天小编给大家分享一下Java中HashMap的工作原理及实现方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Has...
      99+
      2023-06-03
    • Spring静态代理和动态代理概念及使用方法是什么
      这篇文章主要讲解了“Spring静态代理和动态代理概念及使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring静态代理和动态代理概念及使用方法是什么”吧!代理模式在学习 A...
      99+
      2023-07-05
    • SpringMVC MethodArgumentResolver的作用与实现方法是什么
      这篇文章主要介绍“SpringMVC MethodArgumentResolver的作用与实现方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC Meth...
      99+
      2023-07-06
    • Vue实现自动检测及版本更新的方法是什么
      这篇“Vue实现自动检测及版本更新的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue实现自动检测及版本更新的方...
      99+
      2023-07-05
    • koa-compose简单实现及使用的方法是什么
      这篇“koa-compose简单实现及使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“koa-compose简...
      99+
      2023-07-06
    • 中项目启动时实现初始化方法的加载参数是什么
      中项目启动时实现初始化方法的加载参数是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springboot项目启动,初始化方法加载参数今天我看到项目中用到了 ...
      99+
      2023-06-22
    • PHP消息队列实现及运用的方法是什么
      这篇文章主要讲解了“PHP消息队列实现及运用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP消息队列实现及运用的方法是什么”吧!消息队列的概念、原理、实现方式概念队列结构的一...
      99+
      2023-07-04
    • DrawerLayout的简单使用及侧滑菜单实现方法是什么
      本篇内容主要讲解“DrawerLayout的简单使用及侧滑菜单实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“DrawerLayout的简单使用及侧滑菜单实现方法是什么”吧!1.使用...
      99+
      2023-07-06
    • PHP+Socket中IO多路复用及实现web服务器的方法是什么
      本篇内容介绍了“PHP+Socket中IO多路复用及实现web服务器的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php原生so...
      99+
      2023-07-05
    • MySQL存储过程创建使用及实现数据快速插入的方法是什么
      本文小编为大家详细介绍“MySQL存储过程创建使用及实现数据快速插入的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL存储过程创建使用及实现数据快速插入的方法是什么”文章能帮助大家解决疑...
      99+
      2023-03-10
      mysql
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作