3

我正在尝试使用 Jasper Reports (v3.5.2) 生成 PDF/HTML 格式的报告并将其打印到 webapp 的浏览器。这个 web 应用程序已经使用 JSF(Woodstock) 作为前端和 EJB 3(使用 JPA 和 Hibernate 作为 MySQL 数据库的持久性提供程序)。

我的问题是 - 生成基于 Jasper 的报告的代码应该在哪里?我对此完全感到困惑。我应该把它放在 JSF 前端吗?或者它应该是业务逻辑中的“报告”模块作为会话 bean?

我认为正确的地方是将业务层作为一个单独的模块。我将使用报告名称、输入参数映射和报告格式作为业务方法的参数调用业务方法,并获得生成的 pdf/html 作为回报,然后我可以将其发送到浏览器。我在正确的轨道上吗?

你能建议一个如何去做这件事的模式吗?

另外,我想使用 EJBQL,因为我已经在使用 JPA。

谢谢。

4

3 回答 3

3

如果您要将碧玉生成嵌入到您的耳朵中,那么我会说它应该按照您的建议抽象到一个类中。我不确定我是否会为它创建一个单独的 EJB,除非您正在执行集群或以其他方式将报告生成卸载到另一个 JVM,或者您有一些特殊的事务需求。

另一个常见的选择是拥有一个完全独立的报表服务器,您可以远程调用它,它会接管与用户的交互。

于 2009-07-24T18:06:30.883 回答
1

我在这里假设“生成代码”=“调用报告的 API”。

您主要希望通过表示层执行此操作 - 表示层中的库与报告层中的资源联系,只是为了将报告流式传输给用户。

这样,您将避免在实际将数据发送给请求者(客户端)之前保留数据并跨层传递数据

于 2009-07-29T03:49:51.887 回答
0

有几种方法可以解决这个问题。您可以从托管 bean 生成报告,请注意,您可能必须通过在浏览器中呈现报告之前调用 facesContext.responseComplete() 来中断 JSF 生命周期。

另一个解决方案可能是拥有一个报告 servlet,您可以在需要生成报告时从 JSF 输出链接调用它。

于 2009-08-29T15:55:28.340 回答