Spring MVC

MVC 模式

MVC (Model-View-Controller) 常用于应用程序分层开发

举个简单例子,可能前端只需要一个对象的部分属性,或者多个对象的部分属性,直接可以封装一个视图对象,其中包含所需的属性,可能选取一个对象的部分属性,也可能将多个对象部分属性组合

从这个例子可以看出视图和模型实现了解耦,可以根据业务要求封装前端所需要的视图对象,实现视图和模型之间的交互由 Controller 负责,下面给出关系图:

1

注意:上面例子基于前后端分离的设计思想,可能跟一般情况有区别,但本质上是相同的~

Spring MVC 执行流程

Spring MVC 的核心思想也是基于上面介绍的 MVC 模式,但相对而言处理更加复杂一些,先给出一张执行流程图:

2

注意:为了画图方便,图中的 MV 表示 ModelAndView,V 表示 View

先解释一下上图中各个组件的作用:

下面给出一次完成请求的处理流程:

总结:查找 Handler -> 适配器执行 Handler -> 解析 ModelAndView -> 渲染 View -> 返回

拦截器

SpringMVC 实现拦截器是基于 AOP,底层是 动态代理,简单来说当用户请求/user/login时,并没有直接调用 Controller 对象的方法,而是通过代理对象去调用目标方法

增加一层代理的好处在于可以增强某个方法或一类方法,在执行目标方法前/后进行统一处理,实现了业务功能和非业务功能的解耦,其实这就是 AOP 机制的核心思想,而拦截器就是运用 AOP 实现滴

下面给出 SpringMVC 实现拦截器的一个小 Demo:

统一异常处理

AOP 中说异常处理也可以统一处理,即在方法抛出异常后统一处理,这样可以最大程度的降低业务逻辑和非业务逻辑的耦合程度

可以使用@ControllerAdvice@ExceptionHandler这两个注解实现统一异常处理,也就是在指定方法抛出异常后统一处理,无需在每个方法中单独处理

在这种异常处理方式下,SpringMVC 会给所有或指定Controller织入异常处理逻辑,当Controller中的方法抛出异常后,由被@ExceptionHandler注解修饰的方法进行处理