springMVC4(14)各类视图输出实例分析
1. 模板视图
FreeMarkerViewResolver 、 VolocityViewResolver 这两个视图解析器都是 UrlBasedViewResolver 的子类。
FreeMarkerViewResolver 会把 Controller 处理方法返回的逻辑视图解析为 FreeMarkerView 。而 VolocityViewResolver 会把返回的逻辑视图解析为 VolocityView 。这两个视图解析器是相似的。
对于 FreeMarkerViewResolver 而言,它会依照 UrlBasedViewResolver 拼接 URL 的方式进行视图路径的解析。可是使用 FreeMarkerViewResolver 的时候不须要我们指定其 viewClass 。由于 FreeMarkerViewResolver 中已经把 viewClass 默认指定为 FreeMarkerView 了。
对于 FreeMarkerView 我们须要给定一个 FreeMarkerConfig 的 bean 对象来定义 FreeMarker 的配置信息。 FreeMarkerConfig 是一个接口, Spring 已经为我们提供了一个实现。它就是 FreeMarkerConfigurer 。我们能够通过在 SpringMVC 的配置文件中面定义该 bean 对象来定义 FreeMarker 的配置信息。当 FreeMarker 的模板文件放在多个不同的路径以下的时候,我们能够使用 templateLoaderPaths 属性来指定多个路径。
以下我们来看一个使用FreeMaker的实例:
在使用FreeMaker前须要导入相关的jar包。使用Maven可在pom.xml下加入例如以下信息:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.24-incubating</version>
</dependency>
在spring容器中配置视图解析器
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value="fm_"/><!-- 指定文件前缀 -->
<property name="suffix" value=".ftl"/><!-- 指定文件后缀 -->
<property name="order" value="1"/><!-- 指定当前视图解析器的优先级 -->
<property name="contentType" value="text/html; charset=utf-8" /><!-- 指定编码类型输出。防止出现中文乱码现象 -->
</bean>
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freeMaker"/><!-- 指定模板文件存放位置 -->
<property name="defaultEncoding" value="UTF-8" /><!-- 由于模板文件中使用utf-8编码,假设不显式指定,会採用系统默认编码。易造成乱码 -->
<property name="freemarkerSettings"><!-- 定义FreeMaker丰富的自己定义属性 -->
<props>
<prop key="classic_compatible">true</prop><!-- 当碰到对象属性为null时。返回一个空字符串而非抛出系统异常 -->
</props>
</property>
</bean>
接下来我们定义例如以下一个 Controller :
@Controller
public class MyController {
@RequestMapping("test")
public ModelAndView test() {
mav.addObject("hello", "hello World!");
mav.setViewName("freemarker");
return mav;
}
}
接下来在/WEB-INF/freeMaker文件夹下创建一个名为fm_hello.ftl的模板文件。内容例如以下:
<html>
<head>
<title>FreeMarker</title>
</head>
<body>
${hello}
</body>
</html>
经过上面的定义当我们訪问 /freemarker 的时候就会返回一个逻辑视图名称为“hello”的 ModelAndView 对象。依据定义好的视图解析的顺序,首先进行视图解析的是 FreeMarkerViewResolver 。这个时候 FreeMarkerViewResolver 会试着解析该视图,依据它自身的定义,它会先解析到该视图的 URL 为 fm_freemarker.ftl 。然后它会看能否够实例化该视图对象,即在定义好的模板路径下是否有该模板存在,假设有则返回该模板相应的 FreeMarkerView。在本例中訪问结果例如以下所看到的:
hello World!
2. JSON视图输出
我们能够使用BeanNameViewResolver来输出JSON视图,spring配置文件例如以下所看到的:
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" >
<property name="order" value="1"/>
</bean>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" id="userJson"><!--指定json视图类型-->
<property name="modelKey" value="map" />
<!--实际开发中在控制器我们可能会有非常多模型数据,
这里通过modelKey指定仅仅输出名为user的模型数据-->
<!--假设我们想指定多个模型数据输出。能够使用modelKeys,它是一个Set集合,
实例配置例如以下:
<property name="modelKeys">
<set >
<value>name1</value>
<value>name2</value>
</set>
</property>
-->
</bean>
指定使用此视图输出后,我们编写我们的控制器输出一个Map来測试视图
@RequestMapping("jsonView")
public String jsonView(ModelMap map ){
for(int i = 0 ; i < 5; i ++){
map.put("key" + i," value" + i);
}
return "userJson";//相应json视图的Bean名
}
訪问jsonView,输出视图例如以下,注意箭头部分,我们的相应Content-Type变为了application/json,这也是json视图输出的特点
3. XML视图输出
我们使用spring-oxm来完毕我们java对象到xml格式文本的转换,需先导入相关的jar包,使用maven可在pom.xml上加入:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
我们使用MarshallingView来输出xml视图。还是使用BeanNameViewResolver来解析xml视图,它的配置例如以下所看到的:
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView" id="myXmlView">
<property name="modelKey" value="articles"/><!--输出模型中的articles属性-->
<property name="marshaller" ref="xmlMarshaller" /><!--指定解析工具-->
</bean>
<bean class="org.springframework.oxm.xstream.XStreamMarshaller" id="xmlMarshaller"><!-- 将模型数据转换为XML格式 -->
<property name="streamDriver">
<bean class="com.thoughtworks.xstream.io.xml.StaxDriver" />
</property>
</bean>
以下是我们的Article POJO类和控制层配置:
/*******************POJO类****************/
public class Article {
private String title;
private String content;
//忽略get和set方法
}
/**************控制层拦截方法********************/
@RequestMapping("xmlView")
public String xmlView(ModelMap map){
List<Article>articles = new ArrayList<Article>();
for(int i = 0 ; i < 5; i ++){
Article article = new Article();
article.setTitle("title" +i);
article.setContent("content" + i);
articles.add(article);
}
map.addAttribute("articles",articles);
return "myXmlView";
}
我们在游览器上訪问xmlView,视图输出例如以下数据:
<?xml version="1.0" ?
>
<list>
<com.mvc.model.Article>
<title>title0</title>
<content>content0</content>
</com.mvc.model.Article>
<com.mvc.model.Article>
<title>title1</title>
<content>content1</content>
</com.mvc.model.Article>
<com.mvc.model.Article>
<title>title2</title>
<content>content2</content>
</com.mvc.model.Article>
<com.mvc.model.Article>
<title>title3</title>
<content>content3</content>
</com.mvc.model.Article>
<com.mvc.model.Article>
<title>title4</title>
<content>content4</content>
</com.mvc.model.Article>
</list>
同一时候相应Content-Type是application/xml;charset=UTF-8
4. 输出excel视图
输出excel视图须要先导入jar包:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
excel视图须要拓展AbstractExcelView并实现其抽象方法buildExcelDocument,以下是一个实例配置:
package com.mvc.view;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
import com.mvc.model.Article;
public class ExcelView extends AbstractExcelView {
@Override
protected void buildExcelDocument(Map<String, Object> model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
List<Article> articles= (List<Article>) model.get("articles");
HSSFSheet sheet = workbook.createSheet("文章列表");//创建一页
HSSFRow header = sheet.createRow(0);//创建第一行
header.createCell(0).setCellValue("标题");
header.createCell(1).setCellValue("正文");
for( int i = 0; i < articles.size();i++){
HSSFRow row = sheet.createRow(i + 1);
Article article = articles.get(i);
row.createCell(0).setCellValue(article.getTitle());
row.createCell(1).setCellValue(article.getContent());
}
}
}
spring容器配置例如以下所看到的:
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean class="com.mvc.view.ExcelView" id="excelView" /><!-- 注冊自己定义视图 -->
编写控制器:
@RequestMapping("excelView")
public String excelView(ModelMap map){
List<Article>articles = new ArrayList<Article>();
for(int i = 0 ; i < 5; i ++){
Article article = new Article();
article.setTitle("title" +i);
article.setContent("content" + i);
articles.add(article);
}
map.addAttribute("articles",articles);
return "excelView";
}
在游览器訪问。则提示下载文件:
下载打开显演示样例如以下内容:
springMVC4(14)各类视图输出实例分析的更多相关文章
- 一些有用的javascript实例分析(三)
原文:一些有用的javascript实例分析(三) 10 输入两个数字,比较大小 window.onload = function () { var aInput = document.getElem ...
- Linux系统网络性能实例分析
由于TCP/IP是使用最普遍的Internet协议,下面只集中讨论TCP/IP 栈和以太网(Ethernet).术语 LinuxTCP/IP栈和 Linux网络栈可互换使用,因为 TCP/IP栈是 L ...
- mvc结合web应用实例分析
Mvc的web应用实例分析 Login.jsp——视图部分的输入文件success.jsp——视图部分的输出文件failure.jsp——视图部分的输出文件LoginBean.java——模型部分Lo ...
- objective-C 的内存管理之-实例分析
objective-C 的内存管理之-实例分析 注:这是<Objective-C基础教程>一书上的实例,但是原书限于篇幅,分析得比较简单,初次阅读看得比较费劲,这里展开详细讨论一下. 场景 ...
- C# format 日期 各种 符号 实例分析如何精确C#日期格式到毫秒
摘 自: http://developer.51cto.com/art/200908/141145.htm 实例分析如何精确C#日期格式到毫秒 2009-08-03 10:48 paulfzm jav ...
- Watchdog问题实例分析
1.日志获取 Watchdog相关的问题甚至需要以下所有的日志: logcat 通过adb logcat命令输出Android的一些当前运行日志,可以通过logcat的 -b 参数指定要输出的日志缓冲 ...
- linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】
本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...
- 实例分析jdom和dom4j的使用和区别 (转)
实例分析jdom和dom4j的使用和区别 对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于 ...
- JVM源码分析-类加载场景实例分析
A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?. 场景如下: public cl ...
随机推荐
- 常用的服务发现对比(Consul、zookeeper、etcd、eureka)
这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论: Feature Consul Zookeeper Etcd Eureka 服务健康检查 服务状态,内存,硬盘等 (弱)长连接 ...
- (转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!
ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO ht ...
- php模板引擎之blade
一.简介模板引擎 模板引擎是将网站的页面设计和PHP应用程序几乎完全分离的一种解决方案,它能让前端工程师专注页面搭建,让后台工程师专注功能实现,以便实现逻辑分离,让每个人发挥所长.模板引擎技术的核心是 ...
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...
- windows servier2008+virtualenv下部署Flask (IIS+wfastcgi)
由于业务只有一台windows server2008的服务器,一般的nginx+uwsgi的部署方式不行,以下记录部署过程,本文参考自:https://www.cnblogs.com/xiaolecn ...
- 有强大的cURL,忘掉httpclient的吧!
这段时间想做一个网页采集的程序,由于一网站采用了防采集的办法,我的httpclient总是在登录后无法获取到我想要过去的链接.在无数次的跟踪过后发现原来人家给返回的是javascript拼成的页面,而 ...
- (69)Wangdao.com第十一天_JavaScript 指定函数对象的 this 上下文对象
指定函数对象的 this 上下文对象 即调用函数对象的 .call() 或者 .apply() 方法 指定 this 指向指定的对象. function myFun(){ document.write ...
- STM32 UART DMA实现未知数据长度接收
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...
- HOWTO: Use STM32 SPI half duplex mode
HOWTO: Use STM32 SPI half duplex mode I’ve got my hands onto some STM32F030F4P6 ARM-Cortex M0 proces ...
- golang 引用相对路径package
My $GOPATH is "/Users/peter/goworkspace" Golang 版本是: go version go1.6 darwin/amd64 在这个work ...