关键在于将
isLazy 属性设置为
true(如@ThomasKessler在
这个回答中所示)。 这对我有效,并且可以无缺陷地生成三个报告(PDF,XLS,HTML)。
我按照以下步骤进行操作:
.jrxml
...
<parameter name="LOGO_URL" class="java.lang.String" isForPrompting="false"/>
...
<image isLazy="true">
<reportElement uuid="24062838-1ede-4578-acdf-9a63662ea738" x="0" y="0" width="108" height="30"/>
<imageExpression><![CDATA[$P{LOGO_URL}]]></imageExpression>
</image>
...
在一个.properties文件中,我已经配置了每个环境的内容:
my.logo.url=http://localhost:8080/MySite/img/my_logo.jpg
在一个 Servlet 中,我有三个方法:
generatePDFReport、generateXLSReport 和 generateHTMLreport。在最后一个方法中,我有:
Properties prop = Configurator.getProperties(BUNDLENAME);
Connection con = ReportsDB.getConnection();
String reportPathTag = prop.getProperty(Report.JASPERURL);
Map parameters = Report.extractJasperParams(request.getParameterMap());
String jasperPath = parameters.containsKey(reportPathTag) ? (String) parameters.get(reportPathTag) : "";
String reportName = parameters.containsKey(Report.JASPERTITLE) ? (String) parameters.get(Report.JASPERTITLE) : "myReport";
String path = getServletContext().getRealPath("/");
path += jasperPath;
JasperReport jasperReport = null;
JasperDesign jasperDesign = null;
jasperDesign = JRXmlLoader.load(path);
logFilteringCard(parameters);
jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, con);
JRHtmlExporter htmlExporter = new JRHtmlExporter();
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
htmlExporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER, pw);
htmlExporter.exportReport();
con.close();
同时,在这行代码中:
Map parameters = Report.extractJasperParams(request.getParameterMap())
我设置了报告的所有参数,包括 LOGO_URL,并设置了属性值。
在我的情况下,我使用这种通用方法来生成我需要的所有报告。方法 Report.extractJasperParams 使用 request 的映射反映应该生成哪个报告,并相应地设置参数,但您可以根据自己的特定需求简化它。
方法 Configurator.getPoperties() 用于简化加载 Properties 文件(在我的情况下是一些加密值的文件)。