加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

birt家园里面看到的关于birt底层操作的原理

发布时间:2020-12-17 01:04:12 所属栏目:安全 来源:网络整理
导读:1.?birt 与 ssh 动态生成参数页面 我现在要在已有的ssh项目中加入报表功能 大致包括上传报表,运行报表 基本思路是:上传时直接把文件内容存入数据库;运行时从数据库取出来,通过String获得inputStream提供给task运行。 主要代码片段: InputStream is=?? n

>>1.?birt 与 ssh &动态生成参数页面

我现在要在已有的ssh项目中加入报表功能

大致包括上传报表,运行报表

基本思路是:上传时直接把文件内容存入数据库;运行时从数据库取出来,通过String获得inputStream提供给task运行。
主要代码片段:
InputStream is=?? new ByteArrayInputStream(bytes);// bytes 就是从DB从取出来的内容。
IReportRunnable design = birtReportEngine.openReportDesign(is);
IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask(design);
task.run();

到目为止,如上功能已经实现,运行结果能在jsp上的iframe显示出来。

但参数问题一直没解决,我看到有用标签 <birt:parameterPage??来生成参数页面,但报找不到标签类的错误
而且用标签好像需要直接指定报表文件的路径( reportDesign="/mytest.rptdesign"),而我的报表是以String存放在数据库中的。

求高手帮我解决参数问题,也就是怎样动态生成参数界面

?

即使用El取,也是一个文件路径,
而我是把整个报表文件的内容以字节形式存到数据库了(因为不希望把文件直接上传到项目中,做到程序和用户内容分开),
所以,现在发现不适合用标签了。

后来发现这个ParametersTask.java(官网API中),可以解析出每个参数,得到一个Map ...??

有相似设计的童鞋可以找我讨论

?

只要拿到ReportDesignHandle,就很容易取到相关的报表参数信息。可以调用BIRT Viewer的相关代码,或者直接通过BIRT engine的相关task去获取。可以看一下BIRT Viewer tag的相关源码。很简单的。

?

>>2.birt jsp传参数

我在jsp页面已经做好数据筛选了,最后返回一个集合或者数组要传给报表,请问报表该怎么接受,处理这个参数绑定到数据集上呢???

解决方案:拼自符串传到报表里对参数进行处理吧。

你是说报表得到这儿集合进行遍历拼动态sql让报表查询并且展现。。。
那现在这个集合通过什么方式传,是放到session里面,还有什么方式。。
jsp页面发送一个action请求,这个请求该怎么写???才能到报表

?

>>3.在DataSet的EventHandler中如何获取参数

大家好,向各位高手请教一个问题:
在一个报表中新建Scripted Data Source和Scripted Data Set,并为这个DataSet编写了一个继承自ScriptedDataSetEventAdapter的JAVA类,
在public void open(IDataSetInstance idatasetinstance) throws ScriptException函数中查询数据库,
产生一个用户的List,
在public boolean fetch(IDataSetInstance dataSet,IUpdatableDataSetRow row)?throws ScriptException中遍历上面的List中的用户
并调用row.setColumnValue("name1","value1");进行填充.
(类似"呼唤"在前面教程中提到的使用java对象做为数据源).
现报表已能正确生成.请问如何在上面的open方法中得到URL中的查询条件?
(如URL为/myProject/frameset?__report=userReport.rptdesgin&username=tom,
我希望在open方法中查询数据库前把username=tom添加到SQL中).


~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢~
这时候有没有reportContext对象,你输入这个对象,点一下,看能不能点出getParameterValue()方法

?

感谢呼唤的回复.我就是想在这里拿到reportContext~
貌似不行~

?

感谢呼唤的提醒,刚才试了一下,可以实现
public void beforeOpen(IDataSetInstance dataSet,
????????????IReportContext reportContext) throws ScriptException,在这个方法中可以拿到reportContext,但是好像只能取到在URL中定义的且同时在report parameters中定义的参数,而在report parameters中未定义的无法取到.
此外还想再请教一下
1.web viewer中的报表创建过程在哪里?或者说像DesignEngin,DesignConfig,PlatForm等对象是在哪里初始化的?
2.如果抛弃web Viewer,那么它所提供的打印/导出等按钮的功能能否自己实现?

~~~~~~~~~~~~~~~~
谢谢各位~

?

关于取参数,reportContext取的是报表里定义的参数,这是肯定的。
你要取url参数,试着使用reportContext.getHttpServletRequest,得到request,再取参数。
关于初始化,你也许把runtime和viewer混淆了。你说的那个是在runtime里,自己使用api来生成和运行报表时操作的对象。而如果使用了web viewer,他主要是使用了viewservlet来处理的。
如果不使用web viewer,你可以在runtime里调用运行报表,但是没有打印/导出的按钮。你当然可以自己实现那些功能。他也是使用的prototypejs来实现前台的ajax功能的。

?

非常感谢"呼唤",您的技术和人品都让我非常钦佩!
仔细看了一下reportContext的API,几乎能从这个对象取到需要的所有东西,所以问题基本解决,再次感谢您的回复.
关于另外两个问题,我觉得都与Web Viewer的实现相关,不知道您是否熟悉Web Viewer的体系结构,根据<Integerating and extending birt>里介绍,Web Viewer用到了SOAP,Axis,prototype等,我想达到的效果就是找到并控制Web Viewer与Runtime的交互,因为我传给ViewerServlet的URL很可能不是BIRT能识别的格式,比如没有用__report=myRpt.rptdesign来指定报表文件的位置,而是传进来一个能代表report文件位置及更多信息的标识,根据这个标识来加入权限管理等更多功能.

~~~~~~~~~~~~~~~~~~~~~~~
谢谢~

?

花时间分析了一下birt的ajax调用,实现方式没以SOAP与Axis实现的WebService交换数据,其中,WebService的处理器为org.eclipse.birt.report.soapengine.processor.BirtDocumentProcessor,在此类的handleGetPage方法中完成report的创建并写入到response中,之后由客户端的js解析并展示到页面. 在handleGetPage方法中,使用org.eclipse.birt.report.service.actionhandler.BirtGetPageActionHandler类封装GetPage事件的调用,在此类内部,由继承关系可以分析出它要使用ReportService的getPage方法来得到一个ByteOutputStream,这个stream中,即为最终产生的报表输出流,将它写入到response中即可. 有不对的地方,望各位指正,谢谢~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读