天天看點

springMVC視圖解析原理學習

SpringMVC如何解析視圖概述

不論控制器傳回一個String,ModelAndView,View都會轉換為ModelAndView對象,由視圖解析器解析視圖,然後,進行頁面的跳轉。

springMVC視圖解析原理學習

視圖解析源碼分析:重要的兩個接口ViewResolver和View。

視圖和視圖解析器

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

視圖

  • 視圖的作用是渲染模型資料,将模型裡的資料以某種形式呈現給客戶,主要就是完成轉發或者是重定向的操作.
  • 為了實作視圖模型和具體實作技術的解耦,Spring 在 org.springframework.web.servlet 包中定義了一個高度抽象的 View 接口:
  • springMVC視圖解析原理學習
  • 視圖對象由視圖解析器負責執行個體化。由于視圖是無狀态的,是以他們不會有線程安全的問題

常用的視圖實作類

springMVC視圖解析原理學習

JstlView

  • 若項目中使用了JSTL,則SpringMVC 會自動把視圖由InternalResourceView轉為 JstlView  (斷點調試,将JSTL的jar包增加到項目中,視圖解析器會自動修改為JstlView)
  • 若希望直接響應通過 SpringMVC 渲染的頁面,可以使用 mvc:view-controller 标簽實作
springMVC視圖解析原理學習

視圖解析器

  • SpringMVC 為邏輯視圖名的解析提供了不同的政策,可以在 Spring WEB 上下文中配置一種或多種解析政策,并指定他們之間的先後順序。每一種映射政策對應一個具體的視圖解析器實作類。
  • 視圖解析器的作用比較單一:将邏輯視圖解析為一個具體的視圖對象。
  • 所有的視圖解析器都必須實作 ViewResolver 接口:

常用的視圖解析器實作類

springMVC視圖解析原理學習
  • 程式員可以選擇一種視圖解析器或混用多種視圖解析器
  • 每個視圖解析器都實作了 Ordered 接口并開放出一個 order 屬性,可以通過 order 屬性指定解析器的優先順序,order  越小優先級越高。
  • SpringMVC 會按視圖解析器順序的優先順序對邏輯視圖名進行解析,直到解析成功并傳回視圖對象,否則将抛出 ServletException 異常
  • InternalResourceViewResolver:
  1. JSP 是最常見的視圖技術,可以使用 InternalResourceViewResolve作為視圖解析器:

springMVC視圖解析原理學習
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" target="_blank" rel="external nofollow" >testRedirect</a>

定義控制器方法

@RequestMapping("/testRedirect")

public String testRedirect(){

System.out.println("testRedirect");

return "redirect:/index.jsp";

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

}