我正在开发一个Web应用程序,用户可以在其上生成某些数据的报告。我正在使用JasperReport做到这一点。这是我第一次使用JasperReport。所以我跟着这个tutorial。
那里描述的方法可以在服务器上保存报告,但我需要在生成后下载该报告。
可以感谢一些帮助,谢谢。
答案 0 :(得分:3)
您的代码应如下所示:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String path = getServletContext().getRealPath("/reports/report1.jrxml");
jasReport = JasperCompileManager.compileReport(path);
System.out.println("Jasper Report : " + jasReport);
Connection con = MyConnFactory.getConnection();
System.out.println(con);
jasPrint = JasperFillManager.fillReport(jasReport,null,con);//, mapParam, con);
System.out.println("Jasper Print : " + jasPrint);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// JasperExportManager.exportReportToPdfFile(jasPrint, "f:/nn.pdf");
// JasperExportManager.exportReportToPdfStream(jasPrint, baos);
// ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
// inputStream = bais;
ServletOutputStream sos=resp.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasPrint, sos);
try {
MyConnFactory.getConnection().close();
sos.close();
} catch (SQLException ex) {
Logger.getLogger(MyReport.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (JRException ex) {
Logger.getLogger(MyReport.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 1 :(得分:1)
尝试下载生成的文件时,需要在servlet代码中设置这些内容。可能需要根据特定情况的文件格式更改一些参数。
response.setContentType("APPLICATION/OCTET-STREAM");
String disHeader = "Attachment;Filename=\"ReportFile.csv" + "\"";
response.setHeader("Content-Disposition", disHeader);
答案 2 :(得分:0)
或者:
要做#1,你要么必须将它保存在网络应用程序内部,这在部署战争时是不可能的,如果部署爆炸战争则是脆弱的。符号链接和容器游戏可以解决这个问题。
要做#2,将它保存在任何地方,并创建一个servlet,它可以获取映射到生成的文件(或其他)的请求参数并将其流回 - 搜索“download servlet”提供了大量的实现。
大多数框架在不编写纯servlet的情况下提供类似的功能。