首页 > 其他分享 >第11章 Spring MVC执行流程

第11章 Spring MVC执行流程

时间:2024-11-27 14:59:01浏览次数:7  
标签:11 对象 Spring mappedHandler mv request MVC 处理器 response

第十一章 SpringMVC 执行流程

11.1 从源码角度看执行流程

以下是核心代码:

public class DispatcherServlet extends FrameworkServlet {
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 根据请求对象request获取
        // 这个对象是在每次发送请求时都创建一个,是请求级别的
        // 该对象中描述了本次请求应该执行的拦截器是哪些,顺序是怎样的,要执行的处理器是哪个
        HandlerExecutionChain mappedHandler = getHandler(processedRequest);

        // 根据处理器获取处理器适配器。(底层使用了适配器模式)
        // HandlerAdapter在web服务器启动的时候就创建好了。(启动时创建多个HandlerAdapter放在List集合中)
        // HandlerAdapter有多种类型:
        // RequestMappingHandlerAdapter:用于适配使用注解 @RequestMapping 标记的控制器方法
        // SimpleControllerHandlerAdapter:用于适配实现了 Controller 接口的控制器
        // 注意:此时还没有进行数据绑定(也就是说,表单提交的数据,此时还没有转换为pojo对象。)
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

        // 执行请求对应的所有拦截器中的 preHandle 方法
        if (!mappedHandler.applyPreHandle(processedRequest, response)) {
            return;
        }

        // 通过处理器适配器调用处理器方法
        // 在调用处理器方法之前会进行数据绑定,将表单提交的数据绑定到处理器方法上。(底层是通过WebDataBinder完成的)
        // 在数据绑定的过程中会使用到消息转换器:HttpMessageConverter
        // 结束后返回ModelAndView对象
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

        //  执行请求对应的所有拦截器中的 postHandle 方法
        mappedHandler.applyPostHandle(processedRequest, response, mv);

        // 处理分发结果(在这个方法中完成了响应)
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    }

    // 根据每一次的请求对象来获取处理器执行链对象
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		if (this.handlerMappings != null) {
            // HandlerMapping在服务器启动的时候就创建好了,放到了List集合中。HandlerMapping也有多种类型
            // RequestMappingHandlerMapping:将 URL 映射到使用注解 @RequestMapping 标记的控制器方法的处理器。
            // SimpleUrlHandlerMapping:将 URL 映射到处理器中指定的 URL 或 URL 模式的处理器。
			for (HandlerMapping mapping : this.handlerMappings) {
                // 重点:这是一次请求的开始,实际上是通过处理器映射器来获取的处理器执行链对象
                // 底层实际上会通过 HandlerMapping 对象获取 HandlerMethod对象,将HandlerMethod 对象传递给 HandlerExecutionChain对象。
                // 注意:HandlerMapping对象和HandlerMethod对象都是在服务器启动阶段创建的。
                // RequestMappingHandlerMapping对象中有多个HandlerMethod对象。
				HandlerExecutionChain handler = mapping.getHandler(request);
				if (handler != null) {
					return handler;
				}
			}
		}
		return null;
	}

    private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
			@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
			@Nullable Exception exception) throws Exception {
        // 渲染
        render(mv, request, response);
        // 渲染完毕后,调用该请求对应的所有拦截器的 afterCompletion方法。
        mappedHandler.triggerAfterCompletion(request, response, null);
    }

    protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 通过视图解析器返回视图对象
        view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        // 真正的渲染视图
        view.render(mv.getModelInternal(), request, response);
    }

    protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
			Locale locale, HttpServletRequest request) throws Exception {
        // 通过视图解析器返回视图对象
        View view = viewResolver.resolveViewName(viewName, locale);
	}
}
public interface ViewResolver {
    View resolveViewName(String viewName, Locale locale) throws Exception;
}
public interface View {
    void render(@Nullable Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
			throws Exception;
}

11.2 从图片角度看执行流程

11.3 WEB服务器启动时都做了什么

先搞明白核心类的继承关系:

DispatcherServlet extends FrameworkServlet extends HttpServletBean extends HttpServlet extends GenericServlet implements Servlet

服务器启动阶段完成了:

  1. 初始化Spring上下文,也就是创建所有的bean,让IoC容器将其管理起来。
  2. 初始化SpringMVC相关的对象:处理器映射器,处理器适配器等。

标签:11,对象,Spring,mappedHandler,mv,request,MVC,处理器,response
From: https://blog.csdn.net/wgy17734894660/article/details/144051904

相关文章

  • spring-boot挖掘
    Spring-boot特征:WhitelabelErrorPage常见目录/actuator查看有哪些Actuator端点是开放的。/actuator/auditeventauditevents端点提供有关应用程序审计事件的信息。/actuator/beansbeans端点提供有关应用程序bean的信息。/actuator/conditionsconditions端点提供有关......
  • [免费]SpringBoot+Vue大学生就业(信息管理)服务平台【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue大学生就业(信息管理)服务平台,分享下哈。项目视频演示【免费】SpringBoot+Vue大学生就业(信息管理)服务平台Java毕业设计_哔哩哔哩_bilibili项目介绍如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发......
  • 985研一学习日记 - 2024.11.26
    一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。日常1、起床6:002、健身1.5h3、LeetCode刷了0题今天没刷题,这几天应该都不咋会刷题了4、复盘22:30不复盘等于白学!!!学习和感想JUC并发编程1.JUC线程池概述和架构通过线程池......
  • Springboot计算机毕业设计琪琦猫咪店网站x228u
    Springboot计算机毕业设计琪琦猫咪店网站x228u本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,猫咪类型,猫咪信息,猫食信息,猫食类型,玩具类型,玩具信息,项目类型,医疗美容,预约信息开题报告内......
  • Springboot计算机毕业设计企业人力资源管理系统r9fe8
    Springboot计算机毕业设计企业人力资源管理系统r9fe8本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,员工,经理,岗位类型,专业类别,招聘信息,简历信息,笔试邀请,岗位试卷,提交试卷,成绩信息,公......
  • Springboot青年创业众筹网站2rz86
    Springboot青年创业众筹网站2rz86本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:众筹分类,发布者,用户,众筹项目,通知公告,投资项目,退款申请开题报告内容一、项目背景与意义在创新创业浪潮的推......
  • Springboot软件测试管理系统05ivu
    Springboot软件测试管理系统05ivu本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着软件开发周期的缩短和发布频率的加快,软件测试在确保软件质量和提升开发效率方面扮演着至关重......
  • 计算机毕业设计 | SpringBoot+vue体育馆使用预约平台(附源码+论文)
    1,绪论1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人们......
  • 计算机毕业设计 | SpringBoot+vue健身房管理系统(附源码+论文)
    1,研究背景互联网概念的产生到如今的蓬勃发展,用了短短的几十年时间就风靡全球,使得全球各个行业都进行了互联网的改造升级,标志着互联网浪潮的来临。在这个新的时代,各行各业都充分考虑互联网是否能与本行业进行结合,是否能解决本行业或者本行业中某些方面的自古以来的痛点。长......
  • Spring Data JPA自动生成表时列顺序混乱的解决办法(最新版)
    最近把SpringBoot的版本升级到了3.3.5,突然发现一个问题:当使用SpringDataJPA自动生成表的时候,所产生的列顺序与Entity类中的变量顺序不一致了。比如,有一个下面这样的Entity:@Data@Entity(name="t_config")@EntityListeners(AuditingEntityListener.class)publicclassConf......