SpringMVC的工作流程
1. SpringMVC的工作流程
- 用户发送请求至前端控制器(DispatcherServlet)
- 前端控制器(DispatcherServlet)收到请求,调用处理器映射器(HandlerMapping)
- 处理器映射器找到具体的处理器(可以根据XML配置,注解,实现接口进行查找),生成处理器对象以及处理器拦截器(如果有则生成)一并返回给前端控制器
- 前端控制器调用处理器适配器(HandlerAdapter)
- 处理器适配器根据适配调用具体的处理器(conntroller)
- 处理器执行完成返回ModelAndView
- 处理器适配器把处理器返回的ModelAndView返回给前端控制器
- 前端控制器把ModelAndView发送给视图解析器(ViewReslover)
- 视图解析器解析ModelAndView,返回具体的View
- 前端控制器根据View进行视图渲染
- 前端控制器响应用户
2. 具体流程步骤
- 用户发送请求到前端控制器,前端控制器不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制
- 前端控制器会发送请求给处理器映射器,处理器映射器就会把请求映射为HandlerExecutionChain对象,包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略
- 前端控制器发送请求给处理器适配器,适配器把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器
- 处理器会根据适配的结果去调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名)
- ModelAndView的逻辑视图名发送到视图解析器,把逻辑视图名解析为具体的view,通过这种策略模式,很容易更换其他视图技术
- View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术
- 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束
3. 组件说明
- 前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:整个流程的核心,接受请求,相应结果,降低各个组件之间的耦合度 - 处理器映射器
作用:根据用户请求的URl找到处理器,SpringMVC提供了不同映射器实现不同的映射方式,有注解,实现接口,配置文件方式 - 处理器适配器
作用:按照特定规则去执行处理器
会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用) - 处理器Handler(需要工程师开发)
编写处理器时,需要按照特定的规则去编写,这样才能通过适配器去执行处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。 - 视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) - 视图View(需要工程师开发jsp…)
视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。
4.SpringMVC是什么
springMVC是一个MVC的开源框架,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。
5.什么是MVC设计模式
MVC即Model-View-Controller,将应用按照Model(模型),View(视图),Controller(控制)这样的方式分离
- 模型(model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性
- 视图(view):代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理
- 控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理
6. SpringMVC的特点
-
清楚的角色划分:控制器(controller),验证器(validator),命令对象(command object),表单对象(formobject),模型对象(model object),Servlet分发器(DispatcherServlet),处理器映射(handler mapping),视图解析器(view resolver)等,每一个角色由一个专门的对象来实现
-
强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用
-
可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承
-
.可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类
-
可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象
-
可定制的handlermapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些webMVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活
-
灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成
-
可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等
-
简单而强大的JSP标签库(SpringTag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能
-
JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易
-
Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session
7. SpringMVC的优点
- 让我们能非常简单的设计出干净的Web层和薄薄的Web层
- 进行更简洁的Web层的开发
- 天生与Spring框架集成(如IoC容器、AOP等)
- 提供强大的约定大于配置的契约式编程支持
- 非常灵活的数据验证、格式化和数据绑定机制
- 支持Restful风格
8. SpringMVC的常用注解和作用
- @Controller:出现在类上,表示这个类是控制器
- @RequestMapping:给控制器绑定一个URL
- @ResponseBody:把返回去的Java对象转换成Json对象,返回给前端
- @RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射
- @RequestBody:把前端传过来的Json转化成Java对象
- @PathVarible:用于获取uri中的参数,比如user/1中1的值
9. SpringMVC和Struts2的对比
- 框架机制:SpringMVC的入口是servlet,struts2的入口是filter
filter在容器启动后初始化,在服务停止后销毁,Servlet在调用时初始化,在服务器停止时销毁,先于Filter - 拦截机制:Struts2:Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter把request数据注入到属性
- 一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,说明属性参数是让多个方法共享的
- Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
- SpringMVC::SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架
- 在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改
- Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大
- 性能方面:SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2
- 配置方面:spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)SpringMVC可以认为已经100%零配置
- 设计思想:Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展
- 集成方面:SpringMVC集成了Ajax