一、MVC思想
将一个应用分成三个基本部分:Model(模型)、View(视图)、Controller(控制器)
特点
- 多个视图对应一个模型。减少代码的复制,及代码的维护量。
- 模型返回数据与现实逻辑分离。
- 应用被分隔为三层,降低各层之间的耦合。
- 方便了分组开发。
二、MVC执行流程
url请求直接来到Controller中(Controller控制器)--->Controller从Model中取数据(Model模型)--->Model可能会去访问数据库--->Controller根据业务逻辑,选择合适的View呈现给客户端(View视图)--->View返回给客户端
三、Spring MVC执行流程图
- 用户发送请求至 前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。
- 处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。
- 执行处理器(Controller,也叫后端控制器)
- 处理器Controller执行完后返回ModelAnView。
- 处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。
- 视图解析器ViewResolver解析后返回具体的视图View。
- 前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)
- 前端控制器DispatcherServlet响应用户。
注意:由于现在前后端分离的开发模式比较流行,前后端交互基本上采用JSON的数据格式,所以视图解析这里就不太用到。
四、Spring MVC常用注解
- @Controller
用于标记一个类,使用它标记的类就是一个Spring MVC Controller对象,即一个控制器类。
- @RequestMapping
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
value:用于将指定请求的而实际地址映射到方法上
name:给映射地址指定一个别名
method:映射指定请求的方法类型包括get、put、post
consumes:指定处理请求的提交内容类型(Content-Type)如application/json
produces:指定返回内容类型,返回的内容类型必须是request请求头中包含的类型
params:指定request中必须包含某些参数值时,才让该方法处理
headers:指定request中必须包含某些指定的header值,才能让该方法处理
path:在servlet环境中只有:uri路径映射
- @PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上
- @CookieValue
用来获取Cookie中的值
- @RequestParam
用于将请求参数区数据映射到功能处理方法的参数上
- @SessionAttributes
将值放到session作用域中,写在class上。除了可以通过属性名指定需要放到会话中的属性外(value 属性值),还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
- @ModelAttribute
该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。
- @ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
五、与sturts2比较
1、性能:spring会稍微比struts2快。spring mvc是基于方法的设计,而sturts2是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
2、struts2其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了
struts2封装前端参数有三种方法
第一种在action中写属性并提供get set方法
第二种在使用对象的方式 在action中创建对象,并提供对象的get set方法
第三种使用模型驱动的方式(实现ModelDriver接口)并重写 getModel方法才能获取表单中的封装对象。并且声明对象的时候一定要实例化
六、Spring MVC初始化过程
1.web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化
2.调用DispatcherServlet父类的父类HttpServletBean的init()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServlet的initServletBean()方法
3.initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法
4.onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。