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 方法進行響應結果。
相關文章
相關標籤/搜索