您的位置:首页 > 编程语言 > Java开发

使用SpringMVC框架生成XLS和PDF格式的WEB应用视图

2010-09-27 01:30 549 查看
在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>

最后就是打包工作了,这个就不再说什么了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐