iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用SpringMVC请求怎么对handler进行映射
  • 240
分享到

使用SpringMVC请求怎么对handler进行映射

2023-06-14 06:06:13 240人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关使用springMVC请求怎么对handler进行映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。请求映射源码前台发送给后台的访问请求是如何找到对应的控制器映射并执行后

这期内容当中小编将会给大家带来有关使用springMVC请求怎么对handler进行映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

请求映射源码

使用SpringMVC请求怎么对handler进行映射

前台发送给后台的访问请求是如何找到对应的控制器映射并执行后续的后台操作呢,其核心为DispatcherServlet.java与HandlerMapper。在Spring Boot初始化的时候,将会加载所有的请求与对应的处理器映射为HandlerMapper组件。我们可以在springmvc的自动配置类中找到对应的Bean。

@Bean@Primary@Overridepublic RequestMappingHandlerMapping requestMappingHandlerMapping(  @Qualifier("mvcContentNeGotiationManager") ContentNegotiationManager contentNegotiationManager,  @Qualifier("mvcConversionService") FORMattinGConversionService conversionService,  @Qualifier("mvcResourceUrlProvider") ResourceUrlProvider resourceUrlProvider) {  // Must be @Primary for MvcUriComponentsBuilder to work  return super.requestMappingHandlerMapping(contentNegotiationManager, conversionService,                       resourceUrlProvider);}@Beanpublic WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,                              FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {  WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(    new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),    this.mvcProperties.getStaticPathPattern());  welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));  welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());  return welcomePageHandlerMapping;}

请求将首先执行FrameworkServlet下的service方法根据request请求的method找到对应的do**方法。

@Overrideprotected void service(httpservletRequest request, HttpServletResponse response)  throws ServletException, IOException {  HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());  if (httpMethod == HttpMethod.PATCH || httpMethod == null) {    processRequest(request, response);  }  else {    //父类根据method参数执行doGet,doPost,doDelete等    super.service(request, response);  }}

而这些do**其都会进入核心方法,以doGet为例。

@Overrideprotected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  //核心方法  processRequest(request, response);}
protected final void processRequest(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  try {  //进入此核心方法  doService(request, response);}catch (ServletException | IOException ex) {  failureCause = ex;  throw ex;}catch (Throwable ex) {  failureCause = ex;  throw new NestedServletException("Request processing failed", ex);}finally {  resetContextHolders(request, previousLocaleContext, previousAttributes);  if (requestAttributes != null) {    requestAttributes.requestCompleted();  }  logResult(request, response, failureCause, asyncManager);  publishRequestHandledEvent(request, response, startTime, failureCause);}

processRequest()方法中重点在doService(request, response);,而其核心处理逻辑位于DispatchServletl类重写的方法,如下。

@Overrideprotected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { ····   try {     //这里为实际分发控制器的逻辑,其内部是找到对应的handlerMapper     doDispatch(request, response);   }    finally {      if (!WEBAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {        // Restore the original attribute snapshot, in case of an include.        if (attributesSnapshot != null) {          restoreAttributesAfterInclude(request, attributesSnapshot);        }      }      if (requestPath != null) {        ServletRequestPathUtils.clearParsedRequestPath(request);      }    }}

接下来看分发处理逻辑方法,其中重要的方法都使用了原生的注释。接下来分别分析核心源码。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  HttpServletRequest processedRequest = request;  HandlerExecutionChain mappedHandler = null;  boolean multipartRequestParsed = false;  WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);  try {    ModelAndView mv = null;    Exception dispatchException = null;    try {      processedRequest = checkMultipart(request);      multipartRequestParsed = (processedRequest != request);      // Determine handler for the current request.      mappedHandler = getHandler(processedRequest);      if (mappedHandler == null) {        noHandlerFound(processedRequest, response);        return;      }      // Determine handler adapter for the current request.      HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());      // Process last-modified header, if supported by the handler.      String method = request.getMethod();      boolean isGet = "GET".equals(method);      if (isGet || "HEAD".equals(method)) {        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());        if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {          return;        }      }      if (!mappedHandler.applyPreHandle(processedRequest, response)) {        return;      }      // Actually invoke the handler.      mv = ha.handle(processedRequest, response, mappedHandler.getHandler());      if (asyncManager.isConcurrentHandlingStarted()) {        return;      }      applyDefaultViewName(processedRequest, mv);      mappedHandler.applyPostHandle(processedRequest, response, mv);    }    catch (Exception ex) {      dispatchException = ex;    }    catch (Throwable err) {      // As of 4.3, we're processing Errors thrown from handler methods as well,      // making them available for @ExceptionHandler methods and other scenariOS.      dispatchException = new NestedServletException("Handler dispatch failed", err);    }    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);  }  catch (Exception ex) {    triggerAfterCompletion(processedRequest, response, mappedHandler, ex);  }  catch (Throwable err) {    triggerAfterCompletion(processedRequest, response, mappedHandler,                new NestedServletException("Handler processing failed", err));  }  finally {    if (asyncManager.isConcurrentHandlingStarted()) {      // Instead of postHandle and afterCompletion      if (mappedHandler != null) {        mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);      }    }    else {      // Clean up any resources used by a multipart request.      if (multipartRequestParsed) {        cleanupMultipart(processedRequest);      }    }  }}

首先是分析getHandler(),找到对应的处理器映射逻辑。

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {  if (this.handlerMappings != null) {    for (HandlerMapping mapping : this.handlerMappings) {      HandlerExecutionChain handler = mapping.getHandler(request);      if (handler != null) {        return handler;      }    }  }  return null;}

我们将断点标记在getHandler方法上时,可以清除看到handlerMappings,如图。

使用SpringMVC请求怎么对handler进行映射

这里,用户请求与处理器的映射关系都在RequestMapperHandlerMapping中,而欢迎页处理请求则在WelcomePageHanderMapping中进行映射。

以下为RequestMapperHandlerMapping中映射部分截图,可以看到用户的所有请求映射这里面都有:

使用SpringMVC请求怎么对handler进行映射

getHandler()后的方法是通过比较request请求中method与HandlerMapper中相同url下的method,再进行唯一性校验,不通过异常,通过找到唯一的handler。

后续,通过handler找到处理的设配器,通过适配器得到一个ModelAndView对象,这个对象就是最后返回给前端页面的对象。

至此,一个请求完整映射到返回前端结束。

说明:这是实现了FramworkServlet的doService方法,FramworkServlet继承自HttpServlet,并且重写了父类中的doGet(),doPost(),doPut(),doDelete 等方法,在这些重写的方法里都调用了 processRquest() 方法做请求处理,进入processRquest()可以看到里面调用了FramworkServlet中定义的doService() 方法。

上述就是小编为大家分享的使用SpringMVC请求怎么对handler进行映射了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 使用SpringMVC请求怎么对handler进行映射

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

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

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

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

下载Word文档
猜你喜欢
  • 使用SpringMVC请求怎么对handler进行映射
    这期内容当中小编将会给大家带来有关使用SpringMVC请求怎么对handler进行映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。请求映射源码前台发送给后台的访问请求是如何找到对应的控制器映射并执行后...
    99+
    2023-06-14
  • 浅谈SpringMVC请求映射handler源码解读
    请求映射源码 首先看一张请求完整流转图(这里感谢博客园上这位大神的图,博客地址我忘记了): 前台发送给后台的访问请求是如何找到对应的控制器映射并执行后续的后台操作呢,其核心为Di...
    99+
    2024-04-02
  • SpringMVC怎么映射请求数据
    这篇文章主要介绍了SpringMVC怎么映射请求数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringMVC怎么映射请求数据文章都会有所收获,下面我们一起来看看吧。1.获取参数值1.说明开发中,如何获取...
    99+
    2023-07-02
  • springmvc path请求怎么映射到bean方法
    本篇内容介绍了“springmvc path请求怎么映射到bean方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、加载注册流程&nbs...
    99+
    2023-06-20
  • 使用struts2怎么对静态资源进行映射
    这篇文章给大家介绍使用struts2怎么对静态资源进行映射,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在struts2框架中有一些它所需要的公共的静态内容,比如说js文件和一些css文件。当框架需要这些静态内容的时候...
    99+
    2023-05-31
    struts2 st
  • 使用SpringMVC怎么对Swagger进行整合
    这篇文章将为大家详细讲解有关使用SpringMVC怎么对Swagger进行整合,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。配置引入相关jar包:<dependency>&nbs...
    99+
    2023-05-31
    springmvc swagger
  • 在java中怎么对MyBatis注解进行映射
    本篇文章为大家展示了在java中怎么对MyBatis注解进行映射,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java  中MyBatis注解映射的实例详解1.普通映射 @Sel...
    99+
    2023-05-31
    java mybatis ava
  • MyBatis中怎么使用ResultMap进行结果集映射
    在 MyBatis 中,可以使用 ResultMap 进行结果集映射。ResultMap 是一个 XML 元素,用来描述如何将查询结...
    99+
    2024-04-08
    MyBatis
  • Angular怎么对请求进行拦截封装
    这篇“Angular怎么对请求进行拦截封装”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“A...
    99+
    2024-04-02
  • MyBatis中怎么进行结果映射
    MyBatis中结果映射是通过配置Mapper XML文件中的resultMap来实现的。在resultMap中定义了数据库列和Ja...
    99+
    2024-04-08
    MyBatis
  • 映射器怎么利用MyBatis进行引入
    今天就跟大家聊聊有关映射器怎么利用MyBatis进行引入,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mybatis引入映射器分为三种方式 1. 文件路径引入映射器<mappe...
    99+
    2023-05-31
    mybatis
  • 怎么使用MyBatis的注解方式进行SQL映射
    使用MyBatis的注解方式进行SQL映射可以简化代码,不需要编写XML文件。以下是使用MyBatis的注解方式进行SQL映射的步骤...
    99+
    2024-04-09
    MyBatis
  • httpproxy对网络请求进行代理使用详解
    目录正文命令行启动服务器详细的调用栈捕捉错误正文 使用下面这段简单的代码对网络请求进行代理: const http = require('http'); const httpProx...
    99+
    2024-04-02
  • 在 JS 中怎么使用 Ajax 来进行请求
    本篇内容介绍了“在 JS 中怎么使用 Ajax 来进行请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1...
    99+
    2024-04-02
  • 使用springmvc怎么对模型数据进行处理
    使用springmvc怎么对模型数据进行处理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springmvc提供了四种方式来输出模型数据ModelAndView...
    99+
    2023-06-06
  • 使用SpringMVC怎么实现对数据进行校验
    使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c...
    99+
    2023-05-31
    springmvc
  • 使用 PHP 函数进行对象关系映射的最佳实践?
    使用 php 函数进行 orm 的最佳实践:声明强类型化变量以确保数据完整性。妥善处理一对一、一对多和多对多关联。通过 where()、orderby() 和其他函数自定义查询...
    99+
    2024-05-01
    php orm
  • 使用spring boot如何对异常请求进行处理
    这期内容当中小编将会给大家带来有关使用spring boot如何对异常请求进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。404异常处理:@Controllerpublic class&n...
    99+
    2023-05-31
    springboot 进行处理
  • 如何使用Golang进行API请求
    Golang是一门现代化的编程语言,而且它在后端语言领域中越来越受欢迎。它的优点包括高效的并发处理、内存安全性和垃圾收集机制。在本文中,我们将探讨如何使用Golang进行API请求。首先,我们需要从安装Golang开始。Golang便携式安...
    99+
    2023-05-14
  • 怎么在Go语言中使用JSON进行请求
    这篇文章主要介绍“怎么在Go语言中使用JSON进行请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在Go语言中使用JSON进行请求”文章能帮助大家解决问题。Go语言提供了许多方式发送HTTP请...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作