Although the previous example works as intended, with a few minor
    tweaks we can make it perform better. Instead of creating an array of
    bytes and passing it to the write() method of the ServletOutputStream
    class, we can stream the PDF directly to the browser. To accomplish
    this, we must first get the compiled resource as a stream by calling the
    getResourceAsStream() method in the ServletContext.
    This method returns an instance of java.io.InputStream that
    we can pass as a parameter to the runReportToPdfStream()
    method of the JasperRunManager class. The following example
    demonstrates this technique:
package net.ensode.jasperreportsbrowserdemo;
//import statements omitted
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)
    {
      //handle the exception
    }
  }
}
The two main changes from the previous example are highlighted in bold. The
    runReportToPdfStream()
    method of the JasperRunManager streams the PDF report to
    the browser as it is generated. This way we don't have to store an array
    of bytes in memory as in the previous example. When using this
    technique, the content length can't be set, therefore the client won't
    be able to keep a persistent connection open to the server, but that
    usually isn't important with PDFs, because the entire PDF is self
    contained and the client won't need to ask for more info.
As can be seen from the examples provided in this article, sending a JasperReports generated PDF report to a browser is not a difficult task. Similar techniques can be used to export HTML, RTF, XLS or any other output format supported by JasperReports.
Thanks to Barry Klawans from JasperSoft for providing valuable feedback.