zoukankan      html  css  js  c++  java
  • 开发者使用JasperReport——不同数据源之实体对象数据源

     

    前言

    上一篇我们使用了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,所以我们都会避免在其他地方直接与数据库进行交互,而这个对于实体对象数据源的支持满足了我们的要求。

  • 相关阅读:
    Qt助手---摘录
    Qt随记
    前端编码规范之CSS(转)
    给QT新手的练手项目——基于QT的GIF播放器(转)
    Qt收藏
    C++开发者都应该使用的10个C++11特性(转)
    为学Linux,我看了这些书(转)
    Qt去掉view项的焦点虚线框的方法(转)
    QTableWidget详解(样式、右键菜单、表头塌陷、多选等)(转)
    JZOJ 3085. 图的计数
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3041053.html
Copyright © 2011-2022 走看看