struts2-jasperreports-plugin图表图片丢失

时间:2013-06-19 15:24:01

标签: java html struts2 charts jasper-reports

我正在使用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 - not found”而不是一个未找到的动作异常。 JasperReportAction类中的最后一个代码行创建一个HTML文件,其中包含一个与生成的图表相关联的文件夹,并且所有文件都按原样显示。

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

提前致谢

1 个答案:

答案 0 :(得分:2)

我终于解决了我的问题,混合了我在网上发现的各种信息,特别是了解如何配置struts2。

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

  1. 在Tomcat中注册Jasper Reports ImageServlet
  2. 将Struts配置为不将对ImageServlet的请求映射到操作
  3. 修改struts.xml中的操作以使其使用ImageServlet
  4. 注册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”。

相关问题