JasperReport学习笔记4-查询数据库生成动态的报表(WEB)

分两种方法
第一种
1.模版

Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"

  3. "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

  4. <jasperReportname="DBReport">

  5. <parametername="hp"class="java.lang.Integer"></parameter>

  6. <queryString>

  7. <![CDATA[

  8. select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs on(tb.id = tbs.tbid) where tb.id > $P{hp}

  9. ]]>

  10. </queryString>

  11. <fieldname="marks"class="java.lang.Integer"></field>

  12. <fieldname="name"class="java.lang.String"></field>

  13. <fieldname="age"class="java.lang.Integer"></field>

  14. <pageHeader>

  15. <bandheight="30">

  16. <staticText>

  17. <reportElementx="0"y="0"width="69"height="24"/>

  18. <text><![CDATA[marks:]]></text>

  19. </staticText>

  20. <staticText>

  21. <reportElementx="140"y="0"width="79"height="24"/>

  22. <text><![CDATA[name:]]></text>

  23. </staticText>

  24. <staticText>

  25. <reportElementx="280"y="0"width="69"height="24"/>

  26. <text><![CDATA[age:]]></text>

  27. </staticText>

  28. <staticText>

  29. <reportElementx="420"y="0"width="69"height="24"/>

  30. <text><![CDATA[you don't see this]]></text>

  31. </staticText>

  32. </band>

  33. </pageHeader>

  34. <detail>

  35. <bandheight="30">

  36. <textField>

  37. <reportElementx="0"y="0"width="69"height="24"/>

  38. <textFieldExpressionclass="java.lang.Integer">

  39. <![CDATA[$F{marks}]]>

  40. </textFieldExpression>

  41. </textField>

  42. <textField>

  43. <reportElementx="140"y="0"width="69"height="24"/>

  44. <textFieldExpressionclass="java.lang.String">

  45. <![CDATA[$F{name}]]>

  46. </textFieldExpression>

  47. </textField>

  48. <textField>

  49. <reportElementx="280"y="0"width="69"height="24"/>

  50. <textFieldExpressionclass="java.lang.Integer">

  51. <![CDATA[$F{age}]]>

  52. </textFieldExpression>

  53. </textField>

  54. <staticText>

  55. <reportElementx="420"y="0"width="69"height="24"/>

  56. <text><![CDATA[If you don't see this, it didn't work]]></text>

  57. </staticText>

  58. </band>

  59. </detail>

  60. </jasperReport>


2.把上面的JRXML文件生成JASPER文件,方便在WEB里面的调用(可以用下面的方法先生成好,放到你知道的文件夹下面)
Java代码 收藏代码
  1. JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQL.xml","WebRoot\\report\\JasperReportSQL.jasper");


3.写Servlet调用
Java代码 收藏代码
  1. import java.io.IOException;

  2. import java.io.InputStream;

  3. import java.sql.Connection;

  4. import java.sql.DriverManager;

  5. import java.sql.SQLException;

  6. import java.util.HashMap;

  7. import javax.servlet.ServletException;

  8. import javax.servlet.ServletOutputStream;

  9. import javax.servlet.http.HttpServlet;

  10. import javax.servlet.http.HttpServletRequest;

  11. import javax.servlet.http.HttpServletResponse;

  12. import net.sf.jasperreports.engine.JRException;

  13. import net.sf.jasperreports.engine.JasperRunManager;

  14. publicclass DynamicCreateReportWithServlet extends HttpServlet {

  15. privatestaticfinallong serialVersionUID = 1L;

  16. publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

  17. throws ServletException, IOException {

  18. Connection connection = null;

  19. //获得输出流

  20. ServletOutputStream servletOutputStream = response.getOutputStream();

  21. //获得JASPER文件的输入流,一定要知道你的文件的地方

  22. InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQL.jasper");

  23. //生成Map对象传数据

  24. HashMap hm = new HashMap();

  25. hm.put("hp", new Integer(3));

  26. try {

  27. //连结JDBC

  28. Class.forName("com.mysql.jdbc.Driver");

  29. connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");

  30. //生成相于的PDF输入流,这个JasperRunManager对象还有很多种方法的,这只是一种

  31. JasperRunManager.runReportToPdfStream(is,servletOutputStream,hm, connection);

  32. //设置格式

  33. response.setContentType("application/pdf");

  34. servletOutputStream.flush();

  35. servletOutputStream.close();

  36. connection.close();

  37. } catch (ClassNotFoundException e) {

  38. e.printStackTrace();

  39. } catch (SQLException e) {

  40. e.printStackTrace();

  41. } catch (JRException e) {

  42. e.printStackTrace();

  43. }

  44. }

  45. publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

  46. throws ServletException, IOException {

  47. this.doGet(request, response);

  48. }

  49. }



第二种方法
1.这种方法JRXML文件里面不用写SQL
Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"

  3. "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

  4. <jasperReportname="DBReport">

  5. <fieldname="id"class="java.lang.Integer"></field>

  6. <fieldname="name"class="java.lang.String"></field>

  7. <fieldname="marks"class="java.lang.Integer"></field>

  8. <pageHeader>

  9. <bandheight="30">

  10. <staticText>

  11. <reportElementx="0"y="0"width="69"height="24"/>

  12. <text><![CDATA[id:]]></text>

  13. </staticText>

  14. <staticText>

  15. <reportElementx="140"y="0"width="79"height="24"/>

  16. <text><![CDATA[name:]]></text>

  17. </staticText>

  18. <staticText>

  19. <reportElementx="280"y="0"width="69"height="24"/>

  20. <text><![CDATA[marks:]]></text>

  21. </staticText>

  22. <staticText>

  23. <reportElementx="420"y="0"width="69"height="24"/>

  24. <text><![CDATA[you don't see this]]></text>

  25. </staticText>

  26. </band>

  27. </pageHeader>

  28. <detail>

  29. <bandheight="30">

  30. <textField>

  31. <reportElementx="0"y="0"width="69"height="24"/>

  32. <textFieldExpressionclass="java.lang.Integer">

  33. <![CDATA[$F{id}]]>

  34. </textFieldExpression>

  35. </textField>

  36. <textField>

  37. <reportElementx="140"y="0"width="69"height="24"/>

  38. <textFieldExpressionclass="java.lang.String">

  39. <![CDATA[$F{name}]]>

  40. </textFieldExpression>

  41. </textField>

  42. <textField>

  43. <reportElementx="280"y="0"width="69"height="24"/>

  44. <textFieldExpressionclass="java.lang.Integer">

  45. <![CDATA[$F{marks}]]>

  46. </textFieldExpression>

  47. </textField>

  48. <staticText>

  49. <reportElementx="420"y="0"width="69"height="24"/>

  50. <text><![CDATA[If you don't see this, it didn't work]]></text>

  51. </staticText>

  52. </band>

  53. </detail>

  54. </jasperReport>


2.同样是用下面的方法生成JASPER文件
Java代码 收藏代码
  1. JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQLResult.xml","WebRoot\\report\\JasperReportSQLResult.jasper");


3.写出Servlet
Java代码 收藏代码
  1. import java.io.IOException;

  2. import java.io.InputStream;

  3. import java.sql.Connection;

  4. import java.sql.DriverManager;

  5. import java.sql.ResultSet;

  6. import java.sql.SQLException;

  7. import java.sql.Statement;

  8. import java.util.HashMap;

  9. import javax.servlet.ServletException;

  10. import javax.servlet.ServletOutputStream;

  11. import javax.servlet.http.HttpServlet;

  12. import javax.servlet.http.HttpServletRequest;

  13. import javax.servlet.http.HttpServletResponse;

  14. import net.sf.jasperreports.engine.JRException;

  15. import net.sf.jasperreports.engine.JRResultSetDataSource;

  16. import net.sf.jasperreports.engine.JasperRunManager;

  17. publicclass DynamicCreateReportWithServletDateSource extends HttpServlet {

  18. privatestaticfinallong serialVersionUID = 1L;

  19. publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

  20. throws ServletException, IOException {

  21. Connection connection = null;

  22. Statement statument = null;

  23. ResultSet resultSet = null;

  24. String sql = "select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs";

  25. ServletOutputStream servletOutputStream = response.getOutputStream();

  26. InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQLResult.jasper");

  27. try {

  28. Class.forName("com.mysql.jdbc.Driver");

  29. connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");

  30. statument = connection.createStatement();

  31. resultSet = statument.executeQuery(sql);

  32. //这里把ResultSet封装到JRResultSetDataSource对象里面了

  33. JasperRunManager.runReportToPdfStream(is,servletOutputStream,new HashMap(), new JRResultSetDataSource(resultSet));

  34. response.setContentType("application/pdf");

  35. servletOutputStream.flush();

  36. servletOutputStream.close();

  37. connection.close();

  38. } catch (ClassNotFoundException e) {

  39. e.printStackTrace();

  40. } catch (SQLException e) {

  41. e.printStackTrace();

  42. } catch (JRException e) {

  43. e.printStackTrace();

  44. }

  45. }

  46. publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

  47. throws ServletException, IOException {

  48. this.doGet(request, response);

  49. }

  50. }



注意:JRXML文件里面数据库的字段都是用$F{marks},而parameter是用$P{xxxx}表示的

,而parameter的值都是传过去的那个HashMap里面设置的


你可能感兴趣的:(jasperReport,动态报表,查询数据库)