在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;
}
}
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;
}
}
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());
}
}
}
}
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());
}
}
}
}
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);
}
}
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);
}
}
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));
}
}
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));
}
}
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));
}
}
<?
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 >
<! 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 >
<?
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 >
< 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 >
最后就是打包工作了,这个就不再说什么了。
最终效果:
怎样,很方便吧!