摘要:此解析器與差不多,更改下配置文件中的類全路徑即可。總結(jié)本章介紹了以及三個(gè)視圖解析器。這部分內(nèi)容有點(diǎn)兒多,我會(huì)盡快結(jié)束。
概述
通過上幾篇的學(xué)習(xí),我們分析了并試驗(yàn)了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,這三個(gè)類都直接實(shí)現(xiàn)ViewResolver接口。Spring MVC提供了很多的ViewResolver實(shí)現(xiàn),本章我們繼續(xù)分析比較常用的幾個(gè)視圖解析器。
本系列文章是基于Spring5.0.5RELEASE。
AbstractCachingViewResolverAbstractCachingViewResolver實(shí)現(xiàn)ViewResolver接口的抽象類,從類名可知,該類具有緩存功能,即緩存解析過的視圖View對(duì)象,后續(xù)需要視圖解析時(shí),會(huì)先從緩存中查找,如果找到對(duì)應(yīng)的視圖就直接返回,如果未找到就創(chuàng)建一個(gè)視圖對(duì)象放入緩存Map中,并返回創(chuàng)建對(duì)象。從其實(shí)現(xiàn)原理上來看,此類視圖解析器的性能是最佳的。
public abstract class AbstractCachingViewResolver extends WebApplicationObjectSupport implements ViewResolver { /** 緩存視圖map的初始大小 */ public static final int DEFAULT_CACHE_LIMIT = 1024; /** 最大緩存數(shù)量 */ private volatile int cacheLimit = DEFAULT_CACHE_LIMIT; /** 解析過的View緩存容器,key是邏輯視圖名,value是視圖View對(duì)象 */ private final Map
以上是AbstractCachingViewResolver的核心代碼。簡(jiǎn)單說,本類就是實(shí)現(xiàn)了視圖解析的緩存功能。
UrlBasedViewResolver該類是ViewResolver接口的一種實(shí)現(xiàn),并繼承了AbstractCachingViewResolver抽象類,通過指定prefix前綴和suffix后綴,然后拼接邏輯視圖名稱加上前綴和后綴的方式確定視圖URL。
UrlBasedViewResolver支持返回視圖名稱中包括redirect:前綴,以支持在客戶端的跳轉(zhuǎn)。比如當(dāng)訪問一個(gè)url"/demo",該url對(duì)應(yīng)的handler返回的邏輯視圖名為"redirect:/demo1",URLBasedViewResolver在創(chuàng)建視圖時(shí)(createView方法中),判斷邏輯視圖名稱的前綴是"redirect:"開頭,接著裁剪掉"redirect:"前綴后,創(chuàng)建RedirectView對(duì)象,RedirectView對(duì)象將把請(qǐng)求返回的模型數(shù)據(jù)組合成查詢參數(shù)形式拼接到redirect的URL后面,然后調(diào)用 HttpServletResponse 對(duì)象的 sendRedirect 方法進(jìn)行重定向。(稍后我們實(shí)踐驗(yàn)證)
同樣的,URLBasedViewResolver還支持"forword:"前綴,然后封裝成一個(gè) InternalResourceView 對(duì)象,服務(wù)器端利用 RequestDispatcher 的 forword 方式跳轉(zhuǎn)到指定的地址。
說了這么多,我們看下源碼是如何實(shí)現(xiàn)的,如下:
public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered { ... ... /** 創(chuàng)建View實(shí)例 */ @Override protected View createView(String viewName, Locale locale) throws Exception { // If this resolver is not supposed to handle the given view, // return null to pass on to the next resolver in the chain. if (!canHandle(viewName, locale)) { return null; } // 處理redirect請(qǐng)求 if (viewName.startsWith(REDIRECT_URL_PREFIX)) { // 去掉redirect:前綴 String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length()); // 根據(jù)redirectUrl創(chuàng)建RedirectView實(shí)例 RedirectView view = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible()); String[] hosts = getRedirectHosts(); if (hosts != null) { view.setHosts(hosts); } return applyLifecycleMethods(viewName, view); } // 處理forward請(qǐng)求 if (viewName.startsWith(FORWARD_URL_PREFIX)) { 去掉forward:前綴 String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length()); return new InternalResourceView(forwardUrl); } // Else fall back to superclass implementation: calling loadView. // 處理普通view(除redirect/forward) // 調(diào)用父類createView方法,然后通過模板方法再調(diào)回本例的loadView方法 return super.createView(viewName, locale); } @Override protected View loadView(String viewName, Locale locale) throws Exception { AbstractUrlBasedView view = buildView(viewName); View result = applyLifecycleMethods(viewName, view); return (view.checkResource(locale) ? result : null); } ... ... }InternalResourceViewResolver
InternalResourceViewResolver繼承UrlBasedViewResolver,故UrlBaseViewResolver具有的功能,InternalResourceViewResolver同樣具備,在實(shí)際項(xiàng)目中也是使用最廣泛的一種視圖解析器。InternalResourceViewResolver會(huì)把返回的視圖對(duì)象解析為InternalResourceView 對(duì)象,InternalResourceView 會(huì)把 Controller 處理器方法返回的模型屬性都存放到對(duì)應(yīng)的 request 屬性中,然后通過 RequestDispatcher 在服務(wù)器端把請(qǐng)求 forword 重定向到目標(biāo) URL。代碼如下:
public class InternalResourceViewResolver extends UrlBasedViewResolver { ... ... /** 構(gòu)造函數(shù) */ public InternalResourceViewResolver() { // 獲取InternalResourceView Class> viewClass = requiredViewClass(); if (InternalResourceView.class == viewClass && jstlPresent) { viewClass = JstlView.class; } setViewClass(viewClass); } @Override protected Class> requiredViewClass() { return InternalResourceView.class; } ... ... }
其他功能都與UrlBasedViewResolver一樣。
實(shí)戰(zhàn)練習(xí)UrlBaseViewResolver
Spring配置文件代碼如下:
Controller代碼如下:
@Controller public class DemoController { /** 測(cè)試redirect */ @GetMapping("/redirect") public String redirect(ModelMap modelMap){ modelMap.put("name","daliang"); modelMap.put("pass","111"); return "redirect:/demo"; } /** 測(cè)試forward */ @GetMapping("/forward") public String forward(ModelMap modelMap){ modelMap.put("name","daliang"); modelMap.put("pass","111"); return "forward:/demo"; } @GetMapping("/demo") public String demo(){ return "test"; } }
啟動(dòng)應(yīng)用,在瀏覽器地址欄輸入http://localhost:8088/redirect,回車后如下:
可見參數(shù)拼接到了url后面。
InternalResourceViewResolver
此解析器與UrlBasedViewResolver差不多,更改下配置文件中的類全路徑即可。
總結(jié)本章介紹了AbstractCachingViewResolver、UrlBasedViewResolver以及InternalResourceViewResolver三個(gè)視圖解析器。這部分內(nèi)容有點(diǎn)兒多,我會(huì)盡快結(jié)束。希望能幫到大家,謝謝!
最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時(shí)也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69672.html
摘要:概述本節(jié)學(xué)習(xí)下的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)視圖解析器進(jìn)行組裝,內(nèi)部使用存儲(chǔ)配置使用的視圖解析器??偨Y(jié)本章介紹了類,根據(jù)測(cè)試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲(chǔ)配置使用的視圖解析器。 本系列文章是基于Spri...
摘要:概述上篇學(xué)習(xí)了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見下圖本系列文章是基于。該視圖解析器是根據(jù)處理器返回的邏輯視圖名稱,在應(yīng)用上下文中查找該名稱的視圖對(duì)象視圖對(duì)象就是的對(duì)象。 概述 上篇學(xué)習(xí)了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見下圖):showImg(https://segmentfault...
摘要:概述本章開始進(jìn)入另一重要的組件,即視圖組件,處理視圖組件使用兩個(gè)主要的接口是和。接口的作用是用于處理視圖進(jìn)行渲染。延用之前的介紹流程,本章分兩部分進(jìn)行闡述啟動(dòng)初始化和請(qǐng)求處理。 概述 本章開始進(jìn)入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個(gè)主要的接口是ViewResolver和View。根據(jù)名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...
摘要:概述本章繼續(xù)學(xué)習(xí)另一個(gè)實(shí)現(xiàn)類解析器,該類的主要作用是根據(jù)同一請(qǐng)求的某些策略,選擇對(duì)應(yīng)的進(jìn)行渲染??梢园牙斫鉃檫m配器,對(duì)不同類型進(jìn)行適配。值得注意的是處理的為同一個(gè)。本系列文章是基于。實(shí)戰(zhàn)需求目標(biāo)實(shí)現(xiàn)后綴名或參數(shù)控制,顯示不同的視圖。 概述 本章繼續(xù)學(xué)習(xí)ViewResolver另一個(gè)實(shí)現(xiàn)類ContentNegotiatingViewResolver解析器,該類的主要作用是根據(jù)同一請(qǐng)求的某...
摘要:與一樣,該類繼承抽象類,并且通過外部的屬性文件定義邏輯視圖名稱與真正的視圖對(duì)象的關(guān)系,屬性文件默認(rèn)是下的,可以通過或?qū)傩詠碇付?,該屬性指的是文件的基名稱,也就是說以屬性值開頭的屬性文件。 概述 本章再學(xué)習(xí)另外兩個(gè)ViewResolver,分別是XmlViewResolver和ResourceBundleViewResolver,從功能上說,這兩個(gè)視圖解析器都是從外部資源文件中查找視圖V...
閱讀 2735·2021-11-11 16:54
閱讀 2369·2021-10-09 09:44
閱讀 2593·2019-08-30 15:54
閱讀 1961·2019-08-30 11:24
閱讀 1209·2019-08-29 17:03
閱讀 2135·2019-08-29 16:22
閱讀 2114·2019-08-29 13:11
閱讀 1080·2019-08-29 12:14