1)Tomcat 会根据 web.xml 的配置来初始化我们自己的 DispatchServlet,在初始化时会调用 init() 方法。在 init() 方法中,我们通过 web.xml 中配置的路径,读取了 application.properties 的路径,然后根据 application.properties 中配置的扫描 bean 路径,初始化了一个 IOC 容器。
2)DispatchServlet 会初始化九大基本组件
protected void initStrategies(MYApplicationContext context) {
// 多文件上传的组件
initMultipartResolver(context);
// 初始化本地语言环境
initLocaleResolver(context);
// 初始化模板处理器
initThemeResolver(context);
// handlerMapping,必须实现
initHandlerMappings(context);
// 初始化参数适配器,必须实现
initHandlerAdapters(context);
// 初始化异常拦截器
initHandlerExceptionResolvers(context);
// 初始化视图预处理器
initRequestToViewNameTranslator(context);
// 初始化视图转换器,必须实现
initViewResolvers(context);
// 参数缓存器
initFlashMapManager(context);
}
但最关键的是,初始化 HandlerMapping,HandlerAdpter,ViewResolver
- HandlerMapping:封装了 RequestURL、Method、Controller对象。对 HandlerMapping 的初始化就是,将现在 IOC 容器中所有的 Controller 实例找出来,然后获取标有 @RequestMapping 的方法及相应请求路径,构造 HandlerMapping 对象,加入
List<MYHandlerMapping> handlerMappings - HandlerAdpter:核心是
handle(HttpServletRequest req, HttpServletResponse resp, Object handler)方法,负责根据请求及其相应 HandlerMapping 来处理请求。对 HandlerAdpter 的初始化就是,给每个 HandlerMapping 都创建一个专属的 HandlerAdpter,然后放入Map<MYHandlerMapping, MYHandlerAdpter> handereAdpters - ViewResolver:关键作用是,根据 ModelAndView 返回的 View 名,将其解析成 JSON、HTML、OutPutStream 等。但是在这里,我们只实现了解析成 HTML 页面的 ViewResolver,即将相应 HTML 页面读入内存,然后构造 View 对象。初始化 ViewResolver 就是,读入 application.properties 中配置的模板文件路径,然后创建 ViewResolver 对象,并加入
List<MYViewResolver> viewResolvers
注:ModelAndView ----> ViewResolver –
resolveViewName()–> View —rend()-> HTML。其中 View 中的 rend() 方法相当于起了模板引擎的作用,即将 HTML 页面中的 {{x}} 的变量替换成 Model 中的具体数据
3)当有请求来到时,会走到 DispatchServlet#doGet() 或者 doPost(),然后会走到 doDispatch() 方法去进行请求的分发与处理。
- 从 Request 中拿到URL,去匹配一个 HandlerMapping(PS:如果当前没有处理当前请求的方法,返回404页面)
- 从 HandlerAdpters 获取当前 HandlerMapping 对应的 HandlerAdpter,然后调用 handle() 去处理请求,最终返回 ModelAndView(注:也可能是 null)
- 通过 ViewResolver 解析出具体的页面,并构造 View 对象。然后再调用 View#render() 去逐行读入 HTML 页面,解析其中的 ¥{} 模板,即将其替换成 Model 中的数据。最后通过 Response 写出页面。
本文标题:【Spring】MVC:核心流程小结
本文链接:https://blog.quwenai.cn/post/10138.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。






还没有评论,来说两句吧...