探索SpringMVC-組件之ViewResolver-創(chuàng)新互聯(lián)

前言

ViewResolver也就是視圖解析器,他將是我們《探索SpringMVC》系列要介紹的最后一個(gè)常用的組件。其他組件:MultipartResolver、LocaleResolver、ThemeResolver、RequestToViewNameTranslator、FlashMapManager,相對(duì)簡(jiǎn)單,大家可以自行了解。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出南溪免費(fèi)做網(wǎng)站回饋大家。ViewResolver

我們知道視圖技術(shù)有很多種,例如:JSP、FreeMarker、Thymeleaf等。如果直接操作這些技術(shù),那簡(jiǎn)直不要太糟糕。為了統(tǒng)一操作,SpringMVC抽象出來兩個(gè)接口:ViewResolver和View。任何視圖技術(shù)都需要實(shí)現(xiàn)這兩個(gè)接口。

Spring源碼中的定義

  • ViewResolver,即視圖解析器,可以通過將viewName解析為View。
  • View,即視圖,是Web交互的MVC的View。他的實(shí)現(xiàn)者負(fù)責(zé)渲染內(nèi)容、暴露Model。(所謂暴露model,其實(shí)就是把model數(shù)據(jù)在頁(yè)面中展示)

從上述定義,視圖解析器需要?jiǎng)?chuàng)建View。而這意味著兩個(gè)重要使命實(shí)例化和初始化。實(shí)例化,當(dāng)然是創(chuàng)建對(duì)應(yīng)的View實(shí)現(xiàn)對(duì)象。而初始化則負(fù)責(zé)將View與對(duì)應(yīng)的實(shí)現(xiàn)技術(shù)進(jìn)行綁定/銜接。

與視圖技術(shù)的銜接

前面我們知道View才是真正渲染頁(yè)面內(nèi)容的,這意味著View才是視圖技術(shù)的真正操作者。因此必須通過某種手段獲得響應(yīng)的配置或者重要的組件。而Spring提供的是WebApplicationObjectSupport。不管是ViewResolver,還是View都是基于該抽象類來實(shí)現(xiàn)獲取ApplicationContext。

Spring的設(shè)計(jì)

為了便于各個(gè)視圖技術(shù)廠商對(duì)接,Spring實(shí)際上構(gòu)建了一套完整的體系(一系列抽象實(shí)現(xiàn)類),按需實(shí)現(xiàn)。
FreeMarkerViewResolver
這里重點(diǎn)提一下

  • UrlBaseViewResolver#applyLifecycleMethods
    這個(gè)方法是初始化View的關(guān)鍵方法,他通過ApplicationContext獲取到AutowireCapableBeanFactory,并且直接調(diào)用其initializeBean方法進(jìn)行初始化。而該方法就是我們bean生命周期中的關(guān)鍵方法,包括:Aware接口、BeanPostProcessor、InitializingBean都是由他負(fù)責(zé)。
FreeMarker的實(shí)現(xiàn)

前面我們說了,WebApplicationObjectSupport是重要的初始化接口。同樣我們也說,是按需實(shí)現(xiàn)。

FreeMarkerViewResolver
從上面的類圖看,F(xiàn)reeMarkerViewResolver似乎并沒有使用到這個(gè)接口,但是其父類UrlBaseViewResolver使用到了。UrlBaseViewResolver通過WebApplicationObjectSupport才能獲取到ApplicationContext。才有了后面對(duì)FreeMarkerView的初始化。

FreeMarkerView
通過該WebApplicationObjectSupport實(shí)現(xiàn)了與FreeMarker的銜接。

重點(diǎn)方法:

  • FreeMarkerView#initServletContext
    這個(gè)方法實(shí)際上是Aware接口擴(kuò)展過來的,因此會(huì)被前面說的UrlBaseViewResolver#applyLifecycleMethods調(diào)用到。這里會(huì)通過ApplicationContext獲取到FreeMarkerConfig。該類是SpringMVC與Freemarker銜接的類,他會(huì)持有FreeMarker的Configuration對(duì)象。通過Configuration對(duì)象,就能獲得FreeMarker的Template類。
  • FreeMarkerView#buildTemplateModel
    該方法將Model轉(zhuǎn)換為FreeMarker要求的數(shù)據(jù)格式。
  • FreeMarkerView#processTemplate
    該方法則是實(shí)際調(diào)用FreeMarker的Template,通過HttpServletResponse將視圖渲染并響應(yīng)了。

想看源碼的同學(xué),這里送一張簡(jiǎn)化版調(diào)用流程圖
在這里插入圖片描述
注意,該圖不涉及分支流程,例如:緩存邏輯、重定向邏輯。

總結(jié)
  1. Spring為了統(tǒng)一視圖技術(shù)的操作,抽象了ViewResolver和View。并提供了許多抽象接口,以便不同的視圖技術(shù)進(jìn)行實(shí)現(xiàn)。
  2. UrlBaseViewResolver通過WebApplicationObjectSupport獲取到ApplicationContext對(duì)AbstractUrlBasedView進(jìn)行初始化。AbstractUrlBasedView則通過InitializingBean實(shí)現(xiàn)對(duì)View的url進(jìn)行校驗(yàn)。
  3. FreeMarkerView通過WebApplicationObjectSupport從容器中獲取FreeMarkerConfig,實(shí)現(xiàn)與FreeMarker的銜接。
后記

ViewResolver相對(duì)簡(jiǎn)單。但我們重點(diǎn)要學(xué)會(huì)設(shè)計(jì)思想。SpringMVC設(shè)計(jì)了一層中間層,做了一層接口轉(zhuǎn)換,換取統(tǒng)一接口、統(tǒng)一操作的便利,以及更多的擴(kuò)展可能。
下一次,我們終于回到了DispatcherServlet了。忘記的同學(xué),可以回去看看。

上一篇:
探索SpringMVC-組件之HandlerExceptionResolver
第一篇:
探索SpringMVC-web上下文
下一篇:
探索SpringMVC-DispatcherServlet

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享題目:探索SpringMVC-組件之ViewResolver-創(chuàng)新互聯(lián)
文章位置:http://muchs.cn/article14/diioge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航、建站公司、網(wǎng)站排名、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)