框架简介
SpringMVC 框架通过实现 Model-View-Controller(MVC)模式来很好地将数据、业务与展现进行分离
SpringMVC 框架和 Struts、Struts2 非常类似
SpringMVC 的设计是围绕**DispatcherServlet(前端控制器)**展开的
DispatcherServlet:
- 负责将请求派发到特定的 handler(处理程序)
- 给处理程序分派请求,执行视图解析,处理语言环境和主题解析,支持上传文件
- 通过映射来决定哪一个处理程序应当处理传入的请求
- 通过可配的 handler mappings、view resolution、locale 以及 theme resolution 来处理请求并且转到对应的视图。
框架优点
SpringMVC,基于 MVC 架构模式的思想,将 web 层进行职责解耦
请求驱动类型是使用请求-响应模型,框架的目的就是帮助我们简化开发
清晰的角色划分,分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要:
- 前端控制器(DispatcherServlet)
- 请求到处理器映射(HandlerMapping)
- 处理器适配器(HandlerAdapter)
- 视图解析器(ViewResolver)
- 处理器或页面控制器(Controller)
- 验证器( Validator)
- 命令对象(Command 请求参数绑定到的对象就叫命令对象)
- 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)
优点列举
- SpringMVC 拥有强大的灵活性、非入侵性和可配置性
- SpringMVC 提供了一个前端控制器 DispatcherServlet,开发者无须额外开发控制器对象
- SpringMVC 分工明确,包含控制器、验证器、命令对象、模型对象、处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成
- SpringMVC 可以自动绑定用户输入,并正确地转换数据类型。例如:SpringMVC 能自动解析字符串,并将其设置为模型的 int 或 float 类型的属性
- SpringMVC 使用一个名称/值的 Map 对象实现更加灵活的模型数据传输
- SpringMVC 内置了常见的校验器,可以校验用户输入,如果校验不通过,则重定向回输入表单。输入校验是可选的,并且支持编程方式及声明方式
- SpringMVC 支持国际化,支持根据用户区域显示多国语言,并且国际化的配置非常简单
- SpringMVC 支持多种视图技术,最常见的有 JSP 技术以及其他技术,包括 Velocity 和 FreeMarker
- SpringMVC 提供了一个简单而强大的 JSP 标签库,支持数据绑定功能,使得编写 JSP 页面更加容易
- SpringMVC 属于 Spring 框架的子项目,比起其他轻量级 WEB 框架最大的优势:与 Spring 框架无缝集成
核心类
- DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 MVC 模式中的 Controller
虽然实际应用中开发依旧需要开发业务自有的 Controller 层,但 DispatcherServlet 相当于一个总的入口
DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,降低组件之间的耦合性
- HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器
SpringMVC 框架提供了不同的映射器实现不同的映射方式
例如:配置文件方式,实现接口方式,注解方式等
- Handler:处理器
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理
Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler(也就是我们实际开发的 Controller)
- HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
- View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图
View Resolver 根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象
对 View 进行渲染将处理结果通过页面展示给用户
- View:视图
SpringMVC 框架提供了很多的 View 视图类型的支持
包括:jstlView、freemarkerView、pdfView 等
我们最常用的视图就是 jsp
通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要根据业务需求开发具体的页面
数据流程
- 用户发送请求—>DispatcherServlet
前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制
- DispatcherServlet—>HandlerMapping
HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略
- DispatcherServlet—>HandlerAdapter
HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器
- HandlerAdapter—> 处理器功能处理方法的调用
HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理
- 返回一个 ModelAndView 对象(Model 模型数据)
包含模型数据、逻辑视图名
- ModelAndView 的逻辑视图名—> ViewResolver
ViewResolver 将把逻辑视图名解析为具体的 View,通过这种策略模式,很容易更换其他视图技术
- View—> 渲染
View 会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个 Map 数据结构,因此很容易支持其他视图技术
- 返回给 DispatcherServlet
由 DispatcherServlet 返回响应给用户,到此一个流程结束