我有一个模板(.jrxml)文件。在那里,我有下面的代码片段,我曾经包含一个图像,
<image>
<reportElement mode="Transparent" x="0" y="0" width="280" height="60" backcolor="#FFFFFF" uuid="d312321a854-323232332-223121d12c2d7f"/>
<imageExpression><![CDATA["/home/name/app/test/reportTemplates/images/company_logo.JPG"]]></imageExpression>
</image>
因此,每次更改部署环境时,我都需要更改此/home/name/app/test/reportTemplates/images/company_logo.JPG
路径。
避免这种设计的任何明确方法?
答案 0 :(得分:1)
“正常”的方法是使用包含基本路径的参数
<parameter name="IMAGE_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["/home/name/app/test/reportTemplates/images/"]]></defaultValueExpression>
</parameter>
设置defaultValueExpression
以便您可以在预览(iReport,JasperSoft工作室)和isForPrompting="false"
中使用它,以避免每次预览时都会询问它。
然后在imageExpression
中使用参数作为基本路径
<imageExpression><![CDATA[$P{IMAGE_DIR} + "company_logo.JPG"]]></imageExpression>
何时到填充报告(应用程序运行时),将IMAGE_DIR
参数设置为在参数映射中传递的正确部署路径。
ES。如果您使用的是java GUI ,那么您希望获得安装位置的相对路径
File imageDir = new File("images");
String imageAbsolutePath = imageDir.getAbsolutePath() + File.separator;
ES。如果您有 Web应用程序(jsp / jsf),您希望找到已部署应用程序的WEB-INF路径
ServletContext context = request.getServletContext();
String imageAbsolutePath = context.getRealPath("/WEB-INF/images") + "/";
现在我们有了图像目录的绝对路径,我们将它添加到我们传递给fillManager的参数图中。
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("IMAGE_DIR",imageAbsolutePath);
//..here goes all the other parameter you may set.
然后只需将参数图传递给fillManager ...
注意:这是一个我不知道你如何填写的例子
JasperPrint print = JasperFillManager.fillReport(report, paramMap, connection);