1. 程式人生 > >SpringMvc之自定義檢視

SpringMvc之自定義檢視

嗯,在學習之前得想一想自定義檢視存在的意義是什麼,有什麼作用,什麼時候用到自定義檢視???

在我們能要提交一個表單時,需要將內容用Excel匯出,這個時候SpringMvc就提供一個介面 AbstractExcelView 

那怎樣定義一個簡單的自定義檢視

第一部:新建一個HelloView.java並且實現View介面

package com.sgf.springmvc.view;

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() {
		// TODO Auto-generated method stub
		return  "text/html";
	}
    /* 渲染檢視*/
	@Override
	public void render(Map<String, ?> arg0, HttpServletRequest arg1, HttpServletResponse arg2) throws Exception {
		arg2.getWriter().print("hello view,time"+new Date());
		
	}

}

然後在SpringMvc配置檔案中配置自定義檢視解析器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<!-- 配置自動掃描的包 -->
	<context:component-scan base-package="com.sgf.springmvc"></context:component-scan>
	<!--配置檢視解析器:如何把handler方法的返回值解析為實際的物理檢視  -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	<!-- 配置一個檢視解析器 -->
	<!-- 配置檢視  BeanNameViewResolver 解析器: 使用檢視的名字來解析檢視 -->
	<!-- 通過 order 屬性來定義檢視解析器的優先順序, order 值越小優先順序越高 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="100"></property>
	</bean>
	
	<!-- 配置直接轉發的頁面 -->
	<!-- 可以直接相應轉發的頁面, 而無需再經過 Handler 的方法.  -->
	<mvc:view-controller path="/success" view-name="success"/>
	
	<!-- 在實際開發中通常都需配置 mvc:annotation-driven 標籤 -->
	<mvc:annotation-driven></mvc:annotation-driven>
</beans>

那麼兩個檢視解析器會先執行哪個??通過 order 屬性來定義檢視解析器的優先順序, order 值越小優先順序越高。而第一個檢視解析器的預設order為Integer的最大值,也就是說只要你給另一個試圖解析器添加了order屬性值,他就最後一個執行。而佟剛老師舉得例子很形象,更好理解:把兩個配置器比喻成飯館,InternalResourceViewResolver這個檢視解析器就好比你經常去吃的那個飯館,而BeanNameViewResolver檢視解析器就如同新開的,那麼你總想嚐嚐鮮,也就跟選擇檢視解析器一樣,選擇比較新鮮的去嘗試一下。

再在測試方法中寫測試方法

package com.sgf.springmvc.handlers;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

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

}

return 則為類名首字母的小寫。return "helloView"; 檢視解析器就會去找相應的檢視。我們自定義的檢視是HelloView,spring容器幫我們例項物件的時候,首字母會小寫,即 HelloView helloView = new HelloView()

在jsp頁面新增

便可訪問到我們自己定義的檢視