如何只编译.jrxml一次

时间:2013-02-06 20:38:25

标签: java jasper-reports

请帮助: .jrxml每次生成报告时都在编译。我想只编译一次。请帮助我,我需要添加什么条件。我没有使用输入/输出流。使用compileReport可以做什么只编译一次。

1 个答案:

答案 0 :(得分:3)

不要在任何可通过Web访问的地方提供JRXML文件。 JRXML文件包含易于读取的SQL语句,它们提供了:

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

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

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

  1. 与业务分析师交谈以确定所有报告的报告要求。
  2. 合并所有简单变体的报告(例如,不同的列或排序顺序)。
  3. 为每个报告创建JRXML文件(一个JRXML文件可以处理多个报告变体),将JRXML文件存储在源代码存储库中。
  4. 编译JRXML文件以获取.jasper个文件。
  5. 将已编译的.jasper文件存储在存储库和Web服务器上。
  6. 完全从源代码中删除编译步骤。
  7. 简而言之,编译报告是您应该在应用程序环境之外执行的过程。这是开发人员应该采取的步骤。开发人员将已编译的报告检入存储库,测试/构建环境可以获取最新的副本。

    除非您有绝对要求即时编译报告。请注意,除非您要创建动态报告,否则即时编译报告并不合理。在这种情况下,您需要使用类似DynamicJasper的内容。

    所有这一切,你的问题的答案是:

    1. 尝试获取Sample_Report.jasper
    2. 的来源
    3. 如果Sample_Report.jasper资源不存在,则按照您的显示进行编译。
    4. 如果资源确实存在,请避免编译步骤。
    5. 这可能类似于:

      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);
      

      另见: