我正试图通过开始&结束日期作为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>
答案 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。
其他一些一般性说明(即使你说它没有参数):
通常需要注册驱动程序......
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
在查询
response.setContentType( “应用/ PDF”);在您将报告推送到流
可选,请使用try,catch,finally {//关闭连接..}
答案 1 :(得分:0)
我会说在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连接但不要使用它。