Spring mvc ViewResolver视图解析器实现机制

概要

咱们在controller里面常常这样return一个ModelAndView。java

return new ModelAndView("userList", "users", userList);

DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF/jsp/userList.jspweb

经常使用的ViewResolver:InternalResourceViewResolverspring

ViewResolver配置

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp" />
    <property name="suffix" value=".jsp" />
</bean>

ViewResolver 初始化

继续上一篇Spring mvc DispatchServlet 实现机制 初始化DispatchServlet的时候,执行了初始化ViewResolver操做。缓存

  1. 判断 detectAllViewResolvers 是否为true,若是为true,则加载当前系统中全部实现了ViewResolver接口的bean。
  2. 若是为false,则加载bean名称为“viewResolver”的ViewResolver实现类。
  3. 若是尚未找到ViewResolver,则加载SpvingMVC 配置文件中,默认配置的ViewResolver。

detectAllViewResolvers 设置

detectAllHandlerMappings 默认为true,若是只想加载本身指定的HandlerMapping,请使用下面的方式指定mvc

若是这样指定,则Spring MVC 只会加载这个ViewResolver,而不会加载配置的其它的ViewResolver。app

解析视图跳转页面

当处理完成Controller的逻辑后,须要给请求用户一个响应反馈,通常都是返回一个响应的一个页面。
DispatcherServlet执行完Controller的逻辑后会调用render() 方法进行处理视图的跳转工做。jsp

resolveViewName() 方法

查找合适的ViewResolver来获取View。ui

而后调用AbstractCachingViewResolver.java的resolveViewName() 方法spa

  1. 首先判断缓存中是否存在View,若是不存在则调用 createView() 方法建立View
  2. 若是有则从缓存中获取View

createView() 方法

loadView() 方法

UrlBasedViewResolver.java.net

buildView() 方法

在这里咱们能够看到,填充View对象中的Url属性时,自动加上配置中ViewResolver的前缀和后缀,拼装成一个完整的Url串。

renderMergedOutputModel() 处理页面跳转

  1. exposeModelAsRequestAttributes() 把ModelAndView中存放的对象,添加到request中
  2. 根据响应的资源获取Servlet中的RequestDispatcher对象
  3. 调用RequestDispatcher的 include 或forward 方法进行响应结果。
相关文章
相关标签/搜索