一、问题提出

我们可以方便的利用Spring MVC进行业务开发,请求的大部分工作都被框架和容器封装,使得我们只需要做很少量的工作。但是整个http请求流程是怎么样的?Spring MVC框架在其中起到什么作用?它是怎么和Web容器进行交互的?Controller中的一个方法怎么被暴露出来提供http请求服务的?本着这些想法,我们对整个http请求过程进行讨索。全文以 spring-mvc-demo 为例

二、整体处理流程概述

整个过程包括三部分:应用启动、请求路由与处理、请求返回。

应用启动:web容器初始化(context建立等)、应用初始化(初始化handlerMap)。

请求路由与处理:请求路由(根据url找到Context、根据context找到dispatcherServlet、根据url找到handler、根据url找到handler的方法)、method反射调用获取ModelAndView。

请求返回:逻辑视图到物理视图的转换、物理视图的渲染、视图返回。

具体流程如下:

系统启动:

1、web容器自己去将contextPath、docBase设置到一个context里面,这里面的一个context就是对应一个web应用。

2、web容器会根据docBase的值去获取web.xml,并解析它来获取servlet信息,并设置web容器启动完毕的监听器。

3、web容器启动后,会触发spring mvc容器的启动,spring mvc容器启动时,会解析controller,并将@RequestMapping、@GetMapping、@PostMapping的值设置到handlerMap中,方便后续请求路由。

请求发送:

1、外部发送请求( http://localhost:8080/spring-mvc-demo/user/register )时,请求会被转发到web容器(这里以tomcat为例),实际上就是tomcat与客户端建立了socket链接。

2、根据url,tomcat会对应的host,host找到context,context找到对应的servlet(这里为dispatcherServlet)。

3、dispatcherServlet会根据url,在handlerMap中去查到到对应的handler,然后将handler转化为handlerAdapter。

4、AnnotationMethodHandlerAdapter会调用ServletHandlerMethodInvoker.invokeHandlerMethod方法,ServletHandlerMethodInvoker会通过反射的方式去调用controller的对应方法。

请求返回:

1、根据controller的返回,获取对应的ModelAndView。

2、DispatcherServlet的resolveViewName方法会将逻辑视图转换为物理视图。

3、org.springframework.web.servlet.view.AbstractView#render方法会进行视图渲染工作,具体的渲染视图为org.springframework.web.servlet.view.JstlView

4、jsp文件会被编译成一个servlet,然后,jspServlet会调用service方法,最后会将视图写到客户端。

三、系统启动

1、context设置

我们通过shell脚本调用gradle的tomcatRun方法来启动应用,然后在本地debug的方式来获取运行参数。在org.apache.catalina.startup.Tomcat#addWebapp(org.apache.catalina.Host, java.lang.String, java.lang.String)的方法上打断点,获取信息如下:

这里的listener为ContextConfig,它会监听容器相关事件,其中一项工作就是监听tomcat启动后去解析web.xml。也可以看出contextPath、docBase的值。

被调用的addWebapp方法就是初始化context,并将context添加到host中。具体如下:

public Context addWebapp(Host host, String contextPath, String docBase, LifecycleListener config) { silence(host, contextPath); Context ctx = createContext(host, contextPath); ctx.setPath(contextPath); ctx.setDocBase(docBase); ctx.addLifecycleListener(new DefaultWebXmlListener()); ctx.setConfigFile(getWebappConfigFile(docBase, contextPath)); ctx.addLifecycleListener(config); if (config instanceof ContextConfig) { // prevent it from looking ( if it finds one - it'll have dup error ) ((ContextConfig) config).setDefaultWebXml(noDefaultWebXmlPath()); } if (host == null) { getHost().addChild(ctx); } else { host.addChild(ctx); } return ctx; }

2、context中servlet设置

通过在ContextConfig的lifecycleEvent方法是监听系统事件的入口:

public void lifecycleEvent(LifecycleEvent event) { // Identify the context we are associated with try { context = (Context) event.getLifecycle(); } catch (ClassCastException e) { log.error(sm.getString("contextConfig.cce

springmvc流程_基于Spring MVC框架的Http流程分析相关推荐

  1. 搭建基于spring MVC框架 + RESTful架构风格技术总结

    2019独角兽企业重金招聘Python工程师标准>>> 实战篇: 在SpringMVC框架中搭建RESTful架构风格来完成客户端与服务器端的低耦合度.可扩展性.高并发与大数据流量的 ...

  2. springboot 打卡功能_基于spring boot框架的公司考勤系统的研究与设计

    基于 spring boot 框架的公司考勤系统的研究与设计 李宏坤 ; 郑光勇 ; 谢舞 ; 彭承辉 [期刊名称] <电脑知识与技术> [年 ( 卷 ), 期] 2019(015)018 ...

  3. Spring MVC框架-持久层用hibernate自动化(1)

    ##Spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC ...

  4. local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架

    @[TOC] 自定义实现Spring Mvc框架 前言 在使用Spring Mvc时候我们需要配置一个中央处理器DispatcherServlet用于分发请求,根据url查找处理器,然后再根据处理器 ...

  5. 从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架

    如果创建一个 Spring 项目 Spring MVC 框架在 Java 的 Web 项目中应该是无人不知的吧,你不会搭建一个 Spring 框架?作为身为一个刚刚学习Java的我都会,如果你不会的话 ...

  6. 【毕业设计_课程设计】基于Spring MVC的博客系统设计与实现

    文章目录 0 项目说明 1 关于项目 2 效果预览 2.1 前台效果图 2.2 后台效果图 3 使用注意 4 使用步骤 5 项目源码 0 项目说明 基于Spring MVC的博客系统设计与实现 提示: ...

  7. 【Spring-MVC基础】由浅入深-Spring MVC

    本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...

  8. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  9. Mybatis,Spring,MVC框架

    文章目录 @[toc] unit12-mybatis框架 MyBatis简介(了解) 什么是MyBatis 为什么要使用MyBatis MyBatis快速入门 准备数据,创建库和表 创建工程,导入所需 ...

最新文章

  1. Glassfish3 asadmin 常用命令
  2. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
  3. 防盗链测试01 - Jwplayer+Tengine2.3.1 mp4模块打造流媒体测试服务器
  4. 电工助手App开发 第三周
  5. pthread_mutex_lock的作用
  6. Linux编程(2)_软件的安装和卸载
  7. java中的与或运算
  8. Failed to start OpenLDAP Server Daemon
  9. matlab仿真建模,matlab系统建模仿真.ppt
  10. Pix4dmapper航测教程——全流程内业处理
  11. 【Python刷题篇】——Python入门 01 输入输出
  12. OSEK Os的任务调度
  13. 电脑底部任务栏没反应怎么办?
  14. CorAl – Are the point clouds Correctly Aligned?
  15. 小猿圈分享免费自学编程的10个网站
  16. 电气比例阀外接压力传感器和PID控制器实现微正压0.1%的超高精度控制
  17. 数学模型(第五版) PDF 习题参考解答 第5版
  18. C语言-vs的常用快捷键
  19. 题解专栏(七):kotori和气球
  20. 个人站长如何接入支付打赏

热门文章

  1. linux导出Excel The maximum column width for an individual cell is 255 characters
  2. Do you want to put on or loose weight?
  3. 剪枝实践:图像检索如何加速和省显存 ?
  4. 视觉推理新杀器!英特尔新一代VPU性能翻10倍,反超英伟达
  5. linux apache配置_linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  6. 好消息 | 顶级 AI 华人学者拟加入清华大学自动化系!
  7. 资源下载| 深度学习Pytoch1.0如何玩?这一门含900页ppt和代码实例的深度学习课程带你飞
  8. java http 包_java http请求
  9. easyui前端框架模板_.NET Core基于Ace Admin的响应式框架
  10. 用TensorFlow的Linear/DNNRegrressor预测数据