• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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全權渲染

    版權聲明:本文為blueboz原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/blueboz/article/details/81840593

    智能推薦

    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,當然我們也可以通過實現接口來自...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    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_...

    精品国产乱码久久久久久蜜桃不卡