在WEB应用开发中,有可能要求动态生成非HTML格式(比如XLS或PDF)的视图以显示或保存查询得到的结果。使用强大的SpringMVC框架,可以非常方便地实现这个功能。下面是动态生成XLS和PDF格式的“九九乘法表”的例子。该例子使用到Spring框架,生成XLS的POI组件,生成PDF的iText组件:
首先,我们编写产生“九九乘法表”的业务对象
package
service;

import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;


/** */
/**
* @author jaqcy.Ya
*
*/
public
class
MapService

...
{
public static Map createMap(int num)

...{
List sheetList=new ArrayList();
for(int i=1;i<=num;i++)

...{
List rowList=new ArrayList();
for(int j=1;j<=i;j++)

...{
rowList.add(new String(i+"*"+j+"="+i*j));
}
sheetList.add(rowList);
}
Map map=new HashMap();
map.put("sheet",sheetList);
return map;
}
}
接着编写产生XLS格式视图的对象,该类继承SpringFrameWork的AbstractExcelView,并实现其抽象方法buildExcelDocument(Map,HSSFWorkbook,HttpServletRequest,HttpServletResponse)s
package
view;

import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;

import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;

import
org.apache.poi.hssf.usermodel.HSSFCell;
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;


/** */
/**
* @author jaqcy.Ya
*
*/
public
class
ExcelView
extends
AbstractExcelView

...
{

@Override
protected void buildExcelDocument(Map map, HSSFWorkbook workbook, HttpServletRequest req, HttpServletResponse resp) throws Exception

...{
HSSFSheet sheet=workbook.createSheet("sheet");

List sheetList=(List)map.get("sheet");
Iterator sheetIt=sheetList.iterator();
int i=0;
while(sheetIt.hasNext())

...{
HSSFRow row=sheet.createRow(i++);
int j=0;
List rowList=(List)sheetIt.next();
Iterator rowIt=rowList.iterator();
while(rowIt.hasNext())

...{
HSSFCell cell=row.createCell((short)j++);
cell.setCellValue((String)rowIt.next());
}
}
}

}
编写生成PDF格式视图的对象,该类继承SpringFrameWork的AbstractPdfView,并实现其抽象方法buildPdfDocument(Map,Document,PdfWriter,HttpServletRequest,HttpServletResponse)
package
view;

import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;

import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;

import
org.springframework.web.servlet.view.document.AbstractPdfView;

import
com.lowagie.text.Document;
import
com.lowagie.text.Table;
import
com.lowagie.text.pdf.PdfWriter;


/** */
/**
* @author jaqcy.Ya
*
*/
public
class
PdfView
extends
AbstractPdfView

...
{
protected void buildPdfDocument(Map map, Document doc, PdfWriter writer, HttpServletRequest req, HttpServletResponse resp) throws Exception

...{
Table table=new Table(9);
table.setWidth(90);
table.setBorderWidth(1);
List sheetList=(List)map.get("sheet");
Iterator sheetIt=sheetList.iterator();
while(sheetIt.hasNext())

...{
List rowList=(List)sheetIt.next();
Iterator rowIt=rowList.iterator();
while(rowIt.hasNext())

...{
table.addCell((String)rowIt.next());
}
}
doc.add(table);
}
}
接着就是连接XLS和PDF视图的控制器了
package
controller;

import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;

import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.AbstractController;


/** */
/**
* @author jaqcy.Ya
*
*/
public
class
XlsViewController
extends
AbstractController

...
{
protected ModelAndView handleRequestInternal(HttpServletRequest req,
HttpServletResponse resp) throws Exception

...{
return new ModelAndView(new view.ExcelView(),service.MapService.createMap(9));
}

}
package
controller;

import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;

import
org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.AbstractController;



/** */
/**
* @author jaqcy.Ya
*
*/
public
class
PdfViewController
extends
AbstractController

...
{
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception

...{
return new ModelAndView(new view.PdfView(),service.MapService.createMap(9));
}
}
接着就是Spring的IoC配置文件xlspdf-servlet.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd“
>
<
beans
>
<
bean
id
="xlsView"
class
="controller.XlsViewController"
/>
<
bean
id
="pdfView"
class
="controller.PdfViewController"
/>
<
bean
id
="urlMapping"
class
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
>
<
property
name
="mappings"
>
<
props
>
<
prop
key
="/*.xls"
>
xlsView
</
prop
>
<!--
影射所有XLS后缀的请求到控制器
-->
<
prop
key
="/*.pdf"
>
pdfView
</
prop
>
<!--
影射所有PDF后缀的请求到控制器
-->
</
props
>
</
property
>
</
bean
>
</
beans
>
接下来就是编写WEB应用配置文件web.xml了
<?
xml version="1.0" encoding="UTF-8"
?>
<
web-app
xmlns
="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
version
="2.4"
>
<
context-param
>
<
param-name
>
contextConfigLocation
</
param-name
>
<
param-value
>
/WEB-INF/xlspdf-servlet.xml
</
param-value
>
</
context-param
>
<
listener
>
<
listener-class
>
org.springframework.web.context.ContextLoaderListener
</
listener-class
>
</
listener
>
<
servlet
>
<
servlet-name
>
xlspdf
</
servlet-name
>
<
servlet-class
>
org.springframework.web.servlet.DispatcherServlet
</
servlet-class
>
<
load-on-startup
>
1
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
xlspdf
</
servlet-name
>
<
url-pattern
>
*.xls
</
url-pattern
>
</
servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>
xlspdf
</
servlet-name
>
<
url-pattern
>
*.pdf
</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
最后就是打包工作了,这个就不再说什么了。
最终效果:

怎样,很方便吧!