商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

简介
HTML页面并不总是向用户显示数据输出的最好方式,Spring支持从数据动态生成PDF或Excel文件,并使这一过程变得简单。文档本身就是视图,从服务器以流的方式加上内容类型返回文档,客户端PC只要运行电子表格软件或PDF浏览软件就可以浏览。

为了使用Excel电子表格,你需要在你的classpath中加入‘poi’库文件,而对PDF文件,则需要iText.jar文件。它们都包含在Spring的主发布包中。 

配置和安装
基于文档的视图的处理方式和XSLT视图几乎完全相同,下面的部分将以前面的例子为基础,演示了XSLT例子中的控制器是如何使用相同的数据模型生成PDF文档和Excel电子表格(它们可以在Open Office中打开或编辑)。

文档视图定义
首先,让我们来修改一下view.properties文件(或等价的xml定义),给两种文档类型都添加一个视图定义。加上刚才XSLT视图例子的内容,整个文件如下。

home.class=xslt.HomePage home.stylesheetLocation=/WEB-INF/xsl/home.xslt home.root=words xl.class=excel.HomePage pdf.class=pdf.HomePage

如果你添加你的数据到一个模版电子表格,必须在视图定义的‘url’属性中指定模版位置。

控制器代码
我们用的控制器代码和前面XSLT例子中用的一样,除了视图的名字。当然,你可以干得巧妙一点,使它基于URL参数或者其他逻辑-这证明了Spring的确在分离视图和控制器方面非常出色!

用于Excel视图的视图子类化
正入我们在XSLT例子中做的,为了在生成输出文档的过程中实现定制的行为,我们将继承合适的抽象类。对于Excel,这包括提供一个org.springframework.web.servlet.view.document.AbstractExcelView的子类,并实现buildExcelDocument方法。

下面是一个我们Excel视图的源程序清单,它在电子表格中每一行的第一列中显示模型map中的单词。

package excel; // imports omitted for brevity public class HomePage extends AbstractExcelView { protected void buildExcelDocument( Map model, HSSFWorkbook wb, HttpServletRequest req, HttpServletResponse resp) throws Exception { HSSFSheet sheet; HSSFRow sheetRow; HSSFCell cell; // Go to the first sheet // getSheetAt: only if wb is created from an existing document //sheet = wb.getSheetAt( 0 ); sheet = wb.createSheet("Spring"); sheet.setDefaultColumnWidth((short)12); // write a text at A1 cell = getCell( sheet, 0, 0 ); setText(cell,"Spring-Excel test"); List words = (List ) model.get("wordList"); for (int i=0; i < words.size(); i++) { cell = getCell( sheet, 2+i, 0 ); setText(cell, (String) words.get(i)); } } }

如果你现在修改控制器使它返回xl作为视图的名字(return new ModelAndView("xl", map);),并且运行你的应用,当你再次对该页面发起请求时,Excel电子表格被创建,自动下载。

org.springframework.web.servlet.view.document.AbstractPdfView,并实现buildPdfDocument()方法。 package pdf; // imports omitted for brevity public class PDFPage extends AbstractPdfView { protected void buildPdfDocument( Map model, Document doc, PdfWriter writer, HttpServletRequest req, HttpServletResponse resp) throws Exception { List words = (List) model.get("wordList"); for (int i=0; i<words.size(); i++) doc.add( new Paragraph((String) words.get(i))); } }

用于PDF视图的视图子类化
单词列表的PDF版本就更为简单了。这次,需要象下面一样继承同样修改控制器,使它通过return new ModelAndView("pdf", map);返回一个pdf视图;并在你的应用中重新载入该URL。这次就会出现一个PDF文档,显示存储在模型数据的map中的单词。

1 2 3 4 5 6
【内容导航】
第1页: 和JSP & JSTL一起使用Spring 第2页: Tiles的使用
第3页: Velocity 第4页: XSLT视图
第5页: 文档视图 (PDF/Excel) 第6页: 架构
©版权所有。未经许可,不得转载。
[责任编辑:JavaWorker]
[an error occurred while processing this directive]