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页面添加

SpringMvc之自定义视图

便可访问到我们自己定义的视图

SpringMvc之自定义视图