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页面添加
便可访问到我们自己定义的视图