Spring教程:ViewResolver 視圖解析器以及視圖View詳解,自定義視圖解析器
標簽: SpringMvc Spring ViewResolver 視圖解析器 MVC
本教程源碼地址
https://gitee.com/blueboz/spring-learn.git
Spring框架中。視圖解析器是MVC 的V(視圖)環節。這個環節在Spring 中的最主要體現在與如何將模型數據與視圖進行綁定渲染?
切入點追蹤Controller
首先我們從最簡單的控制器開始,如下是我們的控制器代碼
這個控制器返回了一個userinfo的viewname,以及一些模型對象。
DispatcherServlet
此時,透過了多層的反射返回,來到DispatcherServlet的如下代碼
Spring 版本務必保持一致,本人的版本是官網的5.x版本。
render送入的是ModelAndVIew對象,以及request,response,這里我們想一個問題。
我們需要渲染一個節目,viewname視圖名稱有了,模型數據有了。那么剩下的還有什么?沒錯,剩下的就是怎么去根據這個viewname,找到這個視圖。并且按照這個視圖的規則,把模型渲染進這個視圖。并且將視圖轉成Stream(流),flush (刷入)到response(響應對象)。
用下面一張圖來看看
接著我們進入DispatcherServlet中的render方法,查看其具體的邏輯
如圖所示
可以看到,首先會看看,我們在返回的模型中是否已經有了viewname,如果有viewname,用這個viewname去解析得到View對象。
如果沒有,再看看,返回的模型是否已經有了view對象。都沒有則報錯。
到這里,我們的代碼還沒有設計到視圖解析器。
下面需要我們考慮一點,視圖解析器,什么是視圖解析器?
ViewResolver視圖解析器接口,是一個頂級接口。其只有一個方法。resolveViewName方法,這個方法的作用是根據一個邏輯的視圖名稱,獲取到這個名稱應該使用的View對象。View對象是有什么用,view有一個render方法,
@Nullable
View resolveViewName(String viewName, Locale locale) throws Exception;
到這里,也許你會有疑問,這個視圖解析器與View 到底有什么用?為什么需要這么復雜的搞一個視圖解析器跟一個視圖。
ViewResolver
這里我說下,視圖解析器。就是根據提供的視圖名稱,內部去實例化一個View子類對象。并返回給dispatcherServlet.
View
而View對象的render方法,則是最終的調動渲染視圖方法。會把視圖內容刷到響應流中。從而響應到客戶端。
我們直接在DispatcherServlet中,根據userinfo找到/WEB-INF/page/userinfo.jsp
并且把modelAndView中的model渲染到jsp界面去,直接返回不就行了嗎?
道理是對的,這里的實現方法也是這樣的。但是作為框架,一定得考慮到其擴展性,Spring在設計的時候,考慮到擴展性。例如我們需要渲染freeMarker視圖,tile視圖?pdf視圖,以及xls…等等一些列的視圖應該怎么辦?
哈哈。所以在這里就會出現問題,假如不這樣子做,我們是很難去進行擴展我們自己的視圖。
那么好,我們接著跟蹤。源代碼,上面是到了render方法了,下面我們看,render方法到底做了什么,render方法進入resolveViewName方法。
在這個方法,首先會判斷viewResolvers列表是不是空的,如果不是空的。會遍歷所有的viewResolver,并且調動viewResolver中的resolverViewName方法,一旦有一個能解析成功,則馬上返回。
這里一般情況下我們都是注入InternalResourceViewResolver
類似下面這個,分別是java代碼與xml代碼配置兩種方式。
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/page/");
resolver.setSuffix(".jsp");
<bean id="jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="order" value="44" />
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
那么我們來看看這個InternalResourceViewResolver到底做了什么,有什么作用。
InternalResourceViewResolver
在使用InternalResourceViewResolver需要設置prefix與suffix,其實是在設置urlBaseViewResolver,InternalResourceViewResolver只是把viewclass設置成JstlView而已。
UrlBasedViewResolver
總之,ViewResolver是根據視圖名稱獲取這個視圖的渲染View。并且有這個View全權渲染
智能推薦
Spring實戰(第四版)讀書筆記16——視圖解析器
SpringMVC定義了一個名為ViewResolver的接口: View接口: Spring自帶了13個視圖解析器,能夠將邏輯視圖名轉換為物理實現: ...
SpringMVC 視圖解析 - ViewResolver
基本概念 所有的 MVC 框架都有一套它自己的解析視圖的機制,SpringMVC 也不例外。 它使用 ViewResolver 進行視圖解析,讓用戶在瀏覽器中渲染模型。 ViewResolver 接口在視圖名稱和真正的視圖之間提供映射,它是一種開箱即用的技術,能夠解析 JSP、Velocity 模板和 XSLT 等多種視圖: 視圖解析器在 Spri...
SpringMVC_自定義視圖解析器
層次目錄: 1、 MyViewResolverController.java 2、自定義視圖解析器,實現解析器接口還有優先級接口 MyMeiNvViewResolver: 3、view接口的實現類:MyView 4、配置文件:由于自定義視圖解析器啟動起來得先加載到ioc容器中,設置oredr級別,讓其最先運行 5、index.jsp頁面...
SpringMVC使用自定義視圖以及視圖解析器
SpringMVC使用自定義視圖以及視圖解析器 文章目錄 SpringMVC使用自定義視圖以及視圖解析器 ? 我們知道在獲得了ModelAndView(簡稱mv)對象之后,前端控制器會根據這個對象通過ViewResolver解析出一個view對象,最后通過view對象渲染整個頁面,傳遞給用戶。 其中系統默認的是InternalResourceViewResolver,當然我們也可以通過實現接口來自...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...