在现有的 webapp 中集成 BIRT

Posted

技术标签:

【中文标题】在现有的 webapp 中集成 BIRT【英文标题】:Integrate BIRT in existing webapp 【发布时间】:2012-02-17 07:52:27 【问题描述】:

我想将 BIRT 报告引擎添加到 Tomcat 中的现有 web 应用程序中。我不需要 BIRT 查看器,我真的只想能够从像 http://localhost:8080/birt/output?__report=test.rptdesign&sample=my+parameter 这样的 URL 运行报告并使用不同的导出选项 pdf、xls、doc、html

到目前为止,我发现的集成指南都包括查看器和编写我自己的 servlet 来处理不同的格式。

我希望有人知道我需要的报告引擎 web.xml 文件中的哪些 servlet 映射,以及我需要从 lib 目录中包含哪些 jar,以便在现有的 web 应用中实现这个准系统 BIRT。

【问题讨论】:

【参考方案1】:

我希望有人知道哪些 servlet 映射来自 我需要的报告引擎 web.xml 文件以及我需要哪些 jars 包含在这个准系统 BIRT 实现的 lib 目录中 在现有的 webapp 中。

我不一定想编写自己的 servlet 我只是想将现有的报告运行时从它自己的独立 web 应用程序(here 在“运行时”按钮下)集成到我现有的 web 应用程序中,所以我不必须分发 2 个 webapps 来支持运行 BIRT 报告。抱歉,如果没有更清楚。

我确实以最简单的方式解决了这个问题,以防有人有类似的问题(使用 BIRT 运行时 3.7.1):

    您只需将以下 servlet 映射添加到您自己的 webapp\web-inf\web.xml 文件中:

    <!-- Engine Servlet -->
    <servlet>
        <servlet-name>EngineServlet</servlet-name>
        <servlet-class>org.eclipse.birt.report.servlet.BirtEngineServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>EngineServlet</servlet-name>
        <url-pattern>/output</url-pattern>
    </servlet-mapping>
    

    将runtime 的web-inf\lib 目录中的所有 jar 包含到您自己的webapp\web-inf\lib 目录中。

然后,您可以使用您自己的 web 应用程序中的 output BIRT 报告 URL 运行 .rptdesign 文件,并指定您想要的任何格式,例如:

http://localhost:8080/myOwnWebapp/output?__report=test.rptdesign&__format=pdf
http://localhost:8080/myOwnWebapp/output?__report=test.rptdesign&__format=html
http://localhost:8080/myOwnWebapp/output?__report=test.rptdesign&__format=xls
http://localhost:8080/myOwnWebapp/output?__report=test.rptdesign&__format=doc
http://localhost:8080/myOwnWebapp/output?__report=test.rptdesign&__format=ppt

【讨论】:

很棒的答案,感谢 Stack Overflow。完整且完全符合要求。干得好。 这适用于 Tomcat 7 中的 BIRT 4.3.2。它不适用于 Jetty 3.7.1 或 4.3.2。【参考方案2】:

据我了解,您正在尝试从 servlet 生成 birt 报告,其中您在某个位置有 *.rptdesign。

好,看下面的代码

this.bundle = ResourceBundle.getBundle("com.tts.mersal.resources.MersalResources");
this.config = new EngineConfig();
this.config.setEngineHome(bundle.getString("BIRT_ENGINE_HOME"));
this.config.setLogConfig(bundle.getString("BIRT_LOGGING_FOLDER_PATH"), Level.ALL);
Platform.startup(config);
this.factory = (IReportEngineFactory)Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
this.engine = factory.createReportEngine( config );
this.engine.changeLogLevel(Level.ALL);
ContentReader contentReader = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getFileFolderService().getReader(MersalOutboundReportDialogBean.this.dialogReportNode.getNodeRef());
IReportRunnable report = MersalOutboundReportDialogBean.this.getEngine().openReportDesign(contentReader.getContentInputStream());
ReportDesignHandle designHandle = (ReportDesignHandle)report.getDesignHandle();
OdaDataSource source = (OdaDataSource)designHandle.getModule().findDataSource(DATA_SOURCE_NAME);
source.setProperty(source.getPropertyDefn("FILELIST"), buildUrl((String)source.getProperty(designHandle.getModule(), "FILELIST")));
IRunAndRenderTask runAndRenderTask = MersalOutboundReportDialogBean.this.getEngine().createRunAndRenderTask(report);
HTMLRenderOption render = new HTMLRenderOption();
render.setOutputFileName("G:/Render.html");
render.setOutputFormat("html");
runAndRenderTask.setRenderOption(render);
runAndRenderTask.run(); 
runAndRenderTask.close();

正如您所看到的第一件事,您必须准备 birt 引擎,然后从 IReportRunnable 类型中获取报告实例,因此您可以在之后使用将根据您的请求更改的render 选项设置输出的位置.

您有多种选择,HTMLRenderOption、PDFRenderOption 等。

希望对您有所帮助。

谢谢。

【讨论】:

谢谢你,我主要是想将现有的运行时集成到我自己的 webapp 中。对不起,如果这不是更清楚。我在下面解决了这个问题。

以上是关于在现有的 webapp 中集成 BIRT的主要内容,如果未能解决你的问题,请参考以下文章

React Native在原生项目中集成之坑点总结

web中集成shiro

如何在 React WebApp 中集成 OpenCV.js?

如何在现有的 iOS 应用程序中开始集成汽车游戏?

如何在对应OS上的Nativescript中集成平台依赖的SDK

如何在 Ruby on Rails 中集成 Paypal 集成