2

我正在为struts2 使用jasperreports-plugin。

我已经使用 iReport 创建了一些报告。当我以 HTML 以外的任何格式导出报告时,报告会正确生成。但是当我尝试以 HTML 格式导出它时,浏览器找不到任何图像。

对于没有图表的报告,这不是一个大问题,其中缺少“px”图像。由于它是静态图像,因此不是什么大问题,我找到了一个快速的解决方法,也许稍后我会尝试强制导出参数不使用图像来填充空间。

我真正的问题是当我尝试生成包含图表的报告时。浏览器找不到任何生成的图像。

我想知道出了什么问题,或者至少想知道生成的图像是否以及存储在临时文件夹中的位置。

这是我的 struts.xml 中的动作定义:

<package name="jasperreport" namespace="/reports" extends="jasperreports-default">
      <action name="myJasperTest" class="[...]JasperReportAction" method="getTestReport">
          <result name="success" type="jasper" >
             <param name="location">/WEB-INF/jasper/${outFile}</param>
             <param name="connection">sqlConnection</param> 
             <param name="reportParameters">reportParams</param>
            <param name="format">${format}</param>
        </result>
      </action>
</package>

还有我的动作 JasperReportAction.java:

public class JasperReportAction extends ActionSupport {
    //various initialization..getter, setters..

    public String getTestReport() {
        try {
            JasperCompileManager.compileReportToFile(sourceFile, outFile);

             //test to see a generated file
            JasperReport report = JasperCompileManager.compileReport(sourceFile);
            JasperPrint print = JasperFillManager.fillReport(report, new HashMap<String, Object>(), sqlConnection);
            JasperExportManager.exportReportToHtmlFile(print, "/home/user/output.html");
         } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
         }
        return SUCCESS;
    }
}

我还在我的 struts.xml 中添加了一个操作,以避免在生成的报告请求像“/images/px”这样的图像的 url 时没有找到操作异常:

<package name="px" namespace="/images" extends="struts-default">   
    <action name="*">   
        <result>/images/{1}</result>   
    </action>   
</package>  

至少有了这个我得到一个“404 - 未找到”而不是一个动作未找到异常。JasperReportAction 类中的最后一行代码创建了一个 HTML 文件,其中包含与生成的图表相关联的文件夹,并且所有内容都按应有的方式显示。

我希望有人能告诉我在哪里可以找到生成的图表,或者我是否可以为它们指定名称。任何帮助,将不胜感激 :)

提前致谢

4

1 回答 1

2

我终于解决了我的问题,混合了我在网上找到的各种信息,并特别了解如何更好地配置 struts2。

Jasper Reports 使用一个名为 ImageServlet 的 servlet 来处理图像,所以我需要做的是:

  1. 在 Tomcat 中注册 Jasper Reports ImageServlet
  2. 将 Struts 配置为不将对 ImageServlet 的请求映射到操作中
  3. 修改struts.xml中的action,使其使用ImageServlet

注册 ImageServlet (在 Tomcat 的 web.xml 中)

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/servlets/image</url-pattern>
</servlet-mapping>

配置 Struts(在 struts.xml 中)

<constant name="struts.action.excludePattern" value="/servlets/image*" />

修改动作(在 struts.xml 中)

<package name="jasperreport" namespace="/reports" extends="jasperreports-default">
  <action name="myJasperTest" class="[...]JasperReportAction" method="getTestReport">
      <result name="success" type="jasper" >
         <param name="location">/WEB-INF/jasper/${outFile}</param>
         <param name="connection">sqlConnection</param> 
         <param name="reportParameters">reportParams</param>
        <param name="format">${format}</param>

        <param name="imageServletUrl">/servlets/image?image=</param>
    </result>
  </action>
</package>

我最初添加的 struts.xml 中不需要包“px”。

于 2013-06-26T14:39:20.753 回答