1. 程式人生 > >SpringMVC(Spring4)——檢視

SpringMVC(Spring4)——檢視

1.SpringMVC如何解析檢視:

1.1 檢視和檢視解析器:

請求處理方法執行完成之後,最終返回一個ModelAndView物件。對於那些返回String、View或ModeMap等型別的處理方法,SpringMVC會在內部將它們裝配成一個ModelAndView物件,它包含了邏輯名和模型物件的檢視。

SpringMVC藉助檢視解析器(ViewResolver)最終得到的檢視物件(View),最終的檢視可以是JSP,也可能是Excel、JFreeChart等各種表現形式的檢視。

對於最終究竟採取何種檢視物件對模型資料進行渲染,處理器並不關心,處理器的工作重點聚焦在生產模型資料的工作上,從而實現MVC的充分解耦。

1.2 檢視:

檢視的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶。

為了實現檢視模型和具體實現技術的解耦,Spring在org.springframework.web.servlet包中定義了一個高度抽象的View介面。

檢視物件由檢視解析器負責例項化。由於檢視是無狀態的,所以他們不會有執行緒安全問題。

常用的檢視實現類:

1.3 檢視解析器:

SpringMVC為邏輯檢視的解析提供了不同的策略,可以在Spring WEB上下文中配置一種或多種解析策略,並指定他們的先後順序。每一種對映策略對應一個具體的檢視解析器實現類。

檢視解析器的作用比較單一:將邏輯檢視解析為一個具體的檢視物件。

所有的檢視解析器都必須實現ViewResolver介面:

常見的檢視解析器實習類:

每個檢視解析器都實現了Ordered介面並開放一個order屬性,可以通過order屬性指定解析器的先後順序,order越小優先順序越高。

SpringMVC會按檢視解析器的優先順序順序對邏輯檢視名進行解析,直到解析成功並返回檢視物件,否則丟擲ServletException異常。

2.InternalResourceViewResolver:

JSP是最常見的檢視技術,可以使用InternalResourceViewResolver作為檢視解析器:

若專案中使用了JSTL,則SpringMVC會自動把檢視由InternalResourceView轉為JstlView。

若使用JSTL的fmt標籤則需要在SpringMVC的配置檔案中配置國際化資原始檔(參見之前的文章)以及國際化配置檔案。

i18n.properties:

i18n.username=Username
i18n.password=Password

i18n_zh_CN.properties:

i18n.username=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801

i18n_en_US.properties:

i18n.username=Username
i18n.password=Password

若希望直接響應通過SpringMVC渲染的頁面,可以使用mvc:view- controller標籤實現(參見之前的文章)。

3.Excel檢視:

若希望使用Excel展示資料列表,僅需要拓展SpringMVC提供的AbstractExcelView或AbstractJExcelView。實現buildExcelDocument()方法,在方法中使用模型資料物件構建Excel文件就可以了。

AbstractExcelView基於POI API,而AbstractJExcelView是基於JExcelAPI的。

檢視物件配置IOC容器中的一個Bean,使用BeanNameViewResolver作為檢視解析器即可(參見之前的文章)。

若希望直接在瀏覽器上下載Excel文件,則可以設定響應頭Content-Disposition的值為attachment;filename=xxx.xls。

例如,我自定義一個檢視:

package com.atguigu.springmvc.views;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;

@Component
public class HelloView implements View{

	@Override
	public String getContentType() {
		return "text/html";
	}

	@Override
	public void render(Map<String, ?> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		response.getWriter().print("hello view, time: " + new Date());
	}

}
@RequestMapping("/testView")
	public String testView(){
		System.out.println("testView");
		return "helloView";
	}

4.重定向:

如果返回的字串中帶有forward:或redirect:字首時,SpringMVC會對他們進行特殊處理:將forward:和redirect:當成指示符,其後的字串作為URL來處理。

-redirect:success.jsp:會完成一個到success.jsp的重定向的操作。

-forward:success.jsp:會完成一個到success.jsp的轉發操作。

@RequestMapping("/testRedirect")
	public String testRedirect(){
		System.out.println("testRedirect");
		return "redirect:/index.jsp";
	}