zoukankan      html  css  js  c++  java
  • 开发者使用JasperReport——通过数据源生成报表

    前言

    前两篇都是介绍了如何查询数据库,但是都是通过报表模版跟数据库进行交互的,也就是说我们的查询语句和参数的定义都写死在模版里面了,所以有时候会不太方便,所以今天就来跟大家介绍下通过Servlet与数据库进行交互,模板只负责显示。


    正题

    跟之前的一样,我们要生成报表需要以下几个步骤:

    1.引入jar包,请看《静态文本报表》 。


    2.新建报表模版:

    由于我们这次是通过Servlet来与数据库交互,所以我们的报表报表里面没有了查询语句:


    <?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="JRResultReport">

     

    <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与数据库进行交互的(JRResultSetDataSource数据源),所以在servlet中建立与数据库的连接和查询语句:

    packagecom.dan.servlet;

     

    importjava.io.IOException;

    importjava.io.InputStream;

    importjava.io.PrintWriter;

    importjava.io.StringWriter;

    importjava.sql.Connection;

    importjava.sql.DriverManager;

    importjava.sql.ResultSet;

    importjava.sql.Statement;

    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.JRResultSetDataSource;

    importnet.sf.jasperreports.engine.JasperRunManager;

     

    /**

     * 使用JRResultSetDataSource填充

     * @author zdd

     *

     */

    publicclass DbReportDSServlet extends HttpServlet {

     

    @Override

    protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp)

    throwsServletException, IOException {

    Connectionconnection;

    Statementstatement;

    ResultSetresultSet;

     

    resp.setContentType("application/pdf");

     

    ServletOutputStreamservletOutputStream = resp.getOutputStream();

     

    InputStreamreportStream =getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/JRResultReport.jasper");

     

    Stringquery = "SELECT T.ID,T.NAME,T.SEX FROM T_USER T";

     

    try{

    Class.forName("oracle.jdbc.driver.OracleDriver");

    connection=DriverManager.getConnection("jdbc:oracle:thin:@192.168.24.36:1521:testreport","test","test");

    statement= connection.createStatement();

    resultSet= statement.executeQuery(query);

     

    JRResultSetDataSourceresultSetDataSource = new JRResultSetDataSource(resultSet);

    JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream,newHashMap(),resultSetDataSource );

     

    resultSet.close();

    statement.close();

    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.运行项目

    看一下我的运行结果:

     

     

    小结:

    其实这么多的实例都很简单,每个实例间的不同点就在于使用的方式不同,其他基本都是类似的。

  • 相关阅读:
    [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
    便利店选址
    spoj 1811 Longest Common Substring (后缀自动机)
    sharepoint 2013 根据网站模版创建网站,并赋值网站权限 create a site by custom site template
    一则 ORA-00471 处理方法
    好端端的项目重新运行的时候却不行了!!!
    C语言指针和数组知识总结(下)
    Java EE登陆界面生成随机数防止恶意注册或者登录
    ASP.NET获取上传图片的大小
    Not able to reset SmartRF04DD
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2992033.html
Copyright © 2011-2022 走看看