1. 程式人生 > >springMVC檢視解析原理學習

springMVC檢視解析原理學習

SpringMVC如何解析檢視概述

不論控制器返回一個String,ModelAndView,View都會轉換為ModelAndView物件,由檢視解析器解析檢視,然後,進行頁面的跳轉。

檢視解析原始碼分析:重要的兩個介面ViewResolver和View。

檢視和檢視解析器

  • 請求處理方法執行完成後,最終返回一個 ModelAndView 物件。對於那些返回 String,View 或 ModeMap 等型別的處理方法,Spring MVC 也會在內部將它們裝配成一個 ModelAndView 物件,它包含了邏輯名和模型物件的檢視
  • Spring MVC 藉助檢視解析器
    ViewResolver)得到最終的檢視物件(View),最終的檢視可以是 JSP ,也可能是 Excel、JFreeChart等各種表現形式的檢視
  • 對於最終究竟採取何種檢視物件對模型資料進行渲染,處理器並不關心,處理器工作重點聚焦在生產模型資料的工作上,從而實現 MVC 的充分解耦

檢視

  • 檢視的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶,主要就是完成轉發或者是重定向的操作.
  • 為了實現檢視模型和具體實現技術的解耦,Spring 在 org.springframework.web.servlet 包中定義了一個高度抽象的 View 介面:
  • 檢視物件由檢視解析器負責例項化
    。由於檢視是無狀態的,所以他們不會有執行緒安全的問題

常用的檢視實現類

 

JstlView

  • 若專案中使用了JSTL,則SpringMVC 會自動把檢視由InternalResourceView轉為 JstlView  (斷點除錯,將JSTLjar包增加到專案中,檢視解析器會自動修改為JstlView
  • 若希望直接響應通過 SpringMVC 渲染的頁面,可以使用 mvc:view-controller 標籤實現

檢視解析器

  • SpringMVC 為邏輯檢視名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一種或多種解析策略
    並指定他們之間的先後順序。每一種對映策略對應一個具體的檢視解析器實現類。
  • 檢視解析器的作用比較單一:將邏輯檢視解析為一個具體的檢視物件。
  • 所有的檢視解析器都必須實現 ViewResolver 介面:

常用的檢視解析器實現類

  • 程式設計師可以選擇一種檢視解析器或混用多種檢視解析器
  • 每個檢視解析器都實現了 Ordered 介面並開放出一個 order 屬性,可以通過 order 屬性指定解析器的優先順序order  越小優先順序越高
  • SpringMVC 會按檢視解析器順序的優先順序對邏輯檢視名進行解析,直到解析成功並返回檢視物件,否則將丟擲 ServletException 異常
  • InternalResourceViewResolver:
  1. JSP 是最常見的檢視技術,可以使用 InternalResourceViewResolve作為檢視解析器:

mvc:view-controller標籤

    1)若希望直接響應通過 SpringMVC 渲染的頁面,可以使用 mvc:view-controller 標籤實現

<!-- 直接配置響應的頁面:無需經過控制器來執行結果 -->

<mvc:view-controller path="/success" view-name="success"/>

    2)請求的路徑:

http://localhost:8080/SpringMVC_02_View/success

    3)配置<mvc:view-controller>會導致其他請求路徑失效

            解決辦法:

<!-- 在實際開發過程中都需要配置mvc:annotation-driven標籤,後面講,這裡先配置上 -->

<mvc:annotation-driven/>

重定向

關於重定向

  • 一般情況下,控制器方法返回字串型別的值會被當成邏輯檢視名處理
  • 如果返回的字串中帶 forward: redirect: 字首時,SpringMVC 會對他們進行特殊處理:將 forward: 和 redirect: 當成指示符,其後的字串作為 URL 來處理
  • redirect:success.jsp:會完成一個到 success.jsp 的重定向的操作
  • forward:success.jsp:會完成一個到 success.jsp 的轉發操作

定義頁面連結

<a href="springmvc/testRedirect">testRedirect</a>

定義控制器方法

@RequestMapping("/testRedirect")

public String testRedirect(){

System.out.println("testRedirect");

return "redirect:/index.jsp";

//return "forward:/index.jsp";

}