前言
上一篇我們介紹了如何使用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,從最初的生成報表,到后面的與數據庫交互,之后還會介紹不同形式的數據源生成報表。