📄 excelreportservlet.java
字号:
/*
* Created on 2006-8-7
*
* TODO
*/
package net.excel.report;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.excel.report.config.DataSourceConfig;
import net.excel.report.config.ReportConfig;
import net.excel.report.datasource.BaseDataSource;
import net.excel.report.datasource.DBConnection;
/**
* <b> TODO:</b>
* ExcelReportServlet 是报表生成器在Web服务器上的一个应用封装,通过这个封装好的Servlet
* 用户就不需要再去封装自己的Servlet。只需将该Servlet部署到相应的应用中去,即可以在页面直接请求报表
* 打印。<br>
* <b>如何配置该Servlet:</b>(该servlet支持以下几个输入参数)<br>
*
* 1. TempletFilePath:设定模板文件和配置文件(ReportConfig.xml)目录(相对于webroot目录的逻辑目录名).<br>
*
* 2. DSImplDataBase: 配置数据库类型数据源实现类,(用户自定义的实现,该类必须继承至DBDataSource类)<br>
*
* 3. DSImplStatic:配置静态类型数据源实现类.(用户自定义的实现,该类必须继承至BaseDataSource类)<br>
*
* 4. JNDI:如果用户没有配置‘DSImplDataBase’可以配置JNDI来使用默认的数据库类型数据源来实现数据检索。<br>
*
* 5. Logger: 配置Excel报表生成器的日志输出实现类,该类必须实现Logger接口
* @author juny
* @version 1.0
* @since 1.0
* @see net.excel.report.Logger
* @see net.excel.report.datasource.DBDataSource
* @see net.excel.report.datasource.BaseDataSource
*/
public class ExcelReportServlet extends HttpServlet {
private static Logger log = Logger.getLogger(ExcelReportServlet.class);
/** (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
this.process(arg0, arg1);
}
/**
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
this.process(arg0, arg1);
}
/**
* @see javax.servlet.Servlet#destroy()
*/
public void destroy() {
super.destroy();
}
/**
* @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
*/
public void init() throws ServletException {
Enumeration names = getServletConfig().getInitParameterNames();
String name = null;
while (names.hasMoreElements()) {
name = (String)names.nextElement();
setReportParam(name,
getServletConfig().getInitParameter(name));
}
}
/**
* 设置报表参数
* @param name:参数名称
* @param value:参数值
*/
private void setReportParam(String name, String value){
if(name.equals("DSImplDataBase")){
getInstance(value,DataSourceConfig.DS_TYPE_DATABASE);
}else if( name.equals("DSImplStatic")){
getInstance(value,DataSourceConfig.DS_TYPE_STATIC);
}else if(name.equals("TempletFilePath")){
path = value;
}else if(name.equals("JNDI")){
jndi = value;
}else if(name.equals("Logger")){
logger = value;
}
}
/**
* 处理报表打印请求。
* @param request
* @param response
* @throws IOException
*/
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException{
OutputStream os = response.getOutputStream();
String reportName = (String)request.getParameter(ReportConfig.REPORT);
response.setContentType("application/vnd.ms-excel;charset=gb2312");
response.setHeader("Content-Disposition",
"attachment; filename=\"" + reportName + "\";");
String reloadConfig = (String)request.getParameter("reloadConfig");
boolean needReloadConfig = false;
if(null != reloadConfig && reloadConfig.equalsIgnoreCase("true")){
needReloadConfig = true;
if(log.isDebugEnable()){
log.debug("reload config");
}
}
try{
long curTime = System.currentTimeMillis();
ReportEngine r = getReportEngine(needReloadConfig);
//取得报表参数
Map params = getParamMap(request);
//生成报表
r.getReportAsExcel(os, params);
os.flush();
log.debug("Total time:" + String.valueOf(System.currentTimeMillis() - curTime) + " milliseconds");
//response.flushBuffer();
}catch(Exception e){
log.error(e.getMessage());
}
}
/**
* 根据Repuest来生成报表需要的参数信息。
* @param request: HttpServletRequest对象,保存用户请求的信息。
* @return 参数包装Map,该Map对象以报表生成器需要的格式封装用户请求的参数信息。
*/
private Map getParamMap(HttpServletRequest request){
Enumeration params = request.getParameterNames();
String param = null;
String value = "";
String [] values = null;
Map retMap = new HashMap();
while(params.hasMoreElements()){
param = (String)params.nextElement();
value = (String)request.getParameter(param);
retMap.put(param, value);
}
retMap.put("request", request);
return retMap;
}
private ReportEngine reportEngine = null;
/**
* 取得报表引擎对象,报表引擎对象在应用中只有一个实例存在。
* @param reload:标识是否需要强制重新装载报表配置信息。<br>
* true:重新装载。
* false:不需重新装载。
* @return 返回报表引擎对象。
*/
private synchronized ReportEngine getReportEngine(boolean reload){
if(null != reportEngine && !reload){
return reportEngine;
}
String path = getServletContext().getRealPath(this.path);
//设置报表logger实现类
if(null != logger){
ReportEngine.setLogger(logger);
}
//取得报表管理对象
reportEngine = ReportEngine.getReportEngine(path +
File.separator +
"ReportConfig.xml",
reload);
//设置报表模板文件目录
reportEngine.setTempletFilePath(path);
//设置数据连接属性
if(null != this.jndi){
reportEngine.setDBConnection(new DBConnection(jndi));
}
//设置数据源实现类。
Object obj = null;
if(null != dsImpl){
obj = dsImpl.get(DataSourceConfig.DS_TYPE_DATABASE);
if(null != obj){
reportEngine.setDataSourceImplement(DataSourceConfig.DS_TYPE_DATABASE,
(BaseDataSource)obj);
}
obj = null;
if(null != (obj = dsImpl.get(DataSourceConfig.DS_TYPE_STATIC))){
reportEngine.setDataSourceImplement(DataSourceConfig.DS_TYPE_STATIC,
(BaseDataSource)obj);
}
}
return reportEngine;
}
/**
* 取得用户配置数据源类的实例。
* @param className:要生成实例的class名称。
* @param dsType:标识数据源的类型。
* @return 返回生成的数据源对象。
*/
private Object getInstance(String className, String dsType){
Object obj = null;
try{
if(log.isDebugEnable()){
log.debug("Excel report initializing: Create data source instance:" + className);
}
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = ExcelReportServlet.class.getClassLoader();
}
obj = classLoader.loadClass(className).newInstance();
if(null != obj && obj instanceof BaseDataSource){
if(null == dsImpl){
dsImpl = new HashMap();
}
dsImpl.put(dsType, obj);
return obj;
}
log.error("Error: User defined data source must inherited from excel.report.datasource.BaseDataSource.");
}catch(Exception e){
log.error("Error: Catched an Exception when loads a datasource instance. --"
+ className
+ " \n " + e.getMessage());
}
return null;
}
private Map dsImpl = null;
private String path = "/WEB-INF/classes/ReportConfig";
private String jndi = null;
private String logger = null;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -