在WEB应用开发中,有可能要求动态生成非HTML格式(比如XLS或PDF)的视图以显示或保存查询得到的结果。使用强大的SpringMVC框架,可以非常方便地实现这个功能。下面是动态生成XLS和PDF格式的“九九乘法表”的例子。该例子使用到Spring框架,生成XLS的POI组件,生成PDF的iText组件: Spring http://www.springframework.org
POI http://jakarta.apache.org/poi
iText http://www.lowagie.com/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>
最后就是打包工作了,这个就不再说什么了。