现在的位置: 首页 > 综合 > 正文

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

2012年11月19日 ⁄ 综合 ⁄ 共 5122字 ⁄ 字号 评论关闭

 

前言

上一篇我们使用了JRMapArrayDataSource数据源来与数据库进行交互,今天我们来介绍下如何使用实体对象作为数据源。

 

正题

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

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


2.新建报表模版:

跟我们前一篇的AircraftReport报表模版是一样的,请参见《不同数据源之Map数据源》;

 

3.编译报表模版,请看《静态文本报表》


4.编写实体对象:

作为数据源的实体对象需要注意:


1)不能有公共的属性。


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


3)所有的属性必须要有getterstter方法。

 

我们新建一个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,下面将这两种形式都写出来:

1JRBeanArrayDataSource:

 

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());
		}
	}


}

 


 

 

2JRBeanCollectionDataSource:

 

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

看一下我的运行结果:

1JRBeanArrayDataSource


 

2JRBeanCollectionDataSource

 

小结:

 

    其实这个实体对象作为数据源对于我们来说是很常用的,因为我们现在都是使用的hibernate,所以我们都会避免在其他地方直接与数据库进行交互,而这个对于实体对象数据源的支持满足了我们的要求。

抱歉!评论已关闭.