SpringMVC架构介绍

    |     2017年3月16日   |   JavaWeb, spring   |     0 条评论   |    1802

Spring Web MVC 也是一个基于请求驱动的 Web 框架,并且用了前端控制器模式:先由统一入口接住请求,再按映射规则分给对应的页面控制器(动作 / 处理器)去处理。

把请求链路和核心组件看清楚,后面配 DispatcherServlet、写 Hello World 才不会懵。

一、请求是怎么走完的

先看整体流程:

11

同一套映射规则,不同 URL 会落到不同的处理器,例如:

http://localhost:8080/carmanager/car_show_list.do                 car
http://localhost:8080/carmanager/user_show_list.do                user
步骤 谁在干活 做了什么
1–2 前端控制器 用户发请求进来;按 URL 等信息选出页面控制器,把请求委托给它(以前控制器里的控制逻辑)
3–5 页面控制器 收集并绑定请求参数到命令对象、做校验,再交给业务对象;处理完返回 ModelAndView(模型数据 + 逻辑视图名)
6–7 前端控制器 + 视图 前端控制器收回控制权,按逻辑视图名选视图,把模型数据送进去渲染
8 前端控制器 再次收回控制权,把响应还给用户,整条链路结束

二、核心架构

核心架构图如下:

22

对应到组件上,一步步是这样走的:

步骤 从 → 到 要点
1 用户 → DispatcherServlet 前端控制器自己不处理业务,只当统一访问点,把活委托给其他解析器,做全局流程控制
2 DispatcherServlet → HandlerMapping 映射成 HandlerExecutionChain:一个 Handler(页面控制器)+ 多个 HandlerInterceptor。策略模式,方便加新映射策略
3 DispatcherServlet → HandlerAdapter 把处理器包装成适配器,从而支持多种处理器类型(适配器模式)
4 HandlerAdapter → 处理器方法 按适配结果调用真正的功能方法,返回 ModelAndView(模型数据、逻辑视图名)
5 逻辑视图名 → ViewResolver 把逻辑视图名解析成具体 View。策略模式,方便换视图技术
6 View → 渲染 按 Model 渲染;Model 本质是 Map,所以也容易接其他视图技术
7 回到 DispatcherServlet 把响应返回给用户,一次请求结束

这里只讲核心流程,拦截器、本地化解析、文件上传解析等后边再细述。

落到开发上,核心就这几步(Hello World 里会逐项验证):

要配什么 为了什么
web.xml 里的 DispatcherServlet 拦截请求,进入 Spring Web MVC
HandlerMapping 把请求映射到处理器
HandlerAdapter 支持多种类型的处理器
ViewResolver 把逻辑视图名解析成具体视图技术
处理器(页面控制器) 真正做功能处理

三、Spring Web MVC 的优势

  • 角色清楚:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver、Controller、Validator、命令对象、表单对象,各管一段。
  • 分工明确,扩展点灵活,大多数时候几乎不用自己扩。
  • 命令对象就是 POJO,不必继承框架 API,可以直接当业务对象用。
  • 和 Spring 其他模块无缝集成,这是不少 Web 框架做不到的。
  • 可适配:HandlerAdapter 能让任意类当处理器。
  • 可定制:HandlerMapping、ViewResolver 等很容易换实现。
  • 数据验证、格式化、绑定机制完整。
  • 用 Spring 的 Mock 对象就能比较简单地做 Web 层单元测试。
  • 支持本地化、主题解析,国际化和换肤更好做。
  • JSP 标签库能把页面写得更省事。

此外还有 RESTful、简单文件上传、约定大于配置、基于注解的零配置等能力,这里不一一展开。

一句话总结:Spring MVC 的心脏是 DispatcherServlet。它自己不做事,只负责把请求交给 Mapping、Adapter、处理器和视图解析器,再把渲染结果送回浏览器。

转载请注明来源:SpringMVC架构介绍
本文链接地址:https://ai.zhousir.top/?p=1955
回复 取消