简单介绍下你对Spring MVC的理解?
Spring MVC是一个基于Java的MVC控制层框架。通过将web层进行职责上的解耦,简化开发。
Spring MVC的主要组件?
DispatcherServlet:前端控制器,就是一个大的servlet,所有用户发过来的请求都会首先经过它。HandlerMapping:处理器映射器,根据请求的URL来返回handler。只有一个方法getHandler(),返回一个handler(HandlerExecutionChain
(里面包含URL对应的Controller对象、方法及参数,还有所有的拦截器))。
HandlerAdapter:处理器适配器,用来执行HandlerMapping返回的handler。
DispatcherServlet会调用所有注册的HandlerAdapter的supports方法对handler进行检测,判断当前HandlerAdapter是否能执行这个handler,最终找到合适的HandlerAdapter。handler方法来执行该handdler,并返回ModelAndView给DispatcherServlet。
ViewResolver:视图解析器,接收HandlerAdapter返回的ModelAndView,根据ModelAndView中的view name来构造和返回具体的视图对象(View)。
请描述Spring MVC(DispatcherServlet )的工作流程?
用户发送请求到前端控制器(DispatcherServlet )。前端控制器调用处理器映射器(通常为RequestMappingHandlerMapping),根据请求的URL查找具体的handler(一般是自定义的控制器方法),同时获取所有的拦截器,统一打包到一个HandlerExecutionChain中并返回给前端控制器。
前端控制器遍历所有注册的处理器适配器,调用supports()方法判断找出能处理当前handler的处理器适配器。调用处理器适配器执行这个handler,执行完返回一个ModelAndView(包括视图名称和模板参数)对象给前端控制器。前端控制器调用ViewResolver来解析ModelAndView,根据视图名称(viewName)返回一个视图对象(View)。前端控制器调用视图对象的render()将渲染后的视图返回给浏览器。
render:第一步是将model对象(map)设置为request attributes,第二步是通过请求转发器转发到模板页面,在这过程中将模板参数填充至页面中。
Spring MVC中拦截器执行时机?
不管是spring自带的还是自己定义的拦截器(实现HandlerInterceptor即可),都是在容器启动时被添加到容器中。
preHandle:在处理器映射器找到合适的handler(自定义的控制器方法)之后,在处理器适配器执行handler之前。
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
postHandle:在处理器适配器执行handler之后,在前端控制器调用视图对象的render()渲染视图之前。
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
afterCompletion:在前端控制器渲染视图之后执行,可以用来清理资源。
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}