3

助けてください: レポートを生成するたびに .jrxml がコンパイルされます。一度だけコンパイルしたい。どの条件を追加する必要があるか教えてください。私は入出力ストリームを使用していません。compileReport を使用して、一度だけコンパイルするために実行できること。

4

1 に答える 1

3

Web アクセス可能な場所で JRXML ファイルを使用できるようにしないでください。JRXML ファイルには、読みやすい SQL ステートメントが含まれており、次のことがわかります。

  • データベース ベンダー
  • データベース構造

悪意のあるユーザーは、この情報を悪意のある目的で使用する可能性があります。私は SQL ステートメントをデータベース ビューまたはストアド プロシージャに移動する傾向があり、多くの情報が隠されています。

レポートの作成プロセスは次のとおりです。

  1. ビジネス アナリストと相談して、すべてのレポートのレポート要件を決定してください。
  2. 単純なバリエーション (異なる列や並べ替え順序など) のすべてのレポートを統合します。
  3. レポートごとに JRXML ファイルを作成し (1 つの 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 に答える