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>"); } } }
相关推荐
JasperReports是一款开源的Java报表库,它允许开发者创建、设计和显示复杂的报告。这个教程将介绍如何使用JasperReports来制作报表,并将其导出为PDF、Excel和HTML格式。 ### 一、JasperReports简介 JasperReports...
2. **生成Flash数据集**:JasperReports可以生成SWF文件,这是Flash报表的基础。你需要在报表的JRXML文件中指定输出类型为"SWF",并配置相应的Flash参数。 3. **设置数据连接和查询**:IReport允许你定义SQL查询...
jasperreports-flash来实现web客户端打印的功能,避免了applet客户端打印在客户端安装jre的限制。jasperreports-flash只需要求客户端有能浏览swf文件的flash player就行了。可以根据自己的需求修改example.mxml文件...
《iReport-JasperReports报表开发指南+操作手册》是一本专为初学者设计的教程,主要聚焦于使用iReport和JasperReports工具进行报表开发。这两个工具是Java领域内广泛使用的开源报表解决方案,尤其在企业级应用中颇受...
另一方面,jasperReports是一款强大的开源报表工具,能够设计和生成各种复杂的报表,包括表格、图表、图像等,并支持多种输出格式,如PDF、Excel、XML等。 在Struts2中整合jasperReports,可以实现Web应用中的动态...
JasperReports是一款强大的开源报表工具,它允许开发者创建复杂、美观的报表,并能与Java应用程序无缝集成。在Java开发环境中,JasperReports以其灵活性和易用性被广泛应用于数据分析和展示。本教程“JasperReports ...
JAVA源码JasperReports报表类库v3.5
《iReport+JasperReports报表开发入门详解》 iReport是一款强大的报表设计工具,主要用于创建和编辑JasperReports报表。对于初学者来说,掌握iReport的使用是进入报表开发领域的关键。本文将详细讲解iReport的安装...
JasperReports是一款强大的开源报表工具,专为Java开发者设计,用于生成复杂的报表和图表。它的核心库v3.5版本提供了丰富的功能,使得开发者能够轻松地在应用程序中集成报告生成和展示。在这个版本中,JasperReports...
JasperReports是一款强大的开源报表工具,它为Java开发者提供了丰富的报表设计和生成功能。这个"JasperReports报表类库v3.5.7z"压缩包包含的是JasperReports库的v3.5版本,这是一个专门用于创建、设计和展示复杂报表...
**Java源码:JasperReports报表类库v3.5** JasperReports是Java平台上的一个开源报表库,它提供了一种强大的方式来设计、创建和展示复杂的业务报告。这个压缩包“java源码:JasperReports报表类库v3.5.rar”包含了...
基于JasperReport的Flash查看器,Ver3.7
**jasperreports报表资料概述** JasperReports是一款开源的Java报表工具,用于生成静态和交互式的报表。它能够处理各种数据源,如数据库、CSV文件、XML数据等,并且能够导出报表为多种格式,包括PDF、HTML、Excel、...
java源码资源JasperReports 报表类库v3.5提取方式是百度网盘分享地址
### iReport中使用JavaBean作为数据源开发JasperReports报表 #### 创建JavaBean 在iReport中使用JavaBean作为数据源来开发JasperReports报表时,首先需要创建一个简单的JavaBean对象来存储数据。以下是一个名为`...
9. **Java API**:JasperReports提供了丰富的Java API,使得开发者可以轻松地在代码中控制报表的生成和展现。 在JasperReports v3.5版本中,需要注意的是,它可能不包含一些后来版本中的新特性和改进,例如对Java 8...