在Spring MVC中,當Controller將請求處理結果放入到ModelAndView中之後,DispatcherServlet會根據 ModelAndView選擇合適的視圖進行渲染。html
ViewResolver接口定義了 resolverViewName方法,根據viewName建立合適類型的View實現。配置ViewResolver呢?在Spring中,ViewResolver做爲Spring Bean存在,能夠在Spring配置文件中進行配置,例以下面的代碼,配置了jsp相關的viewResolver。java
ViewResolver接口是在DispatcherServlet中進行調用的,當DispatcherServlet調用完 Controller後,會獲得一個ModelAndView對象,而後DispatcherServlet會調用render方法進行視圖渲染。線程
在這裏須要關於ViewResolver的選擇是經過循環進行的,只選擇第一個符合要求的,所以在定義ViewResolver時,須要注意定義其優先級。
下面就來着重關注一下ViewResolver的類結構。
關於View對象的建立,不一樣的ViewResolver的解決方法是各部相同的。如BeanNameViewResolver是根據viewName選 擇相應名稱的bean(這裏須要注意bean的scope,是否須要線程安全),而UrlBasedViewResolver則是使用反射機制,根據 viewClass信息建立view對象,所以這個view不受IoC容器的管理。ContentNegotiationViewResolver中能夠 嵌套ViewResolver,根據不一樣的的請求類型選擇合適的ViewResolver。
DispatcherServlet獲得View對象後,即調用View的render方法,執行真正的渲染工做。
最後,看一下View的類結構圖。
有上述的View類結構圖可知,Spring已經爲咱們提供了一系列可用的View。同時,若是當前提供的View不能知足咱們的要求時,能夠經過實現 View接口進行擴展。如須要根據model中的數據使用JFreeChart繪圖,或者將這些數據做爲文件下載時,咱們能夠擴展出 JFreeChartView和FileDownloadView等,這樣就能更靈活的將同一份數據用不一樣的方式展示出來。