如何使用servlet将Date作为参数传递给jasper报告

时间:2015-11-04 15:01:30

标签: java servlets jasper-reports

我正试图通过开始&结束日期作为jasper报告的参数,但它无法正常工作。我得到一个空白的PDF。当我硬编码开始& SQL查询本身的结束日期,我在PDF中得到了正确的输出。

使用Mysql,eclipse luna,jre1.7,jaspersoft plugin&所有必需的罐子都在Lib文件夹中。

我的Servlet代码 -

try {
    Class.forName("com.mysql.jdbc.Driver");
    connection = DriverManager.getConnection ("jdbc:mysql://localhost:3306/db", "root", "password");
    ServletOutputStream servletOutputStream =response.getOutputStream();
    InputStream reportStream =getServletConfig().getServletContext().getResourceAsStream("Blank_A4_Table_Based.jasper");
    SimpleDateFormat eformat = new SimpleDateFormat("yyyy-MM-dd");
    Date sDate = eformat.parse("2015-08-25");
    String sdate=eformat.format(sDate );
    System.out.println(sdate);
    Date eDate = eformat.parse("2015-08-26");
    String edate=eformat.format(eDate );
    System.out.println(edate);
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("sdate",sDate);
    parameters.put("edate",eDate);
    JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameters, connection);
    connection.close();
    response.setContentType("application/pdf");
    servletOutputStream.flush();
    servletOutputStream.close();
} catch (Exception e) {
    // display stack trace in the browser
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);
    e.printStackTrace(printWriter);
    response.setContentType("text/plain");
    response.getOutputStream().print(stringWriter.toString());
}

Jasper报告JRXML -

<parameter name="sdate" class="java.util.Date">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<parameter name="edate" class="java.util.Date">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>                               
<queryString>                                               
    <![CDATA[SELECT id, session_reason FROM session_details WHERE created BETWEEN $P{sdate} AND $P{edate})]]>
</queryString>

3 个答案:

答案 0 :(得分:1)

编辑: OP在orign中更改了一个问题,即将String传递给jasper,现在是一个日期..

您在查询中使用$ P,因此jasper报告尝试会生成插入变量的准备好的语句。

解决方案1 ​​:将参数更改为正确的对象(java.sql.Timestamp

<parameter name="sdate" class="java.sql.Timestamp">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>

并传递java.sql.Timestamp对象

 parameters.put("sdate",new java.sql.Timestamp(sDate.getTime()); 

解决方案2 :使用查询替换而非准备好的statmentet:

更改你的jrxml:

<queryString>                                               
<![CDATA[SELECT id, session_reason FROM session_details WHERE created BETWEEN '$P!{sdate}' AND '$!P{edate}']]>
</queryString>

String

作为参数传递
parameters.put("sdate",sdate); //The string

并将jrxml参数设置为String

 <parameter name="sdate" class="java.lang.String">
    <defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>

此代码的关键是$ P!{}请参阅,基本上是字符串替换,所以我还添加了日期限定符'',因为你使用的是mysql。

其他一些一般性说明(即使你说它没有参数):

  1. 通常需要注册驱动程序......

    Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
    DriverManager.registerDriver(driver);
    
  2. 在查询

  3. 中似乎有a)
  4. response.setContentType( “应用/ PDF”);在您将报告推送到流

  5. 之前
  6. 可选,请使用try,catch,finally {//关闭连接..}

答案 1 :(得分:0)

  1. 确保您已妥善设计报告。
  2. iReport 5.6.0正常运行。它可能是Jaspersoft Studio V6.0中的错误
  3. 我会说在iReport&amp; amp;检查问题是否仍然存在。

    编辑 - 要记住的事项

      

    公共时间戳(int year,                               int月,                               日期,                               小时,                               int分钟,                               第二,                               int nano)

    <强> 已过时。而是使用构造函数Timestamp(long millis)

答案 2 :(得分:-1)

试试这个。它对我有用。

 try {
        InputStream is = getClass().getClassLoader().getResourceAsStream("path to jasper file");
        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
        Map<String, Object> parameters = new HashMap<>();
        // set your parameters
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
        response.setContentType("application/pdf");
        // For the "Save As" dialogue
        response.setHeader("Content-disposition", "yours PDF file name");
        OutputStream output = response.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, output);
        output.close();
    } catch (IOException | JRException e) {
        throw new RuntimeException("This should have never happened");
    }

我建议您将日期作为格式化字符串值传递,并将JR参数更改为String。

另外我不明白为什么要创建jdbc连接但不要使用它。