助けてください: レポートを生成するたびに .jrxml がコンパイルされます。一度だけコンパイルしたい。どの条件を追加する必要があるか教えてください。私は入出力ストリームを使用していません。compileReport を使用して、一度だけコンパイルするために実行できること。
1 に答える
Web アクセス可能な場所で JRXML ファイルを使用できるようにしないでください。JRXML ファイルには、読みやすい SQL ステートメントが含まれており、次のことがわかります。
- データベース ベンダー
- データベース構造
悪意のあるユーザーは、この情報を悪意のある目的で使用する可能性があります。私は SQL ステートメントをデータベース ビューまたはストアド プロシージャに移動する傾向があり、多くの情報が隠されています。
レポートの作成プロセスは次のとおりです。
- ビジネス アナリストと相談して、すべてのレポートのレポート要件を決定してください。
- 単純なバリエーション (異なる列や並べ替え順序など) のすべてのレポートを統合します。
- レポートごとに JRXML ファイルを作成し (1 つの JRXML ファイルで複数のレポートのバリエーションを処理できます)、JRXML ファイルをソース コード リポジトリに保存します。
- JRXML ファイルをコンパイルしてファイルを取得
.jasper
します。 - コンパイルされた
.jasper
ファイルをリポジトリと Web サーバーに保存します。 - ソース コードからコンパイル手順を完全に削除します。
つまり、レポートのコンパイルは、アプリケーション環境の外で行う必要があるプロセスです。これは、開発者が取るべきステップです。開発者はコンパイルされたレポートをリポジトリにチェックインし、テスト/ビルド環境は最新のコピーを取得できます。
オンザフライでレポートをコンパイルする絶対的な要件がない限り。動的なレポートを作成しない限り、オンザフライでレポートをコンパイルしても意味がないことに注意してください。その場合、 DynamicJasperのようなものを使用したいと思うでしょう。
とはいえ、あなたの質問に対する答えは次のとおりです。
- のソースを入手してみてください
Sample_Report.jasper
。 - リソースが存在しない場合は
Sample_Report.jasper
、示したようにコンパイルします。 - リソースが存在する場合は、コンパイル手順を避けてください。
これは次のようになります。
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);
以下も参照してください。