SpringMVC中的檢視和檢視解析器
對於控制器的目標方法,無論其返回值是String、View、ModelMap或是ModelAndView,SpringMVC都會在內部將它們封裝為一個ModelAndView物件進行返回。
Spring MVC 藉助檢視解析器(ViewResolver)得到最終的檢視物件(View),最終的檢視可以是JSP也可是Excell、
JFreeChart等各種表現形式的檢視。
SpringMVC的檢視解析流程
SpringMVC的檢視解析流程為:
1、呼叫目標方法,SpringMVC將目標方法返回的String、View、ModelMap或是ModelAndView都轉換為一個ModelAndView物件;
2、然後通過檢視解析器(ViewResolver)對ModelAndView物件中的View物件進行解析,將該邏輯檢視View物件解析為一個物理檢視View物件;
3、最後呼叫物理檢視View物件的render()方法進行檢視渲染,得到響應結果。
檢視(View)
檢視的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶。
為了實現檢視模型和具體實現技術的解耦,Spring在org.springframework.web.servlet包中定義了一個高度抽象的View介面。
檢視物件由檢視解析器負責例項化。由於檢視是無狀態的,所以他們不會有執行緒安全的問題。所謂檢視是無狀態的,是指對於每一個請求,都會建立一個View物件。
JSP是最常見的檢視技術。
常用的檢視實現類:
檢視解析器(ViewResolver)
檢視解析器的作用是將邏輯檢視轉為物理檢視,所有的檢視解析器都必須實現ViewResolver介面。
SpringMVC為邏輯檢視名的解析提供了不同的策略,可以在Spring WEB上下文中配置一種或多種解析策略,並指定他們之間的先後順序。每一種對映策略對應一個具體的檢視解析器實現類。程式設計師可以選擇一種檢視解析器或混用多種檢視解析器。可以通過order屬性指定解析器的優先順序,order越小優先順序越高,SpringMVC會按檢視解析器順序的優先順序對邏輯檢視名進行解析,直到解析成功並返回檢視物件,否則丟擲ServletException異常。
常用的檢視解析器實現類:
以下是通過InternalResourceViewResolver作為檢視解析器解析,將邏輯檢視解析為JSP檢視的例項:
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
若專案中使用了JSTL,則SpringMVC會自動把檢視由InternalResourceView轉為JstlView。
使用mvc:view-controller不經控制器直接跳轉到頁面
若希望直接響應通過SpringMVC渲染的頁面,可以使用mvc:view-controller標籤實現:
<!-- 配置直接轉發的頁面 -->
<!-- 可以直接相應轉發的頁面, 而無需再經過 Handler 的方法. -->
<mvc:view-controller path="/success" view-name="success"/>
那麼現在可以直接在某一頁面中通過請求路徑”success”訪問到/WEB-INF/views/success.jsp頁面(因為我們上面配置了檢視解析器將邏輯檢視解析為字首為/WEB-INF/views/,字尾為.jsp的物理檢視)。但是,這種情況下通過控制器就無法對映到請求了,需要再進行如下配置:
<!-- 在實際開發中通常都需配置 mvc:annotation-driven 標籤, 之前的頁面才不會因為配置了直接轉發頁面而受到影響 -->
<mvc:annotation-driven></mvc:annotation-driven>
關於重定向
一般情況下,控制器方法返回字串型別的值會被當成邏輯檢視名處理,但如果返回的字串中帶forward:或redirect:字首時,SpringMVC會對它們進行特殊處理:將forward: 和redirect: 當成指示符,其後的字串作為URL 來處理。示例如下:
index.jsp:
<a href="${pageContext.request.contextPath }/springmvc/testRedirect">Test Redirect</a>
controller:
@Controller
@RequestMapping("/springmvc")
public class SpringMVCTest {
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect");
return "redirect:/index.jsp";
}
}
即可重定向到index.jsp。也可在redirect:/後新增控制器方法的對映路徑,重定向到該目標方法。