`
longgangbai
  • 浏览: 7338860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jasperreports报表Flash展现

阅读更多

    jasperreports在web上的报表展现方式有两种,一种是applet viewer,另外一种是flash viewer,由于前者的实现需要浏览器端装有java运行时,所以只考虑后一种方式

 
把前面提到的demo之jasper-webapp中flash文件夹下的flash报表查看器jasperreports-flash-4.0.0.swf拷到你本地项目的某个文件夹。
我们参考demo中的swf.html的内容:
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ page import="java.util.*" %>
<html>
<head>
<title>
</title>
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/stylesheet.css" title="Style">
</head>

<body bgcolor="white">

<object width="100%" height="100%">
  <param name="movie" value="flash/jasperreports-flash-4.5.0.swf"/>
  <embed src="<%=request.getContextPath() %>/flash/jasperreports-flash-4.5.0.swf"  FlashVars="jrpxml=<%=request.getContextPath() %>/servlets/xml4swf?jrprint=<%=request.getSession().getId()%>_jrprint&fetchSize=3&time=<%=new Date()%>" 
    width="100%" height="100%">
  </embed>
</object>

</body>
</html>
 
 
注意到代码中的粗体部分了吗?很显然,我们需要在工程部署文件web.xml中新加一个servlet极其
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	version="2.4"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>JasperReports Flash Viewer - Web Application Sample</display-name>
	<servlet>
		<servlet-name>Xml4SwfServlet</servlet-name>
		<servlet-class>net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Xml4SwfServlet</servlet-name>
		<url-pattern>/servlets/xml4swf</url-pattern>
	</servlet-mapping>


	<servlet>
		<servlet-name>SwfServlet</servlet-name>
		<servlet-class>com.easyway.jaserreport.flash.JasperReportFlashServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>SwfServlet</servlet-name>
		<url-pattern>/servlets/swf.html</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
	<login-config>
		<auth-method>BASIC</auth-method>
	</login-config>
</web-app>
 
 
和demo中的单个用户不同,由于需要区分不同的用户查询报表后生成的JasperPrint对象,我们需要把它set入用户的当前session中。但是我们要怎么把它取出来然后用Xml4SwfServlet来进行展现呢?这个servlet除了一个fetchSize参数,还可以接收哪些参数呢?
 
幸好jasperreports是开源的,可以直接查看和修改它的源代码。我们来研究一下这个Xml4SwfServlet的实现类net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet.java的祖父类net.sf.jasperreports.j2ee.servlets.BaseHttpServlet.java。
 
可以发现,BaseHttpServlet定义了一个方法,以List的形式返回session中的所有JasperPrint对象:
 
public static List getJasperPrintList(HttpServletRequest request){
.......
}
 
它定义了两个和request对象可以接受的参数名称:
public static final String JASPER_PRINT_LIST_REQUEST_PARAMETER = "jrprintlist";
public static final String JASPER_PRINT_REQUEST_PARAMETER = "jrprint";
然后在getJasperPrintList方法中接收他们,如果参数值不为空,则以这两个参数的值在session中取出它对应的JasperPrint对象或者装有JasperPrint对象的List(由于我们一次查询只返回一个JasperPrint对象,后者可以忽略)——那么,在我们填充报表生成单个的JasperPrint对象set进session中时,我们需要:
request.getSession().setAttribute(request.getSession().getId() + "_jrprint",jasperPrint);
 
这时参数“jrprint”的值就是request.getSession().getId() + "_jrprint"的值了。
 
我们再修改自己的报表展现页面ViewReport.jsp(对应demo中的swf.html)中向Xml4SwfServlet发送的参数为:
 
  <embed src="<%=request.getContextPath() %>/flash/jasperreports-flash-4.5.0.swf"  FlashVars="jrpxml=<%=request.getContextPath() %>/servlets/xml4swf?jrprint=<%=request.getSession().getId()%>_jrprint&fetchSize=3&time=<%=new Date()%>" 
    width="100%" height="100%">
  </embed>
 
 
这样就可以区分会话来读取JasperPrint对象进行flash报表展现了。
 
但我们又会碰到一个新的问题,第一次查询出报表进行展现后,当重新设定查询条件再次进行查询时,发现flash中的报表内容还是和第一次一样,并没有进行更新。
 
经排查后发现是ViewReport.jsp重新载入时,向服务器端发出的Http请求的url每一次都是一样的,所以浏览器认为服务器端没有更新,直接把缓存内容返回了页面。
 
那我们就想个办法,每次请求的url都不一样,在请求之后添加时间
 
嗯,我在参数jrprint的值后加上了当前时间,用分号和原来的值隔开了——这样用户进行报表查询后ViewReport.jsp刷新时浏览器向服务器端发出的请求就每次都不一样啦。大功告成,这样我们就可以在多用户情况下用flash播放器完美的进行报表展现了。
 
 
JasperReportFlashServlet
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;
import net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet;

/**
 * 
 * <p>请求查看报表时候查询数据,JasperReportFlashServlet用于填充Flash提供 SWF使用表的数据<p>
 *
 * 创建日期 2013-4-28<br>
 * @author  longgangbai<br>
 * @version $Revision$ 2013-4-28
 * @since   3.0.0
 */
public class JasperReportFlashServlet extends Xml4SwfServlet {
    //
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        ServletContext context = this.getServletConfig().getServletContext();
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        try {
            String reportFileName = context.getRealPath("reports/WebappReport.jasper");
            File reportFile = new File(reportFileName);
            if (!reportFile.exists()) {
                throw new JRRuntimeException(
                        "File WebappReport.jasper not found. The report design must be compiled first.");
            }
            Map<String, Object> parameters = new HashMap<String, Object>();
            parameters.put("ReportTitle", "Address Report");
            parameters.put("BaseDir", reportFile.getParentFile());
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportFileName, parameters,
                    new JasperReportDataSource());
            request.getSession().setAttribute(request.getSession().getId()+"_"+BaseHttpServlet.JASPER_PRINT_REQUEST_PARAMETER, jasperPrint);
            request.getRequestDispatcher("/jasperReportSWF.jsp").forward(request, response);
        } catch (JRException e) {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>JasperReports - Web Application Sample</title>");
            out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"../stylesheet.css\" title=\"Style\">");
            out.println("</head>");
            out.println("<body bgcolor=\"white\">");
            out.println("<span class=\"bnew\">JasperReports encountered this error :</span>");
            out.println("<pre>");
            e.printStackTrace(out);
            out.println("</pre>");
            out.println("</body>");
            out.println("</html>");
        }
    }
}
 
 
分享到:
评论
1 楼 水土第一 2014-03-10  
如果是list怎么在flash中显示啊?
request.getSession().setAttribute(request.getSession().getId()+"_jrprintlist",jlist);我这样设置只能显示第一页,求指点啊大师

相关推荐

    使用jasperreports制作报表(导出pdf excel html)

    JasperReports是一款开源的Java报表库,它允许开发者创建、设计和显示复杂的报告。这个教程将介绍如何使用JasperReports来制作报表,并将其导出为PDF、Excel和HTML格式。 ### 一、JasperReports简介 JasperReports...

    IReport+jasperReports实现flash报表查询功能

    2. **生成Flash数据集**:JasperReports可以生成SWF文件,这是Flash报表的基础。你需要在报表的JRXML文件中指定输出类型为"SWF",并配置相应的Flash参数。 3. **设置数据连接和查询**:IReport允许你定义SQL查询...

    jasperreports-flash 3.7.0web多页打印及其预览

    jasperreports-flash来实现web客户端打印的功能,避免了applet客户端打印在客户端安装jre的限制。jasperreports-flash只需要求客户端有能浏览swf文件的flash player就行了。可以根据自己的需求修改example.mxml文件...

    iReport-JasperReports报表开发指南+操作手册

    《iReport-JasperReports报表开发指南+操作手册》是一本专为初学者设计的教程,主要聚焦于使用iReport和JasperReports工具进行报表开发。这两个工具是Java领域内广泛使用的开源报表解决方案,尤其在企业级应用中颇受...

    Struts2整合jasperReports报表

    另一方面,jasperReports是一款强大的开源报表工具,能够设计和生成各种复杂的报表,包括表格、图表、图像等,并支持多种输出格式,如PDF、Excel、XML等。 在Struts2中整合jasperReports,可以实现Web应用中的动态...

    JasperReports 报表开发 java.rar

    JasperReports是一款强大的开源报表工具,它允许开发者创建复杂、美观的报表,并能与Java应用程序无缝集成。在Java开发环境中,JasperReports以其灵活性和易用性被广泛应用于数据分析和展示。本教程“JasperReports ...

    JAVA源码JasperReports报表类库v3.5

    JAVA源码JasperReports报表类库v3.5

    iReport+JasperReports报表开发入门

    《iReport+JasperReports报表开发入门详解》 iReport是一款强大的报表设计工具,主要用于创建和编辑JasperReports报表。对于初学者来说,掌握iReport的使用是进入报表开发领域的关键。本文将详细讲解iReport的安装...

    JasperReports 报表类库v3.5

    JasperReports是一款强大的开源报表工具,专为Java开发者设计,用于生成复杂的报表和图表。它的核心库v3.5版本提供了丰富的功能,使得开发者能够轻松地在应用程序中集成报告生成和展示。在这个版本中,JasperReports...

    JasperReports 报表类库v3.5.7z

    JasperReports是一款强大的开源报表工具,它为Java开发者提供了丰富的报表设计和生成功能。这个"JasperReports报表类库v3.5.7z"压缩包包含的是JasperReports库的v3.5版本,这是一个专门用于创建、设计和展示复杂报表...

    java源码:JasperReports 报表类库v3.5.rar

    **Java源码:JasperReports报表类库v3.5** JasperReports是Java平台上的一个开源报表库,它提供了一种强大的方式来设计、创建和展示复杂的业务报告。这个压缩包“java源码:JasperReports报表类库v3.5.rar”包含了...

    jasperreports-flash.3.7

    基于JasperReport的Flash查看器,Ver3.7

    jasperreports报表资料

    **jasperreports报表资料概述** JasperReports是一款开源的Java报表工具,用于生成静态和交互式的报表。它能够处理各种数据源,如数据库、CSV文件、XML数据等,并且能够导出报表为多种格式,包括PDF、HTML、Excel、...

    java源码资源JasperReports报表类库v3.5

    java源码资源JasperReports 报表类库v3.5提取方式是百度网盘分享地址

    ireport中使用javabean作数据源开发jasperreports报表

    ### iReport中使用JavaBean作为数据源开发JasperReports报表 #### 创建JavaBean 在iReport中使用JavaBean作为数据源来开发JasperReports报表时,首先需要创建一个简单的JavaBean对象来存储数据。以下是一个名为`...

    基于Java的JasperReports 报表类库v3.5.zip

    9. **Java API**:JasperReports提供了丰富的Java API,使得开发者可以轻松地在代码中控制报表的生成和展现。 在JasperReports v3.5版本中,需要注意的是,它可能不包含一些后来版本中的新特性和改进,例如对Java 8...

Global site tag (gtag.js) - Google Analytics