Search code examples
javaservletsjasper-reports

How to pass Date as parameter in jasper report using servlets


I am trying to pass start & end date as parameter to jasper report but it is not working properly. I am getting a blank PDF. When I hardcode start & end date in the SQL query itself, I am getting right output in PDF.

Using Mysql, eclipse luna, jre1.7, jaspersoft plugin & all required jars are in Lib folder.

My Servlet code -

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 report 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>

Solution

    1. Make sure you have properly designed your report.
    2. It is working fine with iReport 5.6.0. It may be a bug in Jaspersoft Studio V6.0

    I will say make that report in iReport & check whether the issue still persists.

    EDIT - Things to remember

    public Timestamp(int year, int month, int date, int hour, int minute, int second, int nano)

    Deprecated. instead use the constructor Timestamp(long millis)