springmvc流程_基于Spring MVC框架的Http流程分析
一、问题提出
我们可以方便的利用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流程分析相关推荐
- 搭建基于spring MVC框架 + RESTful架构风格技术总结
2019独角兽企业重金招聘Python工程师标准>>> 实战篇: 在SpringMVC框架中搭建RESTful架构风格来完成客户端与服务器端的低耦合度.可扩展性.高并发与大数据流量的 ...
- springboot 打卡功能_基于spring boot框架的公司考勤系统的研究与设计
基于 spring boot 框架的公司考勤系统的研究与设计 李宏坤 ; 郑光勇 ; 谢舞 ; 彭承辉 [期刊名称] <电脑知识与技术> [年 ( 卷 ), 期] 2019(015)018 ...
- Spring MVC框架-持久层用hibernate自动化(1)
##Spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC ...
- local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架
@[TOC] 自定义实现Spring Mvc框架 前言 在使用Spring Mvc时候我们需要配置一个中央处理器DispatcherServlet用于分发请求,根据url查找处理器,然后再根据处理器 ...
- 从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架
如果创建一个 Spring 项目 Spring MVC 框架在 Java 的 Web 项目中应该是无人不知的吧,你不会搭建一个 Spring 框架?作为身为一个刚刚学习Java的我都会,如果你不会的话 ...
- 【毕业设计_课程设计】基于Spring MVC的博客系统设计与实现
文章目录 0 项目说明 1 关于项目 2 效果预览 2.1 前台效果图 2.2 后台效果图 3 使用注意 4 使用步骤 5 项目源码 0 项目说明 基于Spring MVC的博客系统设计与实现 提示: ...
- 【Spring-MVC基础】由浅入深-Spring MVC
本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...
- 【Java学习路线之JavaWeb】Spring MVC框架入门教程
文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...
- Mybatis,Spring,MVC框架
文章目录 @[toc] unit12-mybatis框架 MyBatis简介(了解) 什么是MyBatis 为什么要使用MyBatis MyBatis快速入门 准备数据,创建库和表 创建工程,导入所需 ...
最新文章
- Glassfish3 asadmin 常用命令
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
- 防盗链测试01 - Jwplayer+Tengine2.3.1 mp4模块打造流媒体测试服务器
- 电工助手App开发 第三周
- pthread_mutex_lock的作用
- Linux编程(2)_软件的安装和卸载
- java中的与或运算
- Failed to start OpenLDAP Server Daemon
- matlab仿真建模,matlab系统建模仿真.ppt
- Pix4dmapper航测教程——全流程内业处理
- 【Python刷题篇】——Python入门 01 输入输出
- OSEK Os的任务调度
- 电脑底部任务栏没反应怎么办?
- CorAl – Are the point clouds Correctly Aligned?
- 小猿圈分享免费自学编程的10个网站
- 电气比例阀外接压力传感器和PID控制器实现微正压0.1%的超高精度控制
- 数学模型(第五版) PDF 习题参考解答 第5版
- C语言-vs的常用快捷键
- 题解专栏(七):kotori和气球
- 个人站长如何接入支付打赏
热门文章
- linux导出Excel The maximum column width for an individual cell is 255 characters
- Do you want to put on or loose weight?
- 剪枝实践:图像检索如何加速和省显存 ?
- 视觉推理新杀器!英特尔新一代VPU性能翻10倍,反超英伟达
- linux apache配置_linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
- 好消息 | 顶级 AI 华人学者拟加入清华大学自动化系!
- 资源下载| 深度学习Pytoch1.0如何玩?这一门含900页ppt和代码实例的深度学习课程带你飞
- java http 包_java http请求
- easyui前端框架模板_.NET Core基于Ace Admin的响应式框架
- 用TensorFlow的Linear/DNNRegrressor预测数据