什么是MVC
MVC是一种软件架构的设计规范,将软件按照模型
、视图
、控制器
来划分
M:Model,模型层,指工程中的JavaBean[1],作用是处理数据
V:View,视图层,指工程中的Html或Jsp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的Servlet,作用是接收请求和响应浏览器
MVC的工作流程:
用户通过View层发送请求到服务器,在服务器中请求被Controller层接收,Controller层调用响应的Model层处理,处理完毕后将结果返回到Controller层,Controller层再根据请求处理的结果找到响应的View视图,渲染数据后最终响应给浏览器。
什么是Spring MVC
SpringMVC是基于Spring功能实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,用于服务器和浏览器之间的交互,即:使用了MVC架构模式的思想,将Web层进行职责解耦,请求驱动指的是请求-响应模型。
Spring MVC是Spring的一个子项目
SpringMVC是Spring为表述层[2]提供的一整套完整的解决方案,在表述层框架经历了Strust、WebWork、Strust2等诸多产品的迭代,SpringMVC成为了首选方案
SpringMVC的特点
Spring家族原生产品,与IOC容器等基础设施无缝衔接,基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一的处理
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
-
代码清新简洁,大幅度提升开发效率
-
天生与Spring框架集成(如IOC容器、AOP等)
-
提供了强大的约定大于配置的契约式编程支持
-
支持灵活的URL到页面控制器的映射
-
非常容易与其他视图技术集成,如:Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里
-
非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不比实现特定框架的API
-
提供了一套强大的JSP标签库,简化JSP开发
-
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
-
性能卓越,尤其适合现代大型,超大型互联网项目要求。
-
支持灵活的本地化、主题等解析
-
更加简单的异常处理
-
支持Restful风格
SpringMVC的请求流程
核心架构的具体流程步骤:
-
用户发起请求给DispatcherServlet(分发器),分发器收到请求后,就会委托给其他的解析器进行处理,分发器只是作为一个统一访问点,进行全局的流程控制
-
DispatcherServlet首先会分发给HandlerMapping(映射处理器),映射处理器会将请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象(页面处理器)和多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
-
DispatcherServlet接收到HandlerExecutionChain对象后,就会开始分发给HandlerAdapter适配器,适配器会把Handler包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用
-
HandlerAdapter处理器适配器会根据适配的结果调用真正的处理器相应的功能处理方法,例如UserController处理器的add方法,然后返回一个ModelAndView对象(包含模型数据、逻辑视图名)
-
DispatcherServlet收到HandlerAdapter返回的ModelAndView对象后,就会分发给ViewResolver(视图解析器)进行视图解析,视图解析器会把逻辑视图解析为具体的View,通过这种策略模式,可以很容易的更换其他的视图技术
-
DispatcherServlet收到View视图后就会把model(模型数据)分发给View进行视图渲染,此处的Model就是一个Map数据结构,因此很容易支持其他的视图技术
-
最终返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束
上述流程补充其他组件
-
Filter
进入Servlet前可以添加preFilter(前置拦截器),Servlet处理后还可以有postFilter(后置拦截器)
-
LocaleResolver
在视图解析/渲染时,还需要考虑国际化(Local),因此这里可以添加LocaleResolver组件
-
ThemeResolver
SpringMVC中设计了ThemeSource接口和ThemeResolver,包含一些静态资源的集合(样式及图片等),用来控制应用的视觉风格
-
MultipartResolver
常规的请求,上述的情况都能满足,但是文件上传的请求,就无法满足了,需要提供MultipartResolver,会在接收到请求后检查请求是否为文件上传请求,不是则走正常请求,是则走文件上传请求
SpringMVC的DispatcherServlet初始化过程
SpringMVC的DispatcherServlet处理请求的过程
关键词解释
- 实体类JavaBean:专门存储业务数据的对象
业务处理Bean:指Service或DAO层对象,专门用于处理业务逻辑和数据访问
- 表述层:浏览器页面和服务器Servlet层之间的交互称为表述层