【摘要】本文将简单讨论如何从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的实例。事实胜于雄辩,下列代码片断展示了这一技术:
从前面的例子中可以看出,获得jasper文件绝对路径的最容易的方法是调用一个实现javax.servlet.ServletContext接口的类实例的getRealPath()方法。对于本文中的简单示例来说,我们把一个java.util.HashMap空实例和一个net.sf.jasperreports.engine.JREmptyDataSource实例作为另外两个参数传递给JasperRunManager.runReportToPdf()方法。注意,对于更复杂的应用程序情况,一般在这些两个参数中传递一些数据。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());
}
}
}
