技术开发 频道

在浏览器中显示JasperReports PDF文档

【IT168技术文档】
【摘要】本文将简单讨论如何从web应用程序中把一个由JasperReports生成的PDF报告显示到用户的浏览器端。我们假定读者已经熟悉有关JasperReports和Java Servlet编程的基本知识。

一、 第一种实现
  把一个JasperReports生成的PDF报告发送到用户浏览器的技巧在于,调用net.sf.jasperreports.engine.JasperRunManager.runReportToPdf()方法。这个方法具有多个重载版本,我们在本文中使用的这个版本具有三个参数:一个字符串—描述了编译的报告(jasper文件)的绝对路径;一个实现了java.util.Map接口的类的实例;一个实现了net.sf.jasperreports.engine.JRDataSource接口的类的实例。JasperRunManager.runReportToPdf()方法返回一个字节数组—它被作为一个参数传递给javax.servlet.ServletOutputStream类的write()方法。我们可以从javax.servlet.http.HttpServletResponse类的getOutputStream()方法中获得一个ServletOutputStream的实例。事实胜于雄辩,下列代码片断展示了这一技术:
package net.ensode.jasperreportsbrowserdemo; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperRunManager; public class JasperReportsBrowserDemoServlet extends HttpServlet { protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { ServletOutputStream servletOutputStream = response.getOutputStream(); File reportFile = new File(getServletConfig().getServletContext() .getRealPath("/reports/Simple_Report.jasper")); byte[] bytes = null; try { bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), new HashMap(),new JREmptyDataSource()); response.setContentType("application/pdf"); response.setContentLength(bytes.length); servletOutputStream.write(bytes,0,bytes.length); servletOutputStream.flush(); servletOutputStream.close(); } catch (JRException e) { //在浏览器中显示栈跟踪消息 StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); e.printStackTrace(printWriter); response.setContentType("text/plain"); response.getOutputStream().print(stringWriter.toString()); } } }
    从前面的例子中可以看出,获得jasper文件绝对路径的最容易的方法是调用一个实现javax.servlet.ServletContext接口的类实例的getRealPath()方法。对于本文中的简单示例来说,我们把一个java.util.HashMap空实例和一个net.sf.jasperreports.engine.JREmptyDataSource实例作为另外两个参数传递给JasperRunManager.runReportToPdf()方法。注意,对于更复杂的应用程序情况,一般在这些两个参数中传递一些数据。
0
相关文章