您的位置:首页 > 其它

「Birt」BIRT使用API进行简单部署

2009-09-09 17:51 1276 查看
在网上查了下BIRT的文章,不是很多。而且讲述的也不是十分全面。还是得自己琢磨啊。

刚实验好,贴上来分享一下共同交流。希望也能帮助到对API部署还困惑的人。

做这个纯粹是看官网上的例子,还有好多疑点,希望高手能给我解答下。

首先,这个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从http://www.eclipse.org/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/drivers这个路径下面,看着长其实不难找。

拷贝完是这样,贴个图:



配置就差不多了,就查一个web.xml文件了。

下面是比较重要的东西。有三个文件。是API的核心操作文件。

就是上面三个文件是官网的原文,我拷贝过来的。

第一个是构造报表引擎的资源文件。

第二个用来初始化报表引擎的类。

第三个用GET方法来调用报表。

我英文不好,自己理解是这样的。(四级我都没考,我觉得找个美国人待上一个月英语水平就上去了)

具体这三个文件的代码我贴到下面

BirtConfig.properties

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.

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 = Level.INFO;

} 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_FACTORY );

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, HTMLRenderContext>();

contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext );

IReportRunnable design;

try

{

//Open report design

design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );

//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="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

http://java.sun.com/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在输入框里面填写你的报表名称,记得要带扩展名。

转载自:http://www.blogjava.net/leweslove/articles/leweslove.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐