Spring的一个优秀之处在于,把view层技术与MVC框架的其他部分分离开来。 例如,选择使用Velocity或者XSLT来代替已有的JSP方式只需要修改配置就可以实现。
一:xslt视图
下面利用xslt视图技术实现word形式的视图
1 首先在ServletConfig.java中注册xslt的视图解析器。
@Bean
public ViewResolver viewResolver(){ //配置jsp视图解析器
XsltViewResolver viewResolver = new XsltViewResolver();
viewResolver.setPrefix("/WEB-INF/xsl/");
viewResolver.setSuffix(".xslt");
return viewResolver;
}
当然你也可以使用xml文件来配置
<bean class="org.springframework.web.servlet.view.xslt.XsltViewResolver">
<property name="prefix" value="/WEB-INF/xsl/" />
<property name="suffix" value=".xslt" />
</bean>
新建一个 “home.xslt”文件,用来渲染显示视图内容 注意该文件所在目录为"WEB-INF/xsl/"其是1中的Prefix配置
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<html>
<head>
<title>Hello!</title>
</head>
<body>
<h1>My First Words</h1>
<ul>
<xsl:apply-templates />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="word">
<li>
<xsl:value-of select="." />
</li>
</xsl:template>
</xsl:stylesheet>
3 新建一个XsltController 控制器 注意返回的视图文件名称 “home”表示返回的视图文件是在/WEB-INF/xsl/文件夹下的 home.xslt文件,其在2中创建
@RequestMapping("/")
public String home(Model model) throws Exception {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("wordList");
List<String> words = Arrays.asList("Hello", "Spring", "Framework");
for (String word : words) {
Element wordNode = document.createElement("word");
Text textNode = document.createTextNode(word);
wordNode.appendChild(textNode);
root.appendChild(wordNode);
}
model.addAttribute("wordList", root);
return "home";
}
按照上面你的步骤完成后,访问controller即可获得xslt视图。
二:文档视图
对看模型数据输出的用户来说,返回一个HTML页面并不总是最好的方法。 Spring简化了根据模型数据动态输出PDF文档或Excel电子表格的工作。 这些文档即最终视图,它们将以适当的内容类型用流的形式从服务器输出到客服端。
1 同一中的第一步:在ServletConfig.java中注册xslt的视图解析器。
2:新建一个controller添加一个映射
@RequestMapping("/excel")
public ModelAndView excel(Model model) throws Exception {
model.addAttribute("wordList", "");
return new ModelAndView(new HomePage(), (Map<String, ?>) model);
}
3 新建一个继承
public class HomePage extends AbstractExcelView {
@Override
protected void buildExcelDocument(Map model, HSSFWorkbook workbook, HttpServletRequest req,
HttpServletResponse response) throws Exception {
String fileName = "用户列表excel.xls";
response.setCharacterEncoding("UTF-8");
response.setContentType("application/ms-excel");
response.setHeader("Content-Disposition", "inline; filename="+new String(fileName.getBytes(),"iso8859-1"));
OutputStream outputStream = response.getOutputStream();
// 产生Excel表头
HSSFSheet sheet = workbook.createSheet("基本信息");
HSSFRow header = sheet.createRow(0);
// 产生标题列
header.createCell(0).setCellValue("ID");
header.createCell(1).setCellValue("名字");
header.createCell(2).setCellValue("邮箱");
header.createCell(3).setCellValue("密码");
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("mm/dd/yyyy"));
int rowNumber = 1;
for (int i=0;i<10;i++) {
HSSFRow row = sheet.createRow(rowNumber++);
// 产生标题列
row.createCell(0).setCellValue("1111"+rowNumber);
row.createCell(1).setCellValue("2222"+rowNumber);
row.createCell(2).setCellValue("3333"+rowNumber);
row.createCell(3).setCellValue("4444"+rowNumber);
}
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}
}
当然也可以实现PDF的视图,具体实现请参考spring的参考手册