BIRT: Dynamic Report Servlet

本文将展示如何利用BIRT(Business Intelligence Reporting Tools)创建动态报告,并通过表单和参数来实现交互式报告。重点介绍了从数据库获取数据、构建数据集、设置输出格式以及在Servlet中整合整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[url]http://wiki.eclipse.org/Java_-_Dynamic_Report_Servlet_(BIRT)[/url]

<html>
<head>
</head>
<body>
The Query that is used for this example is Select * From OFFICES
<form id="form1" method="get" action="http://localhost:8080/DynamicReport/run">
<select name="dyna1" multiple size="8" >
<option value="COUNTRY">COUNTRY</option>
<option value="CITY">CITY</option>
<option value="STATE">STATE</option>
<option value="OFFICECODE">OFFICECODE</option>
<option value="ADDRESSLINE1">ADDRESSLINE1</option>
<option value="ADDRESSLINE2">ADDRESSLINE2</option>
<option value="POSTALCODE">POSTALCODE</option>
<option value="TERRITORY">TERRITORY</option>
</select>

<INPUT TYPE="SUBMIT" VALUE="Run Dynamic Report">
<INPUT TYPE="HIDDEN" NAME="ReportName" Value="DynamicTableExample.rpttemplate">
</form>
</body>
</html>


import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.model.api.CellHandle;
import org.eclipse.birt.report.model.api.DataItemHandle;
import org.eclipse.birt.report.model.api.ElementFactory;
import org.eclipse.birt.report.model.api.LabelHandle;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
import org.eclipse.birt.report.model.api.PropertyHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.RowHandle;
import org.eclipse.birt.report.model.api.StructureFactory;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;


public class DynamicReport extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Constructor of the object.
*/
private IReportEngine birtReportEngine = null;
protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );

public DynamicReport() {
super();
}

/**
* Destruction of the servlet.

*/
public void destroy() {
super.destroy();
BirtEngine.destroyBirtEngine();
}


/**
* The doGet method of the servlet.

*
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

//get report name and launch the engine
resp.setContentType("text/html");
//resp.setContentType( "application/pdf" );
//resp.setHeader ("Content-Disposition","inline; filename=test.pdf");
String reportName = req.getParameter("ReportName");
String[] cols = (String[])req.getParameterMap().get("dyna1");
ServletContext sc = req.getSession().getServletContext();
this.birtReportEngine = BirtEngine.getBirtEngine(sc);

IReportRunnable design;
try
{
//Open report design
design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );
ReportDesignHandle report = (ReportDesignHandle) design.getDesignHandle( );
buildReport( cols, report );

//create task to run and render report
IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );
task.setAppContext( contextMap );

//set output options
HTMLRenderOption options = new HTMLRenderOption();
options.setImageHandler( new HTMLServerImageHandler() );
options.setImageDirectory( sc.getRealPath("/images");
options.setBaseImageURL( req.getContextPath() + "/images" );
options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
//options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
options.setOutputStream(resp.getOutputStream());
task.setRenderOption(options);

//run report
task.run();
task.close();
}catch (Exception e){

e.printStackTrace();
throw new ServletException( e );
}
}

public void buildReport(String[] cols, ReportDesignHandle designHandle){


try{
ElementFactory designFactory = designHandle.getElementFactory( );

buildDataSource(designFactory, designHandle);


//ArrayList cols = new ArrayList();
//cols.add("OFFICECODE");
//cols.add("CITY");
//cols.add("COUNTRY");

buildDataSet(cols, "From Offices", designFactory, designHandle);

TableHandle table = designFactory.newTableItem( "table", cols.length );
table.setWidth( "100%" );
table.setDataSet( designHandle.findDataSet( "ds" ) );


PropertyHandle computedSet = table.getColumnBindings( );
ComputedColumn cs1 = null;

for( int i=0; i < cols.length; i++){
cs1 = StructureFactory.createComputedColumn();
cs1.setName((String)cols[i]);
cs1.setExpression("dataSetRow[\"" + (String)cols[i] + "\"]");
computedSet.addItem(cs1);
}


// table header
RowHandle tableheader = (RowHandle) table.getHeader( ).get( 0 );


for( int i=0; i < cols.length; i++){
LabelHandle label1 = designFactory.newLabel( (String)cols[i] );
label1.setText((String)cols[i]);
CellHandle cell = (CellHandle) tableheader.getCells( ).get( i );
cell.getContent( ).add( label1 );
}

// table detail
RowHandle tabledetail = (RowHandle) table.getDetail( ).get( 0 );
for( int i=0; i < cols.length; i++){
CellHandle cell = (CellHandle) tabledetail.getCells( ).get( i );
DataItemHandle data = designFactory.newDataItem( "data_"+(String)cols[i] );
data.setResultSetColumn( (String)cols[i]);
cell.getContent( ).add( data );
}



designHandle.getBody( ).add( table );
}catch(Exception e){
e.printStackTrace();
}

}

void buildDataSource( ElementFactory designFactory, ReportDesignHandle designHandle ) throws SemanticException
{

OdaDataSourceHandle dsHandle = designFactory.newOdaDataSource(
"Data Source", "org.eclipse.birt.report.data.oda.jdbc" );
dsHandle.setProperty( "odaDriverClass",
"org.eclipse.birt.report.data.oda.sampledb.Driver" );
dsHandle.setProperty( "odaURL", "jdbc:classicmodels:sampledb" );
dsHandle.setProperty( "odaUser", "ClassicModels" );
dsHandle.setProperty( "odaPassword", "" );

designHandle.getDataSources( ).add( dsHandle );

}

void buildDataSet(String[] cols, String fromClause, ElementFactory designFactory, ReportDesignHandle designHandle ) throws SemanticException
{

OdaDataSetHandle dsHandle = designFactory.newOdaDataSet( "ds",
"org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
dsHandle.setDataSource( "Data Source" );
String qry = "Select ";
for( int i=0; i < cols.length; i++){
qry += " " + cols[i];
if( i != (cols.length -1) ){
qry += ",";
}

}
qry += " " + fromClause;

dsHandle.setQueryText( qry );

designHandle.getDataSets( ).add( dsHandle );


}
/**
* The doPost method of the servlet.

*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(" Post Not Supported");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}

/**
* Initialization of the servlet.

*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
BirtEngine.initBirtConfig();

}

}


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>

<display-name>DynamicReport</display-name>


<servlet>
<servlet-name>DynamicReport</servlet-name>
<servlet-class>DynamicReport</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>DynamicReport</servlet-name>
<url-pattern>/run</url-pattern>
</servlet-mapping>


</web-app>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值