SpringMVC
什么是MVC
MVC是一种设计模式,在这种模式下软件被分为三层,及Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
DAO层是做什么的
DAO层是Data Access Object的缩写,即数据访问对象,在项目中它通常作为独立的一层,专门用于访问数据库。
介绍一下Spring MVC的执行流程
- 整个过程开始于客户端发出一个HTTP请求,Web应用服务器接受到这个请求。如果匹配
DispatcherServlet的请求路径,则Web容器将该请求转交给DispatcherServlet处理。 DispatcherServlet接收到这个请求后,将根据请求的信息(包括URL、HTTP方法、请求报文头、请求参数、Cookie等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看作路由控制器,将Handler看作目标主机。- 当
DispatcherServlet根据HandlerMapping得到对应请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是Spring MVC框架的接口,顾名思义,HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用。 - 处理器完成业务逻辑的处理后,将返回一个
ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和模型数据信息。 ModelAndView中包含的是“逻辑视图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图对象的解析工作。- 当得到真实的视图对象View后,
DispatcherServlet就用这个View对象对ModelAndView中的模型数据进行视图渲染。 - 最终客户端得到的响应消息可能是有一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式。
简略版本:
- 用户发送请求至前端控制器
DispatcherServlet DispatcherServlet收到请求调用HandllerMapping处理器映射器- 处理器映射器找到具体的处理器(
Handler)(可以根据xml配置,注解进行查找),生成处理器对象以及处理器拦截器(如果有拦截器则生成)一并返回给DispatcherServlet DispatcherServlet调用HandlerAdapter处理器适配器HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)Controller执行完成后返回ModelAndViewHandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServletDispatcherServlet将ModelAndView传给ViewReslover视图解析器ViewReslover解析后返回具体ViewDispatcherServlet根据View进行渲染视图。(最终客户端得到的响应消息可能是有一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式。)

说一说你知道的Spring MVC注解
@RequestMapping
该注解的作用就是用来处理请求地址映射的,也就是说将其中的处理器方法映射到url路径上
属性:
- mothod:请求类型,比如get和post
- value:请求地址
@RequestParam
是将请求参数绑定到控制器的方法参数上,是Spring MVC中的接收普通参数的注解
@RequestBody
用于读取Request请求的body部分,并且Content-Type为application/json格式的数据,接收到数据之后会自动将数据绑定到Java对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的body中的json字符串转换成java对象。
@PostMapping("/sign-up")
public ResponseEntity signUp(@RequestBody UserRegisterRequest userRegisterRequest) {
testService.save(userRegisterRequest);
return ResponseEntity.ok(userRegisterRequest);
}
@PathVariable
该注解适用于绑定url中的占位符。是Spring MVC支持rest风格的一个重要标志。
@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(
@PathVariable("klassId") Long klassId,
@RequestParam(value = "type", required = false) String type ) {
}
介绍一下Sprig MVC的拦截器
可以拓展一下SSO单点登录来讲项目
拦截器会对处理器进行拦截,这样通过拦截器就可以增强处理器的功能。Spring MVC中,所有的拦截器都需要实现HandlerInterceptor接口,该接口中包含如下三个方法:preHandle(),postHandle(),afterCompletion()。
这些方法的执行流程如下图:

通过上图可以看出,Spring MVC拦截器的执行流程如下:
- 执行
preHandle方法,它会返回一个布尔值。如果为false,则结束所有流程,如果为true,则执行下一步。 - 执行处理器逻辑,它包含控制器的功能
- 执行
postHandler方法 - 执行视图解析和视图渲染
- 执行
afterCompletion方法
Spring MVC拦截器的开发步骤如下:
- 开发拦截器:实现
HandlerInterceptor接口,从三个方法中选择合适的方法,实现拦截时需要执行的具体业务逻辑,一般使用preHandle方法。 - 注册拦截器:定义配置类,并让它实现
WebMvcConfigurer接口,在接口的addInterceptors方法中,注册拦截器,并定义该拦截器匹配那些请求路径。
