您的位置:首页 > 编程语言 > ASP

开发者使用JasperReport——不同数据源之实体对象数据源

2013-04-24 20:20 447 查看
前言
上一篇我们使用了JRMapArrayDataSource数据源来与数据库进行交互,今天我们来介绍下如何使用实体对象作为数据源。
 
正题
跟之前的一样,我们要生成报表需要以下几个步骤:
1.引入jar包,请看《静态文本报表


2.新建报表模版:
跟我们前一篇的AircraftReport报表模版是一样的,请参见《不同数据源之Map数据源》;
 
3.编译报表模版,请看《静态文本报表》。

4.编写实体对象:
作为数据源的实体对象需要注意:

1)不能有公共的属性。

2)必须有一个无参数的构造方法。

3)所有的属性必须要有getter和stter方法。
 
我们新建一个AircraftData(因为报表模版中的字段是大写的,所以这里面的字段也定义的大写的):
package com.dan.jasper;

public class AircraftData {

public AircraftData(String id,String name,String sex){
setID(id);
setNAME(name);
setSEX(sex);
}

public AircraftData(){

}

private String ID;
private String NAME;
private String SEX;
public String getID() {
return ID;
}

public void setID(String iD) {
ID = iD;
}

public String getNAME() {
return NAME;
}

public void setNAME(String nAME) {
NAME = nAME;
}

public String getSEX() {
return SEX;
}

public void setSEX(String sEX) {
SEX = sEX;
}

}

 
5.编写servlet:
由于实体对象数据源分为两种JRBeanArrayDataSource和JRBeanCollectionDataSource,下面将这两种形式都写出来:
1)JRBeanArrayDataSource:
package com.dan.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;

import com.dan.jasper.AircraftData;

/**
* 使用javabean作为数据源
* @author zdd
*
*/
public class BeanArrayDSReportServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 2174316885912562306L;

private JRDataSource createReportDataSource(){
JRBeanArrayDataSource dataSource;
AircraftData[] resportRows = initializeMapArray();
dataSource = new JRBeanArrayDataSource(resportRows);
return dataSource;
}

private AircraftData[] initializeMapArray(){
AircraftData[] reportRows = new AircraftData[4];

reportRows[0] = new AircraftData("n0", "zddn0", "female");
reportRows[1] = new AircraftData("n1", "zddn1", "female");
reportRows[2] = new AircraftData("n2", "zddn2", "female");
reportRows[3] = new AircraftData("n3", "zddn3", "female");

return reportRows;
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

ServletOutputStream servletOutputStream = resp.getOutputStream();

InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftReport.jasper");

try{
JRDataSource dataSource = createReportDataSource();

JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream,new HashMap(),dataSource );

resp.setContentType("application/pdf");
servletOutputStream.flush();
servletOutputStream.close();
}catch(Exception e){
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
resp.setContentType("text/plain");
resp.getOutputStream().print(stringWriter.toString());
}
}

}



 
2)JRBeanCollectionDataSource:
package com.dan.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import com.dan.jasper.AircraftData;

/**
* 使用javabean作为数据源
* @author zdd
*
*/
public class BeanCollectionDSReportServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 2174316885912562306L;

private JRDataSource createReportDataSource(){
JRBeanCollectionDataSource dataSource;
Collection resportRows = initializeMapArray();
dataSource = new JRBeanCollectionDataSource(resportRows);
return dataSource;
}

private Collection initializeMapArray(){
ArrayList reportRows = new ArrayList();

reportRows.add(new AircraftData("n0", "zddn0", "female"));
reportRows.add(new AircraftData("n1", "zddn1", "female"));
reportRows.add(new AircraftData("n2", "zddn2", "female"));
reportRows.add(new AircraftData("n3", "zddn3", "female"));

return reportRows;
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

ServletOutputStream servletOutputStream = resp.getOutputStream();

InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/WEB-INF/classes/reports/AircraftReport.jasper");

try{
JRDataSource dataSource = createReportDataSource();

JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream,new HashMap(),dataSource );

resp.setContentType("application/pdf");
servletOutputStream.flush();
servletOutputStream.close();
}catch(Exception e){
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
resp.setContentType("text/plain");
resp.getOutputStream().print(stringWriter.toString());
}
}

}

 
 
5.配置web.xml,就是配置servlet
 
6.运行项目
看一下我的运行结果:
1)JRBeanArrayDataSource:



 
2)JRBeanCollectionDataSource
 



小结:
 
    其实这个实体对象作为数据源对于我们来说是很常用的,因为我们现在都是使用的hibernate,所以我们都会避免在其他地方直接与数据库进行交互,而这个对于实体对象数据源的支持满足了我们的要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: