欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC 之原理简介

程序员文章站 2022-06-17 08:58:08
aaa...

简介

MVC 模式 是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

  • 视图(View) 在 JavaEE 应用程序中,视图(View)可以由 JSP(Java Server Page)、Thymeleaf、FreeMarker、Velocity担任。目前更流行的前后端分离的模式下,View 已经由前端(VueJS,ReactJS)所取代。
  • 控制器(Controller) JavaEE 应用中,Controller 可能是一个 Servlet 。在 Spring MVC 中担任控制器角色的是 DispatcherServlet。
  • 模型(Model) Model 则是由一个实体 Bean 来实现,主要对应数据层。

原理

Spring MVC 最核心的思想是 DispatcherServlet
SpringMVC 之原理简介
浏览器发起一个请求执行步骤:

  • DispatcherServlet 接收到请求
  • 通过 HandlerMapping 找到对应的 handler
  • 然后通过 HandlerAdapter 调用 Controller 进行后续业务逻辑处理(3-4)
  • 处理完业务逻辑后,Controller 将视图名返回给 HandlerAdapter
  • DispatcherServlet 选择合适的 ViewResolver 生成 View 对象
  • 最后 View 渲染并返回响应数据

核心组件

三个核心组件:

  • Handler:用来做具体事情的,对应的是 Controller 里面的方法,所有有 @RequestMapping 标注的方法都可以看做为一个 Handler。
  • HandlerMapping:用来找到 Handler 的,是请求路径与 Handler 的映射关系。
  • HanderAdapter:它是一个适配器,它是用来跟具体的 Handler 配合使用的。可以简单理解为各种电子产品与电源适配器(充电器)的关系。

源码解析

DispatcherServlet 最核心的方法就是 doDispatch ,doDispatch 主要做了四件事:

  • 根据 request 找到 Handler
  • 根据 Handler 找到对应的 HanderAdapter
  • 用 HanderAdapter 处理 Handler
  • 处理经过以上步骤的结果

DispatcherServlet.doDispatch 核心源码如下:

// 根据 request 找到当前请求的处理程序 Handler
mappedHandler = getHandler(processedRequest);

// 根据 Handler 找到当前请求的处理程序适配器 HanderAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

// 用处理器适配器 HanderAdapter 调用处理程序 Handler
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

// 处理经过以上步骤的结果
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

根据 request 并通过 HandlerMapping 找到对应的 handler 代码如下:
HandlerMapping 接口的实现类: SimpleUrlHandlerMapping、RequestMapingHandlerMapping(最常用的)、BeanNameUrlHandlerMapping、WelcomePageHandlerMapping、SimpleUrlHandlerMapping。

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

1、根据 request 找到对应的 HandlerMapping。
2、在具体的 HandlerMapping 中根据请求路径找到处理程序 Handler,Handler是被@RequestMapping注解的一个方法。
3、在 HandlerMapping 中根据请求路径查找是否配置了拦截器,并返回处理程序执行链 HandlerExecutionChain 对象。

根据 Handler 找到当前请求的处理程序适配器 HanderAdapter 代码如下:
HanderAdapter 接口实现类: RequestMappingHandlerAdapter、HttpRequestHamdlerAdapter、SimpleControllerHandlerAdapter。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
	if (this.handlerAdapters != null) {
		for (HandlerAdapter adapter : this.handlerAdapters) {
			if (adapter.supports(handler)) {
				return adapter;
			}
		}
	}
	throw new ServletException("No adapter for handler [" + handler +
			"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}

本文地址:https://blog.csdn.net/const_/article/details/107457263

相关标签: # SpringMVC