当前位置: 移动技术网 > IT编程>开发语言>Java > SpringMVC 之原理简介

SpringMVC 之原理简介

2020年07月21日  | 移动技术网IT编程  | 我要评论

简介

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
在这里插入图片描述
浏览器发起一个请求执行步骤:

  • 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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网