微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这一次搞懂SpringMVC原理说明

这篇文章主要介绍了这一次搞懂SpringMVC原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

前言

前面几篇文章,学习了Spring IOC、Bean实例化过程、AOP、事务的源码和设计思想,了解了Spring的整体运行流程,但如果是web开发,那么必不可少的还有Spring MVC,本篇主要分析在请求调用过程中SpringMVC的实现原理,通过本篇要搞懂它是怎么解决请求、参数、返回值映射等问题的。

正文

请求入口

我们都知道前端调用后端接口时,都会通过Servlet进行转发,而Servlet的声明周期包含下面四个阶段:

实例化(new)

初始化(init)

执行(service调用doGet/doPost)

销毁(destroy)

前两个阶段在Spring启动阶段就做好了(init根据配置可能是第一次请求时才会调用),销毁是服务关闭的时候进行,本文主要分析的就是请求执行阶段。我们知道SpringMVC的核心就是dispatcherServlet,该类是对Servlet的扩展,所以直接从该类的service方法开始,但在此类中没有service方法,那肯定是在其父类中,我们先来看看其继承体系:

逐个往上找,在FrameworkServlet方法中就有一个service方法

protected 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 { super.service(request, response); } } protected void service(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException { String method = req.getmethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince

但其主要还是调用父类HttpServlet中的方法,而该类又会根据不同的请求方式会调到子类中,最后的核心方法就是dispatcherServlet中的dodispatch方法

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; } //获取跟HandlerMethod匹配的HandlerAdapter对象 // 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; } } //前置过滤器,如果为false则直接返回 if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } //调用到Controller具体方法,核心方法调用,重点看看 // 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上一篇:新手初学Java网络编程下一篇:Java中从键盘输入多个整数的方法 热门搜索

springmvc的工作原理 

说明 

三明治原理 

SpringMVC 

的说明 

相关文章

这一次搞懂SpringMVC原理说明

2021-09-10阅读(5561)评论(0)推荐()

这篇文章主要介绍了这一次搞懂SpringMVC原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

这一次搞懂Spring的XML解析原理说明

2021-10-19阅读(4880)评论(0)推荐()

这篇文章主要介绍了这一次搞懂Spring的XML解析原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

这一次搞懂Spring自定义标签以及注解解析原理说明

2021-11-15阅读(8469)评论(0)推荐()

这篇文章主要介绍了这一次搞懂Spring自定义标签以及注解解析原理说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

这一次搞懂Spring的Bean实例化原理操作

2021-11-05阅读(5659)评论(0)推荐()

这篇文章主要介绍了这一次搞懂Spring的Bean实例化原理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

这一次搞懂Spring代理创建及AOP链式调用过程操作

2021-09-10阅读(9334)评论(0)推荐()

这篇文章主要介绍了这一次搞懂Spring代理创建及AOP链式调用过程操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一篇文章让你搞懂JavaScript 原型和原型链

2021-11-12阅读(5369)评论(0)推荐()

这篇文章主要介绍了一篇文章让你搞懂JavaScript 原型和原型链,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下

这一次搞懂Spring事务是如何传播的

2021-10-18阅读(4126)评论(0)推荐()

这篇文章主要介绍了这一次搞懂Spring事务是如何传播的,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

取消

有人回复邮件通知

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐