前言
上一篇我们介绍了如何使用JasperReport来生成查询数据库的报表,今天我们在其基础上再稍进一步,那就是如何带参数查询数据库。
正题
跟上一篇一样,我们要生成报表需要以下几个步骤:
1.引入jar包,请看《静态文本报表》 。
2.新建报表模版:
由于我们这次需要带参数查询数据库(查询的是T_USER数据表),所以报表模版需要更改一下,其实只更改了一下查询语句,其他的跟上一篇中相同(我们用$P{}来标识参数,$F{}来标识字段):
<?xmlversion="1.0" encoding="UTF-8"?>
<jasperReportxmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreportshttp://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="ParameterReport">
<parametername="nm" class="java.lang.String"/>
<queryString>
<![CDATA[SELECT * FROM T_USER T WHERE T.NAME=$P{nm}]]>
</queryString>
<fieldname="ID" class="java.lang.Integer"/>
<fieldname="NAME" class="java.lang.String"/>
<fieldname="SEX" class="java.lang.String"/>
<pageHeader>
<bandheight="30">
<staticText>
<reportElementx="0" y="0" width="69" height="24"/>
<textElementverticalAlignment="Bottom"/>
<text>Id</text>
</staticText>
<staticText>
<reportElementx="140" y="0" width="79" height="24"/>
<text>Name</text>
</staticText>
<staticText>
<reportElementx="280" y="0" width="69" height="24"/>
<text>Sex</text>
</staticText>
</band>
</pageHeader>
<detail>
<bandheight="30">
<textField>
<reportElementx="0" y="0" width="69" height="24"/>
<textFieldExpressionclass="java.lang.Integer">
$F{ID}
</textFieldExpression>
</textField>
<textField>
<reportElementx="140" y="0" width="69" height="24"/>
<textFieldExpressionclass="java.lang.String">
$F{NAME}
</textFieldExpression>
</textField>
<textField>
<reportElementx="280" y="0" width="69" height="24"/>
<textFieldExpressionclass="java.lang.String">
$F{SEX}
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
3.编译报表模版,请看《静态文本报表》。
4.编写servlet:
由于我们需要传参数,所以我们需要在servlet中建立于数据库的连接并给报表模版传参数:
packagecom.dan.servlet;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.PrintWriter;
importjava.io.StringWriter;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.util.HashMap;
importjavax.servlet.ServletException;
importjavax.servlet.ServletOutputStream;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importnet.sf.jasperreports.engine.JasperRunManager;
/**
* 根据参数查询数据库
* @author zdd
*
*/
publicclass DbReportParamServlet extends HttpServlet {
@Override
protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp)
throwsServletException, IOException {
Connectionconnection;
resp.setContentType("application/pdf");
ServletOutputStreamservletOutputStream = resp.getOutputStream();
InputStreamreportStream =getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/ParameterReport.jasper");
HashMap parameterMap = new HashMap();
parameterMap.put("nm", new String("name1"));
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
connection=DriverManager.getConnection("jdbc:oracle:thin:@192.168.24.36:1521:testreport","test","test");
JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream,parameterMap,connection);
connection.close();
servletOutputStream.flush();
servletOutputStream.close();
}catch(Exceptione){
StringWriterstringWriter = new StringWriter();
PrintWriterprintWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
resp.setContentType("text/plain");
resp.getOutputStream().print(stringWriter.toString());
}
}
}
5.配置web.xml,就是配置servlet。
6.运行项目
看一下我的运行结果:
小结:
在我写的《开发者使用JasperReport》系列中,我会给大家介绍如何简单的使用JasperReport,从最初的生成报表,到后面的与数据库交互,之后还会介绍不同形式的数据源生成报表。