2013-09-27 27 views
2

那么,我正在通过Tomcat 6服务器构建我的应用程序项目。作为我自己的应用程序打包成一个战争文件,我已经包括整个BIRT 4.2引擎,现在能够在那里生成我的自定义报告。 BIRT运行时环境相关性使我的战争文件部署成长大约20 MB。利用BIRT独立运行时

然而,最近我发现BIRT有its standalone runtime也打包为战争文件(也称为BIRT查看器),我现在用它来测试我的PDF格式创建的报告。使用起来非常简单,它只需要报告文件值及其参数,您将其作为GET请求传递。它在查看器中显示报告,您也可以在其中下载这些报告。

我的问题是,我可以将我自己的应用程序和运行时集成到何时从我的应用程序请求下载以让独立运行时管理它?这也涉及到安全问题,因为我不希望我的应用程序中的每个用户都能够下载所有可用的报告。

现在可以吗?

+0

我使用运行时作为来自python/django服务器的外部进程 - 我管理python服务器上的安全性,并从django内部调用BIRT到本地生成报告。但是你是否希望直接使用运行时来处理你的请求? –

+0

我打算以某种方式将报告模块从我自己的应用中分离出来。我发现的是独立的war文件,可以在运行我的应用程序的同一台服务器上运行。据我所知,它们之间的通信应该使用HTTP请求。 –

回答

0

我终于决定设置建立我自己的servlet,它服务于基于REST服务的报告。这样您就可以通过URL来访问所需的模板/参数。

作为一个开源的git项目发布,你可以看看它here。每个人都被邀请改进它,新的委员会将受到欢迎。

1

据我所知,您需要将您的应用程序与BIRT运行时查看器集成,以便您可以从应用程序内生成报告,但由后端的BIRT查看器提供支持。下面是步骤

前准备活动 -

  • 我已经使用4.2.2 SRC从here

  • 我在这里提取它,并把它BIRT_VIEWER_HOME 组织。 eclipse.birt-BIRT_4_2_2_RC2_201301291123 \观察者\ org.eclipse.birt.report.viewer \

1)复制从哟web.xml中的所有内容你的BIRT查看器到你的应用程序的web.xml。 BIRT_VIEWER_HOME \ birt \ WEB-INF

2)复制BIRT_VIEWER_HOME \ birt \目录下的webcontent文件夹,并将其放入应用程序的根文件夹中。所以当部署在tomcat中时,它会创建一个目录结构 \ webapps \ yourapplication \ webcontent

3)创建一个jsp页面,里面有一个iframe。例如。其中有这样的内容,我已经离开了SRC为空,以便最初

<iframe src="" id="birtViewer" name="birtViewer" frameborder="0" 
    scrolling="no" class="reportframe" 
    style="height:600px;margin:0px;padding:0px;" /> 

通知report.jsp时,iframe将不会加载任何

3)基于一些点击或任何其他条件,设置这个iframe的SRC与此URL 报告=报告/“> HTTP:// LOCALDOMAIN:端口/ yourapplication /框架_report =报告/ & __format = PDF

例如使用JQuery我实现

$(document).ready(function(){ 
    var url; 
    if(someCondition) 
    { 
     url = "frameset?__report=reports/testreport.rptdesign&__format=pdf"; 
    } 
    else 
    { 
     url = "dummyPage.jsp"; 
    } 

    $("#birtViewer").attr('src',url);//setting the src for iframe 
}) 

4)这将为此报告加载带有BIRT参数的iframe。

5)你可以填写所有的参数,并点击“确定”按钮。该报告将在此iframe中生成。

我宁愿让你照顾安全方面。一个简单的安全措施是使用tomcat的Filter机制来检查BIRT查看器URL并查看它是否被经过身份验证或有会话的人访问。

UPDATE:

如果你想有一个中央BIRT执行点,创建一个批处理文件,传递参数调用从Java,然后得到所生成的位置报告。这种方式通过命令提示符以及Java/Tomcat很有用。下面的步骤

  1. 创建一个批处理文件,比如report.bat并在此处添加此代码。将 所有BIRT罐放在classpath中。我会省略为简洁

    %JAVACMD% -Dlog4j.configuration="file:%APP_HOME%/conf/log4j.properties" 
    -cp "%CP%" -Djava.util.logging.config.file=%APP_HOME%/conf/birtlogger.properties 
    org.eclipse.birt.report.engine.api.ReportRunner %p1% %p2% %p3% %p4% %p5% 
    
    • %APP_HOME%/报告设置 变量的值,我把设计。您可以动态传递它 。
    • p1到p5是我的5个参数,我将其传递给Report Runner的 。你可以传递任意数量的参数。
  2. 通过从您的Java/Tomcat调用此报表来运行报表。请参阅@ Adam的答案。

    report.bat -f pdf -p "p1=paramValue1" -p "p2=paramValue2" -p 
    "p3=paramValue3" -p "p4=paramValue4" -p "p5=paramValue5" -o  
    %APP_HOME%\myreportfolder\NameofMyReport.pdf %APP_HOME%\NameofMyReport.rptdesign 
    

您将获得%APP_HOME%\ myreportfolder生成的报告NameofMyReport.pdf。指出你的java代码从那里加载它。

如果您想要详细说明,请参阅this link

+0

听起来确实不错,但是我担心这会实现的是将纯粹的查看器框架显示在我自己的页面中。我真正想要的是拥有一个独立的报告服务器和模板。然后,如果部署了多个应用程序,则每个应用程序都可以访问服务器以获取其报告(以便以后可以下载)。我的问题是,真的有可能有一个像使用独立运行时一样的集中式报表服务器吗? –

+0

中央服务器很难通过HTTP,因为如果没有JSP为您处理,您将不具备PDF对象句柄。也就是说,你不会得到一个链接点击“另存为”,但只能显示PDF,并让PDF格式的插件在“另存为”,“打印”等照顾。我已经更新了我的答案中央执行。 – Thomas

+0

看看我的回答,我终于实现了自己的servlet,集成了引擎,它提供了REST访问。感谢您的详细回复。 –

0

一种解决方案是沟birt.war并呼吁BIRT作为一个独立的Java进程,在BIRT运行时下载的ReportEngine子目录中使用这些脚本,通过Executing a Java application in a separate process

我的J2EE是有点生疏,但否则@Thomas有一个非常好的指示,可以用自定义viewservlets.jar重建birt.war文件。看起来有些旧的指令可能是在这里:

http://wiki.eclipse.org/BIRT/FAQ/Birt_Project#Q:_How_do_I_build_the_2.2.2F2.3.2F2.5_BIRT_Viewer.3F

+0

因此,解决方案以某种方式适应运行时本身以允许其独立执行和通信。看起来这不能用HTTP请求来完成,我想我应该在运行时自己实现一些通信层,以允许我的模块与它交谈(Web服务,消息队列)? –

+0

无需获取独立服务器的源代码,我已经构建了自己的servlet解决方案。这样我就可以通过REST网址使它们可用。 –

0

转到此链接:http://wiki.eclipse.org/Simple_Execute_%28BIRT%29_2.1

在这里,你会发现使用BIRT独立的应用程序的完整代码..

+1

请注意,[只提供链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info),所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra

+0

这就是将BIRT集成到我的应用程序中的方法!然而,我想要做的是让一个接口(假设HTTP或WS)作为一个报告服务器,运行在不同的进程中,向其请求报告!无论如何,谢谢你的答案 –