private RequestToViewNameTranslator viewNameTranslator;
/** FlashMapManager used by this servlet. */
//flash 组件管理器
@Nullable
private FlashMapManager flashMapManager;
/** List of ViewResolvers used by this servlet. */
//视图解析器
@Nullable
private List viewResolvers;
=======================================================================
三层架构:表现层、业务层和持久层
MVC 设计模式:
MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller) 的缩写, 是⼀
种⽤于设计创建 Web 应⽤程序表现层的模式。MVC 中每个部分各司其职:
Model(模型):模型包含业务模型和数据模型,数据模型⽤于封装数据,业务模型⽤于处理业
务。
View(视图): 通常指的就是我们的 jsp 或者 html。作⽤⼀般就是展示数据的。通常视图是依据
模型数据创建的。
Controller(控制器): 是应⽤程序中处理⽤户交互的部分。作⽤⼀般就是处理程序逻辑的。
MVC提倡:每⼀层只编写⾃⼰的东⻄,不编写任何其他的代码;分层是为了解耦,解耦是为了维
护⽅便和分⼯协作。
================================================================================
所有请求都会通过DispatcherServlet 来执行。
流程说明:
1、DispatcherServlet 接收到客户端发送的请求。
2、DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。
3、HandleMapping 根据请求URL 找到对应的handler 以及处理器 拦截器,返回给DispatcherServlet
4、DispatcherServlet 根据handler 调用HanderAdapter 处理器适配器。
5、HandlerAdapter 根据handler 执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView
6、HandlerAdapter 返回ModeAndView 给DispatcherServlet
7、DispatcherServlet 调用 ViewResolver 视图解析器来 来解析ModeAndView
8、ViewResolve 解析ModeAndView 并返回真正的view 给DispatcherServlet
9、DispatcherServlet 将得到的视图进行渲染,填充到request域中
10、返回给客户端响应结果。
=============================================================================
请求进来。先找HttpServlet.发现FrameworkServlet 重现了doGet()和doPost() 方法。所以会执行其中的方法。
并且在FrameworkServlet 中实现了HttpServlet 的 doGet()和doPost() 方法。
我们接着看FrameworkServlet 的doGet和doPost 方法都是调用其processRequest 方法。这个方法里面主要的调用DispatcherServlet中doService()方法。
在DispatcherServlet 中的这个方法。会调用doDispatche() 方法执行。
所以整体的请求流程都在doDispatch() 方法中。
主要流程如下:
1、根据url 请求获取到handlerExecutorChina 对象,也就是获取到handler执行链对象,这个对象中包含执行的handler 和一个拦截器的集合。
2、根据这个handlerExecutorChina 执行链对象获取到对应的handlerAdapter handler适配器。
3、根据这个适配器,真正执行handler ,并且返回一个modeAndView 这里的handler 就是我们通常所有的controller 层的业务逻辑。
4、根据获取到的modeAndView ,解析渲染页面并返回结果。
这样整体核心流程就完了。只有这四步。其实和最开始的流程处理图是一样的。总结一下:先根据请求从handlermapping 中获取到handle ,然后通过handle 找到能处理该请求的 handlerAdapter ,通过handlerAdapter 执行真正的handler 也就是我们的业务代码,并返回一个 ModeAndView 。然后通过viewResolver 解析成view 返回给页面
九大组件初始化是在 DispatcherServlet 中的onRefresh() 方法中。
我们通过调用栈可以发现,是在applicationContext类中的refresh() 方法中执行的。这个方法我们很熟悉就是spring 框架的初始化流程执行的主要方法。在refresh() 方法中 完成的Bean 对象实例化流程之后,会执行事件发布。这样就来到了我们springmvc 初始化了。
这九大组件的初始化流程都是差不多的,我们来看下核心组件的HandlerMapping 组件的初始化。
先在ApplicationContext中查找所有HandlerMappings,包括祖先上下文 活着指定的名称还获取,如果获取不到,就会从默认的配置中获取handlermappings
获取默认的handlermappings 主要是从defaultStrategies 中获取。
那defaultStrategies 数据是怎么来的呢?
可以看到这个Properties 是从DispatcherServlet.properties 配置文件来的。
我们查看这个问价可以看到默认的配置信息,九大组件的默认配置信息都有。
下面我们回到主流程,第一步,从handlermappingshandlerMappings 中获取对应的handler
可以看到就是遍历handlerMappings 找到这个url 对应的handler 就完了。
一样的遍历handlerAdpters ,获取到可以处理这个handler 的适配器。
最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
psZi5xdWVsbGFuYW4ueHl6L2ltYWdlLTIwMjAwNjExMTcxNDMyNDQ1LnBuZw?x-oss-process=image/format,png)
最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
[外链图片转存中…(img-kxcsmB92-1719183725958)]
[外链图片转存中…(img-65CXUaz1-1719183725959)]