二、 改进的方法 尽管前一个示例能够按要求进行工作,但是,我们还可以进一步改进之。不是创建一个字节数组并把它传递给ServletOutputStream类的write()方法,我们可以把PDF直接“流向”浏览器。为此,我们必须首先通过调用ServletContext中的getResourceAsStream()方法以流形式得到编译的资源。这个方法返回一个java.io.InputStream的实例—我们可以把它作为一个参数传递给JasperRunManager类的runReportToPdfStream()方法。下面示例展示了这一技术的使用:
package net.ensode.jasperreportsbrowserdemo;
//……导入语句(省略)
public class JasperReportsBrowserDemoServlet2 extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream reportStream = getServletConfig().getServletContext()
.getResourceAsStream("/reports/Simple_Report.jasper");
try
{
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,
new HashMap(),new JREmptyDataSource());
response.setContentType("application/pdf");
servletOutputStream.flush();
servletOutputStream.close();
}
catch (JRException e)
{
//处理异常
}
}
}
与前一个示例相比,这里的两处主要改动都以加粗显示。当生成PDF报告时,JasperRunManager的runReportToPdfStream()方法能够把PDF报告“流向”浏览器。通过这种方式,我们不必象前一个示例一样把一个字节数组存储在内存中。注意,当使用这种技术时,不能设置内容的长度;因此,客户端不能与服务器保持一种持续性连接,但是这通常对于PDF来说并不重要,因为整个PDF本身是自包含的,而客户端一般不要求更多的信息。
三、 小结 从本文提供的示例程序可知,把一个JasperReports生成的PDF报告发送到一个浏览器并不是一件困难的事情。类似技术还可以用于导出HTML,RTF,XLS或任何其它由JasperReports所支持的输出格式。