天天看点

iReport4.6+Tomcat+JavaBean数据源报表1

BOOS让用JasperReports做报表,只能老老实实请教度娘了,但是网上资源又多又乱,多是copy的,代码都不知道有没有验证过、、、

自己做了一遍,贴出来供大家学习.

首先要确定你的tomcat、JDK、iReport是配置好的,下面我们开始,我用的事Myeclipse开发网站

一个很常见的例子

一、定义bean

ProductBean.java

package test6;

public class ProductBean
{
    private String productName;

    public String getProductName()
    {
        return productName;
    }

    public void setProductName(String productName)
    {
        this.productName = productName;
    }
}           

二、在iReport中设定数据源及创建报表

1、首先把路径添加上去,就是你编译好的class文件的路径:iReport、工具--选项--路径(classpath)添加我的路径是最下面的那个,就是编译好的class文件路径

iReport4.6+Tomcat+JavaBean数据源报表1

2、在工具栏找到ReportDataSources工具,添加数据源:点击新建、之后选择JavaBeans set datasource

iReport4.6+Tomcat+JavaBean数据源报表1

选中之后会出现如下界面:

iReport4.6+Tomcat+JavaBean数据源报表1

需要填写的包括Name、Factory class和static method,这个地方要注意,如果你已经编写好了数据制造工厂,就是说不基于网络来做,那么

你要填写Factory class这一栏,路径为:package.XXXXX,其中XXXX是你自己创建的工厂类的名字;同时在static method,,里面填写你创建的函数,即返回的list列表。

这种方式,下次有时间我再写出来,今天说基于网络的。

基于网络的那么就不用填写下面两项,只要把名字写一下好了,比如我的是

iReport4.6+Tomcat+JavaBean数据源报表1

新建一个报表,一路next下去创建好之后,在界面上很容易找到添加数据的一个按钮:选择第二个选项,JavaBean Datasource

我新建的包是test6所以输入的classname就是test6.ProductBean

点击右边Read attributes就会出现一个class一个productName,当然,后面就是我们之前新建的一个属性,添加都会的吧

iReport4.6+Tomcat+JavaBean数据源报表1

添加之后在我们的报表左边栏Fields里面看到了,将它拖入到编辑面板,要拖入到Details里面,这个我就不多说了,不懂看文档

之后是这样效果:

iReport4.6+Tomcat+JavaBean数据源报表1

保存编译,之后找到你创建报表的路径,里面会有编译好的文件,我的文件名是repor_tservlet,所以生成两个

iReport4.6+Tomcat+JavaBean数据源报表1

我们这次使用上面那个.jasper文件,当然下面的也是可以使用的,只是代码不同,如果又人需要留言好了,下面将report_servlet.jasper拷贝到你的服务器文件夹下,随便新建个文件夹就行

我新建了一个jasper文件夹,

iReport4.6+Tomcat+JavaBean数据源报表1

下面编写我们的Servlet程序:BeanReportServlet.java

package test6;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
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.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;

public class BeanReportServlet extends HttpServlet
{
    private static final long serialVersionUID = 348226870594216833L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        try
        {
            //生成测试数据
            ArrayList<ProductBean> data = new ArrayList<ProductBean>();
            for(int i = 1; i <= 100; i++)
            {
                ProductBean bean = new ProductBean();
                bean.setProductName("Product " + i);
                data.add(bean);
            }
            JRDataSource dataSource = new JRBeanCollectionDataSource(data);
            
            //获取报表模板文件
            String root_path = this.getServletContext().getRealPath("/");
            root_path = root_path.replaceAll("\\\\", "/");
            String reportFilePath = root_path + "jasper/report_servlet.jasper";
            System.out.println("jasper file is " + reportFilePath);
         //  File   reportFile   =   new   File(reportFilePath); 
            //生成JasperPrint
            JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);
           // JasperReport report = (JasperReport)JRLoader.loadObject(reportFile);
            JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource);

            //设定输出格式
            OutputStream ouputStream = resp.getOutputStream();  
            resp.setContentType("application/pdf");
            resp.setCharacterEncoding("UTF-8");  
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode("PDF报表", "UTF-8") + ".pdf\"");  
                    
            // 使用JRPdfExproter导出器导出pdf  
            JRPdfExporter exporter = new JRPdfExporter();  
            // 设置JasperPrintList  
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);  
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);  
            exporter.exportReport();
            
            ouputStream.close();  
        } catch (Exception e)
        {
            e.printStackTrace();
        }    
    }

}           

这个代码是我从其他网友那边拷贝来的,当然问题很多、不能用,我修改之后的这个应该是没问题的,至少在我的电脑环境下是可以用的。

新建之后要注意一些Jar包的引入,因为我也是初学,所以才用最笨的方法,就是将D:\Program Files\Jaspersoft\iReport-4.6.0\ireport\modules下面的所有的jar包全部放到WEB-INF的lib下面

这样肯定是没什么问题了,把一些必要的jar包引入你的代码

注意:

如果你是从其他地方拷贝来的代码,注意以下几点

root_path = root_path.replaceAll("\\\\", "/");           

很多博客写的不规范,就是不能用,上面这种写法是正确的一种,给个参考:http://www.blogjava.net/hefang/articles/324456.html

JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);           

这一行可能会报错,说loadObject什么已经过期,我郁闷了好久,最后是把所有的jar包拷贝到WEB-INF的lib下面解决的,具体还有待研究

String root_path = this.getServletContext().getRealPath("/");
            root_path = root_path.replaceAll("\\\\", "/");
            String reportFilePath = root_path + "jasper/report_servlet.jasper";           

注意路径修改成你的路径

上面做好之后,记得在web.xml里面配置

<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<servlet>
  <servlet-name>report</servlet-name>
  <servlet-class>test6.BeanReportServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>report</servlet-name>
  <url-pattern>/report</url-pattern>
  </servlet-mapping>
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
           

基本上是没什么问题了吧,如果我还没有遗漏的话、、、

运行Tomcat在浏览器里面输入:http://localhost:8080/Jb_test6/report

report是在xml里面的映射名,不用解释吧

<img src="https://img-blog.csdn.net/20140829132926115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" height="452" width="666" alt="" />
看到最下面的提示了吧,那说明我们的运行成功了,点击打开
看到我们生成的100个产品了吧
<img src="https://img-blog.csdn.net/20140829133041104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
好的,GameOver如果有哪位还有问题可以留言,
需要原代码的也留言
           

第一次认真的写博客,蛋蛋的忧伤