javaweb+jasperreports报表+struts2

本文将详细介绍javaweb中采用struts2框架的jasperreports报表开发方法,数据源选取的是connection。模板选取的是编译后的模板(jasper格式文件)。

网上很多教程采用了jasperreports-3.x.x的api ,本文采用jarjasperreports-5.6.0.jar的api,两个版本的区别还是很大的,3.x.x版本的很多方法已经过时废弃了。

建议统一采用jarjasperreports-5.6.0.jar版本,因为生成报表的这些工具目前都有,jar包也齐全。3.x.x版的开发工具有,但是配套的jar包只能一个一个找了,另外很多方法已经过时了。

jasperreports的数据源可以有多种,list,JavaBean,connection等,为了不跟后台service层和dao层等关联起来,我们采用connection作为数据源。(因为后台如果用到了hibernate等框架,list,JavaBean等获取数据源就要做大量工作:写JavaBean,写映射文件等;采用connection数据源的话我们可以把sql语句写在模板中,在action中只是传map格式的参数和connection连接就可以了)

action中需要的HttpServletResponse对象和ServletContext对象可以通过实现ServletResponseAware和ServletContextAware接口来得到。更多方法可以参照此链接

jasperreports类里面的路径处理很纠结,为了方便期间统一使用servletContext的getRealPath方法来处理。

选择编译后的模版,可以减轻服务器负载,另外在action中编译的话,很容易因为编译器版本和产生报表工具版本不一致导致编译期间出错。jdt-compiler-3.1.1.jar和jasperreports-5.6.0.jar是匹配的。另外jaspersoft和ireport里面可以很方便的编译。(下面的实例代码pdf方法中中包含了编译)

相关代码、工具、参考文档、源码等下载链接

一、利用struts2,action中不配置result,当然action中对应方法就不用返回值了,利用JRExporter对象的exportReport()输出到浏览器端。

1.开发jrxml格式的报表文件,可以用jaspersoft-studio或者ireport开发。将其放入我们web项目的WebRoot目录下。

2.将jrxml格式的文件编译为jasper格式的文件。

3.给jasper格式的文件填充数据并生成jrprint格式文件或流(不可以生成别的文件格式,jrprint格式的文件可以序列化)。比如:使用JasperFillManager.fillReport生成jrprint格式的文件。

4.利用JRExporter接口的具体实现类HtmlExporter、JRPdfExporter、JRXlsExporter等导出类将jrprint格式的文件生成html、pdf、xls格式的文件,并且导出到response的OutputStream流,从而输出到浏览器页面上。(当然也可以用JasperExportManager来代替前面的JRExporter实现类,不过该类只能处理3中格式(pdf、html、xml)的文件,要处理其他格式就要用具体的JRExporter具体实现类)

以上流程可参考下图(图片来源于网络)

开发流程中涉及的JasperReports相关类

二、利用struts2,action中不配置result,action中对应方法无返回值,在action中直接调用HttpServletResponse类的OutputStream类对象进行输出,从而输出到浏览器端。

1.开发jrxml格式的报表文件,可以用jaspersoft-studio或者ireport开发。将其放入我们web项目的WebRoot目录下。

2.将jrxml格式的文件编译为jasper格式的文件。

3..给jasper格式的文件填充数据并输出到response的OutputStream流。可以利用JasperRunManager的相关方法搞定。另外JasperRunManager一些方法可以在硬盘上生成html、pdf、xsl等格式文件。

4.利用HttpServletResponse的setContentType方法设置返回数据类型,最后利用OutputStream类的flush()方法和close()方法输出到浏览器。

三、利用struts2,action中配置result,对应方法当然需要返回值了,result类型选择stream。需要配置响应内容的格式contentType,输出到浏览器的inputName(该参数的值是一个InputStream流,我们可以将生成的pdf、html、xsl文件通过new FileInputStream来产生输入流)等。

1.开发jrxml格式的报表文件,可以用jaspersoft-studio或者ireport开发。将其放入我们web项目的WebRoot目录下。

2.将jrxml格式的文件编译为jasper格式的文件。

3.利用JasperRunManager的相关方法生成具体格式的(pdf,html等)文件,利用new FileInputStream产生InputStream流对象。剩下的交给struts2配置文件。

上面的3种方法对应的实例代码如下:(分别对应pdf1、pdf2、pdf3方法,其中pdf方法包含将jrxml格式编译为jasper)

struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="test" extends="struts-default" namespace="/test">
        <action name="pdf" class="test.TestAction" method="pdf">
        </action>
        <action name="pdf1" class="test.TestAction" method="pdf1">
        </action>
        <action name="pdf2" class="test.TestAction" method="pdf2">
        </action>
        <action name="pdf3" class="test.TestAction" method="pdf3">
        	<result name="success" type="stream">
  				<param name="contentType">application/pdf</param>
  				<param name="inputName">inputStream</param>
  				<param name="bufferSize">1024</param>
			</result>
        </action>
    </package>
</struts>

action代码

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimplePdfExporterConfiguration;

import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport implements ServletResponseAware, ServletContextAware{

	HttpServletResponse response;
	ServletContext servletContext;
	InputStream inputStream;

	public void pdf() {
		long start = System.currentTimeMillis();
		try {
			//数据库连接
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=flf1989317");

			String reportSource = servletContext.getRealPath("/jasper/jasper_template.jrxml");
			System.out.println(reportSource);
			File parent = new File(reportSource).getParentFile();
			String reportDestination = new File(parent,"complied_jasper_template.jasper").getAbsolutePath();

			//将未编译.jrxml格式的报表文件编译并产生.jasper格式的报表文件
			JasperCompileManager.compileReportToFile(reportSource,reportDestination);
			//获得输出流
			ServletOutputStream servletOutputStream = response.getOutputStream();
			//获得jasper报表文件的输入流
			InputStream inputStream = new FileInputStream(reportDestination);
			//生成传数据的Map对象
			HashMap hm = new HashMap();
			hm.put("test", new Integer(20));

			//生成pdf文档格式的输出流
			JasperRunManager.runReportToPdfStream(inputStream,servletOutputStream,hm,conn);
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("Filling time : " + (System.currentTimeMillis() - start));
	}

public void pdf1() {

		long start = System.currentTimeMillis();
		try {
			//生成传数据的Map对象
			HashMap hm = new HashMap();
			hm.put("test", new Integer(20));
			//数据库连接
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=flf1989317");
			String jasperFile = servletContext.getRealPath("/jasper/complied_jasper_template.jasper");
			//JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFile, hm, conn);
			String jrprintPath = servletContext.getRealPath("/jasper/template.jrprint");
			//File jrprintFile = new File(jrprintPath);
			JasperFillManager.fillReportToFile(jasperFile, jrprintPath, hm, conn);

			JRPdfExporter exporter = new JRPdfExporter();
			//exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
			exporter.setExporterInput(new SimpleExporterInput(jrprintPath));

			//String pdfFilePath = servletContext.getRealPath("/jasper/template.pdf");
			//输出到硬盘上
			//exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(pdfFilePath));
			//输出到响应流,展现在浏览器上
			exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
			SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
			//可以通过configuration对象设置输出pdf文档的各种属性
			//configuration.setCreatingBatchModeBookmarks(true);
			exporter.setConfiguration(configuration);
			exporter.exportReport();

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.err.println("Filling time : " + (System.currentTimeMillis() - start));
	}

	public void pdf2() {
		long start = System.currentTimeMillis();
		try {
			//数据库连接
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=flf1989317");
			String reportDestination = servletContext.getRealPath("/jasper/complied_jasper_template.jasper");
			ServletOutputStream servletOutputStream = response.getOutputStream();
			//获得jasper报表文件的输入流
			InputStream inputStream = new FileInputStream(reportDestination);
			//生成传数据的Map对象
			HashMap hm = new HashMap();
			hm.put("test", new Integer(20));
			//生成pdf文档格式的输出流
			JasperRunManager.runReportToPdfStream(inputStream,servletOutputStream,hm,conn);
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("Filling time : " + (System.currentTimeMillis() - start));
	}

	public String pdf3() {
		long start = System.currentTimeMillis();
		try {
			//数据库连接
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=flf1989317");
			String reportDestination = servletContext.getRealPath("/jasper/complied_jasper_template.jasper");
			String pdfFilePath = servletContext.getRealPath("/jasper/template.pdf");
			HashMap hm = new HashMap();
			hm.put("test", new Integer(20));

			JasperRunManager.runReportToPdfFile(reportDestination, pdfFilePath, hm, conn);
			inputStream = new FileInputStream(pdfFilePath);

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("Filling time : " + (System.currentTimeMillis() - start));
		return SUCCESS;
	}

	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		this.response = response;
	}

	public void setServletContext(ServletContext servletContext) {
		// TODO Auto-generated method stub
		this.servletContext = servletContext;

	}

	public InputStream getInputStream() {
		return inputStream;
	}

}

四、利用struts2的jasperreports插件完成报表的输出到浏览器。此插件需要jasper格式的文件,填充jasper格式的文件的数据源dateSource(可以参考jasperReports的api生成),输出的类型格式(HTML、PDF等)。

因为struts2-jasperreports-plugin-2.3.14.jar插件对应的是jasperreports-3.1.2.jar版本,因此如果用高版本的jasperreports或者ireport工具生成jasper格式的文件,用到此处就会产生一些冲突。固不给出与此方法相关的例子代码。

struts.xml的配置可以参考如下:

<package name="default"extends="jasperreports-default">
	<action name="PDF" class="XXX">
            <result name="success" type="jasper">
                <param name="location">
                    /jasper/template.jasper
                </param>
                <param name="dataSource">YYY</param>
                <param name="format">PDF</param>
            </result>
        </action>
</package>
时间: 2025-01-02 14:07:01

javaweb+jasperreports报表+struts2的相关文章

JasperReports报表区段14

我们将在本章开始,一个简单的报表模板的结构看.依样画葫芦JasperReports的结构报表模板归类到多个区段.部分是有规定的高度,并且可以包含像直线,矩形,图像或文本字段对象报表的部分. 通过提供的报表数据源的虚拟记录的报表引擎遍历,在报表填充的时候.根据每个部分的定义的行为,引擎则呈现每个报表节在适当的时候.举例来说,细节部分的数据源中呈现为每个记录.当页中断,页眉和页面页脚节在需要时提供. 在JasperReports术语,报表区段也被称为报表带区.部分是由一个或多个频段.这些部分在报告生

JAVAWEB开发之Struts2详解(一)——Struts2框架介绍与快速入门、流程分析与工具配置以及Struts2的配置以及Action和Result的详细使用

Struts2框架介绍 三大框架:是企业主流JavaEE开发的一套架构.Struts2 + Spring + Hibernate 什么是框架?为什么要学习框架? 框架是实现部分功能的代码(半成品),使用框架简化企业级软件开发. Struts2与MVC? Struts是一款优秀的MVC框架 MVC:是一种思想,是一种模式,将软件分为Model模型.View视图.Controller控制器 JAVAEE软件三层架构:web层(表现层).业务逻辑层.数据持久层(Sun提供javaEE开发规范) Jav

JasperReports报表变量13

报表变量是建立在报表表达式之上的特殊对象.报表变量简化以下任务: 报表,其中大量使用在整个报告模板表达式.这些表达式可以通过使用报表变量只能声明一次. 计数,求和,平均,最低,最高,方差等:报表变量可以基于像对应的表达式的值执行各种计算 如果变量是在报表设计定义,那么这些可以通过在表达式中的新变量引用.因此,在该变量是在报表设计中声明的顺序是非常重要的. 变量声明 变量声明如下: <variable name="CityNumber" class="java.lang.

JasperReports报表表达式12

报表表达式是JasperReports使我们能够显示在报表上的数据计算的强大功能.计算出数据不是一个静态数据,并且不受特别的报表参数或数据源字段传递的数据.报表表达式是由组合报表参数,字段和静态数据.默认情况下,Java语言是用于编写报表的表达式.其他脚本语言如Groovy脚本语言,JavaScript或BeanShell脚本,报表表达式是由JasperReports编译器支持. 本章将解释如何报表表达式工作假设他们一直只用Java语言编写的.在JRXML报表模板,那里有定义表达式几个元素,如下

JasperReports报表字段11

报表字段是代表数据源和报表模板之间的数据映射元素.字段可以在报告中的表达式进行组合,以获得所需的输出.报表模板可以包含零个或更多的<field>元素.当声明报表字段,数据源应提供相应的数据到所有在报告模板中定义的字段. 字段声明 字段声明做如下: <field name="FieldName" class="java.lang.String"/> name属性 <field>元素的name属性是强制性的.它通过名称引用的报表表达的

JasperReports报表组15

组在JasperReports的协助组织对报告的数据以逻辑方式.报告组代表连续记录的数据源中有一些共同点,比如某个报表字段的值的序列.报告组由<group>元素定义.一个报表可以有任意数量的组.一旦声明,群体可以在整个报告中提到的. 报告组有三个要素: Group expression: 这表示必须改变,以启动一个新的数据组中的数据. Group header section: 帮助位置标签在分组数据的开始. Group footer section: : 帮助位置标签在分组数据的末尾. 在截

JasperReports报表数据源10

数据源的结构数据容器.同时生成报告,Jasper报表引擎获得来自数据源的数据.数据可以从数据库,XML文件,对象数组和集合中的对象来获得.我们将在本章填充报告所看到的fillReportXXX()方法,预计将收到该报告的数据源其以填充,在net.sf.jasperreports.engine.JRDataSource对象或一个java.sql.Connection中的形式(当报表数据在关系数据库中找到). JRDataSource接口只有两个方法,这应该被实现: public boolean n

[JavaWeb基础] 017.Struts2 和 ajax交互简介

在网页开发中,我们为了只对网页的某块内容进行实时更新,而不对其他不需要更新的内容进行刷新,从而提高响应速度和节省流量,我们采用了页面的异步刷新技术Ajax,那么我们的Struts2框架在这一方面是如何实现的呢,其实也很简单,下面我带大家一起了解下. 1.首先我们需要导入两个依赖包json-lib 和 struts2-json-plugin,这是对json支持的解析包. 2.我们需要创建一个Action类,和其他的都一样 package com.babybus.sdteam.action; imp

[JavaWeb基础] 018.Struts2 MVC架构之ModelDriven

用过struts1的人接触struts2的时候,通常会产生一个疑惑,明明struts1已经把action的form分开了,为什么struts2确把模型放在action中定义.其实这个方式只是想让action更加直观,但是如果表单数据过多的话,action类就会出现过于冗长,所以struts2的ModelDriven就要出来解决问题了.下面讲讲ModelDriven的机制 1.工作原理 ModelDriven的机制背后就是ValueStack.界面可以通过直接指定对象的属性名就能给对象进行赋值.