BIRT使用API进行简单部署到项目中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先,这个API部署其实在官网上是叫"Servlet Example"。
我没有在网上找到中文的这个教程,所以我就以我这贫乏的英语水品来自己理解了官网上的步骤。
下面直接开始,我不是原文翻译的所以有些地方用词不当也是正常。
既然是个Servlet Exampl那么它肯定符合Java EE的规范。
我先把目录结构贴到下面,让大家先有个整体感觉。
图片不是很清楚,凑合着看吧。
我先说下目录结构Tomcat和Webapps就不说了。
下面就是自己新建一个自己的文件夹在tomcat/webapps下面是自己的API BIRT的项目。
名字自己起就好了,官网上是叫WebReport 吧,上面写的很清楚了。
我自己是叫TestAPI
Images和Reports是用来放报表的地方,Images是图片和图像报表,然后Reports是文字报表。
就是把自己建好的报表copy到Reports里面。
具体建报表就不说了,自带的帮助文档和网上有很多资料。
下面就是WEB-INF目录了,建立好这个目录,你的API所有配置和用的资源才可以发动。
在WEB-INF下面的lib没用过也知道是放jar的地方。
还有一个platform也是放一些报表运行所需的配置信息和一些jar。
其实我们都知道上面图其实应该在WEB-INF下面还有个classes文件夹,用来放编译好的java文件。
这也是个重要的目录。
上面没有画。
官网上是分了五步,我这里就按自己的来了,也不说分步了。
首先也是需要一个runtime从
/downloads/download.php?file=/birt/downloads/drops/R-R1-2_1_3-200707051847/birt-runtime-2.1.3.zip你可以下载到这个“runtime”不是很大。
下载好以后打开,
然后进入ReportEngine目录把lib里的所有jar包全部拷贝到自己建立的lib下面,如图
然后开始往platform里面塞东西。
把runtime/ReportEngine的两个文件夹(plugins和configuration)拷贝到你自己的platform里面。
plugins里面也是一些报表所需的jar而configuration里面是什么东西?就是一个config.ini文件,我不知道是干什么用的。
拷完之后如下:
如果你的报表用到数据库驱动了,必须把数据库驱动文件拷贝到
\WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070705-1847\dri
vers这个路径下面,看着长其实不难找。
拷贝完是这样,贴个图:
配置就差不多了,就查一个web.xml文件了。
下面是比较重要的东西。
有三个文件。
是API的核心操作文件。
∙BirtConfig.properties - Configuration properties for the Engine.
∙BirtEngine.java - Class used to initialize the Report Engine.
∙WebReport.java - The servlet that handles report generation on a GET command.
就是上面三个文件是官网的原文,我拷贝过来的。
第一个是构造报表引擎的资源文件。
第二个用来初始化报表引擎的类。
第三个用GET方法来调用报表。
我英文不好,自己理解是这样的。
(四级我都没考,我觉得找个美国人待上一个月英语水平就上去了)
具体这三个文件的代码我贴到下面
BirtConfig.properties
logDirectory=c:/temp
logLevel=FINEST
BirtEngine.java
import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import javax.servlet.*;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.core.framework.IPlatformContext;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
public class BirtEngine {
private static IReportEngine birtEngine = null;
private static Properties configProps = new Properties();
private final static String configFile = "BirtConfig.properties";
public static synchronized void initBirtConfig() {
loadEngineProps();
}
public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
if (birtEngine == null )
{
EngineConfig config = new EngineConfig();
if ( configProps != null ){
String logLevel = configProps.getProperty("logLevel");
Level level = Level.OFF;
if ("SEVERE".equalsIgnoreCase(logLevel))
{
level = Level.SEVERE;
} else if ("WARNING".equalsIgnoreCase(logLevel))
{
level = Level.WARNING;
} else if ("INFO".equalsIgnoreCase(logLevel))
{
level = ;
} else if ("CONFIG".equalsIgnoreCase(logLevel))
{
level = Level.CONFIG;
} else if ("FINE".equalsIgnoreCase(logLevel))
{
level = Level.FINE;
} else if ("FINER".equalsIgnoreCase(logLevel))
{
level = Level.FINER;
} else if ("FINEST".equalsIgnoreCase(logLevel))
{
level = Level.FINEST;
} else if ("OFF".equalsIgnoreCase(logLevel))
{
level = Level.OFF;
}
config.setLogConfig(configProps.getProperty("logDirectory"), level);
}
config.setEngineHome("");
IPlatformContext context = new PlatformServletContext( sc );
config.setPlatformContext( context );
try
{
Platform.startup( config );
}
catch ( BirtException e )
{
e.printStackTrace( );
}
IReportEngineFactory factory = (IReportEngineFactory) Platform
.createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTOR Y );
birtEngine = factory.createReportEngine( config );
}
return birtEngine;
}
public static synchronized void destroyBirtEngine() {
if (birtEngine == null) {
return;
}
birtEngine.shutdown();
Platform.shutdown();
birtEngine = null;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
private static void loadEngineProps() {
try {
//Config File must be in classpath
ClassLoader cl = Thread.currentThread ().getContextClassLoader();
InputStream in = null;
in = cl.getResourceAsStream (configFile);
configProps.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
WebReport.java
import java.io.IOException;
import java.io.PrintWriter;
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.HTMLRenderContext;
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;
public class WebReport 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 WebReport() {
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");
ServletContext sc = req.getSession().getServletContext();
this .birtReportEngine = BirtEngine.getBirtEngine(sc);
//setup image directory
HTMLRenderContext renderContext = new HTMLRenderContext();
renderContext.setBaseImageURL(req.getContextPath()+"/images");
renderContext.setImageDirectory(sc.getRealPath("/images"));
logger.log( Level.FINE, "image directory " + sc.getRealPath("/images"));
System.out.println("stdout image directory " + sc.getRealPath("/images"));
HashMap<String, HTMLRenderContext> contextMap = new HashMap<String, HTMLRen derContext>();
contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderC ontext );
IReportRunnable design;
try
{
//Open report design
design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportNa me );
//create task to run and render report
IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );
task.setAppContext( contextMap );
//set output options
HTMLRenderOption options = new HTMLRenderOption();
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 );
}
}
/**
* The doPost method of the servlet.
*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request,response);
/**
* Initialization of the servlet.
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
BirtEngine.initBirtConfig();
}
}
官网上还有2.2版本WebReport.java的代码,我反正没用上。
您要有用上的可以去试试。
这三个文件弄好了就ok了。
官网上还罗嗦一大堆是在Eclipse下开发要加什么插件什么插件的其实就是加上Servlet支持的就行。
我没有用纯Eclipse开发所以直接编译好这两个java,连同拷贝上那个BirtConfig.properties资源文件到自己的WEB-INF/classes下面就行了。
这下好了,就只有配置你的servlet了。
在WEB-INF下面建立一个web.xml文件,配置一下这个webreport的servlet
代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>WebReport</servlet-name>
<servlet-class>WebReport</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebReport</servlet-name>
<url-pattern>/webReport</url-pattern>
</servlet-mapping>
</web-app>
最后,把自己做好的报表放到自己项目下面的reports(这是个复数的s)里面就好,这个目录不能错的,在servlet里面是要找这个目录的。
很简单,然后自己再写一个自己的jsp就ok了
原来的WebReport.java文件的doPost方法里什么都没有的,如果自己的jsp通过post传递的话不会显示出来报表。
我上面吧post里面调用get了。
这下就全部OK了。
下面我的这个小jsp给大家参考。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
</head>
<body>
<form name="theform" action="webReport" method="post">
<table>
<tr>
<td>TestReport.rptdesign</td>
<td><input name="ReportName" type="text"></td>
<td><button type="submit">走你</button></td>
</tr>
</table>
</form>
</body>
</html>
OK在输入框里面填写你的报表名称,记得要带扩展名。
这就完工了,但是有个问题,我在用脚本数据源的时候提示不成功。
还有我的带参数的报表这样部署的话不让输入参数自己就全出来了。
希望大侠能帮我参考下。
留言啊。
留言~~小弟新人,学习中,渴望进步!明天还得加班。
困啊。