gpt4 book ai didi

java - 如何使用 servlet 将日期作为 jasper 报告中的参数传递

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:53 25 4
gpt4 key购买 nike

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

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

最佳答案

编辑: 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:使用查询替换和未准备的语句:

更改 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 - 如何使用 servlet 将日期作为 jasper 报告中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33525092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com