Spring MVC常见知识点及源码解析
MVC 是什么 / 有什么优点?
MVC是一种设计模式,遵循 模型(Model),视图(View) 和 控制器(Controller)的架构设计。 MVC的优点很明显: 应用层次分明,职责分明,使得系统的耦合性降低,并有利于系统的维护。
什么是 Spring MVC?
Spring MVC是一个基于Spring框架的轻量级的MVC Web应用框架。
Spring MVC的优缺点?
优点:
- 基于Spring,拥有Spring的所有优点
- Spring MVC中的组件:角色分明,耦合性低,非常有利于应用的维护。
- 支持多种视图技术:不仅支持JSP,还支持各种模板视图。
- 功能特性强大:轻松的文件上传,数据校验与格式转换,异常处理,RESTful风格的API等等。
- 支持前后端分离。
缺点:
- Spring MVC是基于Spring的,这既是它的优点也是它的缺点,它必须与Spring一起使用, 个人认为这应该是它最大的一个限制了。
什么是DispatcherServlet?
DispatcherServlet是Spring MVC的核心, 可以说SpringMVC就是这个DispatcherServlet。 它是一个Servlet,负责拦截所有的请求,并以调用各种组件来对请求进行分发并处理。
Spring MVC有哪些组件?(见:DispatcherServlet源码)
MultipartResolver: 核心组件之一,处理文件上传请求。MultipartResolver负责判断普通请求是否为文件上传请求, 并将普通请求(HttpServletRequest)解析为文件上传请求(MultipartHttpServletRequest)。
LocalResolver: 区域解析器。它主要被用于国际化的资源方面的解析。
ThemeResolver: 主题资源解析器。SpringMVC允许用户提供不同主题,主题就是一系列资源的集合使用这些主题可以提高用户体验。
ViewResolver: 核心组件之一,视图解析器。在Handler执行完请求后,ViewResolver将ModelAndView解析成物理视图, 并对物理视图进行model渲染。
HandlerMapping: 核心组件之一,请求处理器。根据用户的请求来匹配对应的Handler。
HandlerAdapter: 核心组件之一,Handler适配器。使用Handler处理请求,并返回处理后的视图(ModelAndView)。
HandlerExceptionResolver: 核心组件之一,异常处理解析器。在Handler执行请求的过程中可能出现异常, HandlerExceptionResolver就负责处理Handler执行请求过程中的异常。
RequestToViewNameTranslator: 核心组件之一,请求到视图的转换器。根据Request设置最终的视图名,当Handler执行完请求后,它会将Request解析成视图名。
FlashMapManager: 核心组件之一,在请求进行重定向时,FlashMapManager用于保存请求中的参数。
简述SpringMVC原理/执行流程
用户发出的请求被DispatcherServlet拦截。
DispatcherServlet使用HandlerMapping根据请求匹配到相应的Handler。Handler实际上是一个(HandlerMethod)。
DispatcherServlet根据Handler适配合适的HandlerAdapter。
HandlerAdapter使用Handler执行请求,并返回ModelAndView。
使用RequestToViewNameTranslator,HandlerExceptionResolver和ViewResolver等解析器, 解析并渲染ModelAndView,并处理相关异常信息。
渲染后的结果反馈给用户。
Spring MVC 拦截器是什么 / 有什么作用 / 与 Filter有什么区别?
HandlerInterceptor: Spring MVC拦截器是Spring MVC提供的对用户请求的目标资源做出拦截扩展的处理器。 它允许在目标方法执行前后以及View渲染后做出处理。
Servlet Filter: Filter是Servlet提供的过滤器,它会在目标方法执行前后做出拦截处理。
要说Servlet Filter和HandlerInterceptor有啥区别,
个人认为除了它们提供的拦截时机不同,目的都是相同的,没啥区别。
@Component @Controller @Service @Repository 区别?
@Component 声明一个类为IOC容器的组件,会被IOC容器管理。 而@Controller,@Service和@Repository则拥有更细分的语义。
@Controller通常用于Web应用,被@Controller注解的类,应该作为一个处理请求的控制器。
@Service则是声明一个类为Service类,处理业务逻辑。
被@Repository注解的类,应该被用于处理与数据库交互和持久化相关的功能。