3

Please Help: .jrxml is compiling every time i generate the report. I want to compile it only once. please help me what condition should i need to add. i am not using input/output stream. with compileReport what can be done to compile only once.

4

1 回答 1

3

不要让您的 JRXML 文件在任何可通过网络访问的地方都可用。JRXML 文件包含易于阅读的 SQL 语句,其中包含:

  • 数据库供应商
  • 数据库结构

恶意用户可以将这些信息用于不法目的。我倾向于将 SQL 语句移动到数据库视图或存储过程中,这隐藏了很多信息。

您的报告创建过程应如下所示:

  1. 与业务分析师交谈以确定所有报告的报告要求。
  2. 合并所有简单变化的报告(例如,不同的列或排序顺序)。
  3. 为每个报告创建 JRXML 文件(一个 JRXML 文件可以处理多个报告变体),将 JRXML 文件存储在源代码存储库中。
  4. 编译 JRXML 文件以获取.jasper文件。
  5. 将编译.jasper后的文件存储在存储库和 Web 服务器上。
  6. 完全从源代码中删除编译步骤。

简而言之,编译报告是一个你应该在应用程序环境之外进行的过程。这是开发人员应该采取的步骤。开发人员将编译后的报告检查到存储库中,测试/构建环境可以获取最新的副本。

除非您绝对需要即时编译报告。请注意,除非您正在创建动态报告,否则即时编译报告并没有真正意义。在这种情况下,您需要使用DynamicJasper 之类的东西。

说了这么多,你的问题的答案是这样的:

  1. 尝试获取Sample_Report.jasper.
  2. 如果Sample_Report.jasper资源不存在,则按照您显示的方式进行编译。
  3. 如果资源确实存在,请避免编译步骤。

这可能类似于:

JasperReport jasReport = null;

try {
  jasReport = (JasperReport)JRLoader.loadObject(
    getResourceAsStream("Sample_Report.jasper")
  );
}
catch( Exception e ) {
  jasperReport = JasperCompileManager.compileReport(
    getResourceAsStream("Sample_Report.jrxml")
  );
}

您必须确保正确的目录和文件可以加载(如果它们确实存在于这些位置)。您还必须在编译后保存已编译的报告,以便下一次迭代获取该.jasper文件。

要保存编译后的.jasper文件,您可以使用以下API

JasperCompileManager.compileReportToStrem(input, output);

也可以看看:

于 2013-02-06T21:10:46.713 回答