【问题标题】:How to pass Date as parameter in jasper report using servlets如何使用 servlet 在 jasper 报告中将日期作为参数传递
【发布时间】:2016-07-03 05:35:26
【问题描述】:

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

使用 Mysql、eclipse luna、jre1.7、jaspersoft 插件 & 所有需要的 jars 都在 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>

【问题讨论】:

    标签: java servlets jasper-reports


    【解决方案1】:

    编辑: OP 改变了 orign 中的问题,将一个字符串传递给 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. response.setContentType("application/pdf");在您将报告推送到流媒体之前

    4. 可选,使用try,catch,finally {//关闭连接..}

    【讨论】:

    • 我已经尝试过使用 java.util.Date、java.sql.Date 但它不起作用。
    • 解决方案 2 也不起作用。我仍然得到一个空白 PDF。
    • 你的sql没有参数怎么样,现在在我的eclipse中测试... 5 s
    • 没有参数的 sql 工作正常。返回所有值。
    • 给我看没有值的 sql,我已经尝试过 mysql 和 java.sql.Timestamp 并且它有效,请参阅答案编辑
    【解决方案2】:
    1. 确保您的报告设计正确。
    2. 在 iReport 5.6.0 上运行良好。这可能是 Jaspersoft Studio V6.0 中的一个错误

    我会说在 iReport 中进行报告并检查问题是否仍然存在。

    编辑 - 要记住的事情

    公共时间戳(int year, 国际月份, 整数日期, 小时, 整分钟, 秒, 诠释纳米)

    已弃用。而是使用构造函数 Timestamp(long millis)

    【讨论】:

      【解决方案3】:

      试试这个。它对我有用。

       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 参数更改为字符串。

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

      【讨论】:

      • 说真的老兄!没有 jdbc 连接,我将从哪里获取数据? JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, 参数, 连接);请尝试理解我正在使用连接!
      • 我只是想告诉你,从 db 中获取数据,将它们放入 Map 然后发送到 Jasper 是一种很好的做法。在这种情况下 JasperExportManager.exportReportToPdfStream(JasperPrint jasperPrint, OutputStream outputStream) 可以解决问题,因为不需要 jdbc 连接。
      • 从数据库中获取数据并将它们放入映射中......嗯,这是参数映射而不是数据源......我想这个技巧有点棘手......,如果你填写一个JRDataSource 好的...但是我上次检查的传递连接在 jasper 报告中有效
      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多