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.*" %>










  
  
  




 
 
注意到代码中的粗体部分了吗?很显然,我们需要在工程部署文件web.xml中新加一个servlet极其


	JasperReports Flash Viewer - Web Application Sample
	
		Xml4SwfServlet
		net.sf.jasperreports.j2ee.servlets.Xml4SwfServlet
	
	
		Xml4SwfServlet
		/servlets/xml4swf
	


	
		SwfServlet
		com.easyway.jaserreport.flash.JasperReportFlashServlet
	
	
		SwfServlet
		/servlets/swf.html
	
	
		index.html
	
	
		BASIC
	
 
 
和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发送的参数为:
 
  
  
 
 
这样就可以区分会话来读取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;

/**
 * 
 * 

请求查看报表时候查询数据,JasperReportFlashServlet用于填充Flash提供 SWF使用表的数据

* * 创建日期 2013-4-28
* @author longgangbai
* @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 parameters = new HashMap(); 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(""); out.println(""); out.println("JasperReports - Web Application Sample"); out.println(""); out.println(""); out.println(""); out.println("JasperReports encountered this error :"); out.println("

");
            e.printStackTrace(out);
            out.println("
"); out.println(""); out.println(""); } } }
 
 

你可能感兴趣的:(flash,jasperReport,web)