摘要:概述通過上幾章的介紹知道了的作用,即就是把返回的邏輯視圖名稱解析為視圖對象。進而通過對象的視圖渲染把最終的結果展現給用戶。運用模板技術把數據和視圖分開,同時提供支持很多的模板技術,比如等等。
概述
通過上幾章的介紹知道了ViewResolver的作用,即ViewResolver就是把handler返回的邏輯視圖名稱解析為視圖View對象。進而通過View對象的視圖渲染把最終的結果展現給用戶。
View視圖渲染的原理,簡單說就是把模型數據填充到視圖模板,最終交由Servlet的response進行渲染展示。
Spring MVC運用模板技術把數據和視圖分開,同時提供支持很多的模板技術,比如:InternalResourceView(JstlView)、FreeMarkerView、Thymeleaf等等。
本系列文章是基于Spring5.0.5RELEASE。
源碼分析以InternalResourceView為例進行分析,該類解析jsp視圖模板,主要涉及類和接口如下:
View
View接口是Spring MVC提供的視圖渲染接口,定義了render方法對給定的模型數據進行視圖渲染,源碼如下:
public interface View { ... ... /** 把模型數據進行渲染 */ void render(@Nullable Mapmodel, HttpServletRequest request, HttpServletResponse response) throws Exception; ... ... }
AbstractView
AbstractView是實現View接口的抽象類,實現了render方法,源碼如下:
public abstract class AbstractView extends WebApplicationObjectSupport implements View, BeanNameAware { ... ... @Override public void render(@Nullable Mapmodel, HttpServletRequest request, HttpServletResponse response) throws Exception { if (logger.isTraceEnabled()) { logger.trace("Rendering view with name "" + this.beanName + "" with model " + model + " and static attributes " + this.staticAttributes); } // 創建整合后需要返回給瀏覽器的Model Map mergedModel = createMergedOutputModel(model, request, response); // 設置response 報文頭 prepareResponse(request, response); // 渲染數據,通過模板方法由子類實現,如InternalResourceView renderMergedOutputModel(mergedModel, getRequestToExpose(request), response); } ... ... }
InternalResourceView
該類繼承自AbstractView,并實現renderMergedOutputModel方法,源碼如下:
@Override protected void renderMergedOutputModel( Mapmodel, HttpServletRequest request, HttpServletResponse response) throws Exception { // 將model中的數據設置到request exposeModelAsRequestAttributes(model, request); // 本類中的此函數是空函數,留給子類比如JstlView去實現自定義邏輯 exposeHelpers(request); // 跳轉目的頁面路徑 String dispatcherPath = prepareForRendering(request, response); // 獲取跳轉控制器RequestDispatcher RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath); if (rd == null) { throw new ServletException("Could not get RequestDispatcher for [" + getUrl() + "]: Check that the corresponding file exists within your web application archive!"); } // 直接返回用戶資源 if (useInclude(request, response)) { response.setContentType(getContentType()); if (logger.isDebugEnabled()) { logger.debug("Including resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """); } rd.include(request, response); } // 攜帶request和response跳轉到另一個控制器方法 else { // Note: The forwarded resource is supposed to determine the content type itself. if (logger.isDebugEnabled()) { logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """); } rd.forward(request, response); } }
至此,View渲染視圖的大致流程結束,也就是Spring MVC基本完成了整個流程,剩下的渲染工作交由Servlet去處理。
總結本章就View視圖渲染進行了簡單的分析,Spring 提供了眾多的View實現,有興趣的童鞋可以繼續了解。
最后創建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69732.html
摘要:概述本節學習下的功能,簡單來說,該類的作用就是把多個視圖解析器進行組裝,內部使用存儲配置使用的視圖解析器。總結本章介紹了類,根據測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節學習下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進行組裝,內部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...
摘要:概述上篇學習了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見下圖本系列文章是基于。該視圖解析器是根據處理器返回的邏輯視圖名稱,在應用上下文中查找該名稱的視圖對象視圖對象就是的對象。 概述 上篇學習了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見下圖):showImg(https://segmentfault...
摘要:概述本章開始進入另一重要的組件,即視圖組件,處理視圖組件使用兩個主要的接口是和。接口的作用是用于處理視圖進行渲染。延用之前的介紹流程,本章分兩部分進行闡述啟動初始化和請求處理。 概述 本章開始進入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個主要的接口是ViewResolver和View。根據名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...
摘要:此解析器與差不多,更改下配置文件中的類全路徑即可。總結本章介紹了以及三個視圖解析器。這部分內容有點兒多,我會盡快結束。 概述 通過上幾篇的學習,我們分析了并試驗了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,這三個類都直接實現ViewResolver接口。Spring MVC提供了很多...
摘要:概述本章繼續學習另一個實現類解析器,該類的主要作用是根據同一請求的某些策略,選擇對應的進行渲染。可以把理解為適配器,對不同類型進行適配。值得注意的是處理的為同一個。本系列文章是基于。實戰需求目標實現后綴名或參數控制,顯示不同的視圖。 概述 本章繼續學習ViewResolver另一個實現類ContentNegotiatingViewResolver解析器,該類的主要作用是根據同一請求的某...
閱讀 2472·2021-09-29 09:34
閱讀 3308·2021-09-23 11:21
閱讀 2501·2021-09-06 15:00
閱讀 1128·2019-08-30 15:44
閱讀 2029·2019-08-29 17:23
閱讀 3001·2019-08-29 16:44
閱讀 3060·2019-08-29 13:13
閱讀 1939·2019-08-28 18:12