SpringMVC 之原理简介
简介
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
上一篇: easymock的使用