通过JSF将PDF发送到浏览器

Fab*_* B. 3 jsf download jasper-reports primefaces jsf-2

我试图将JasperReports生成的PDF文件发送到用户的浏览器,我找不到我的托管bean方法有什么问题,这里是一个片段:

System.out.println("Making pdf...");

        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        String tplPath = ec.getRealPath("testTemplate.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(tplPath);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<String,Object>(), ds );

        String pdfName = "/testReport.pdf";
        String pdfPath = ec.getRealPath(pdfName);
        JasperExportManager.exportReportToPdfFile(jasperPrint, pdfPath);

        System.out.println("PDF ready!");

        ec.responseReset(); 
        ec.setResponseContentType(ec.getMimeType(pdfPath)); 
        //ec.setResponseContentLength(contentLength); 
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + pdfName + "\""); 

        InputStream input = new FileInputStream(pdfPath);
        OutputStream output = ec.getResponseOutputStream();
        IOUtils.copy(input, output);

        System.out.println("Sending to browser...");

        fc.responseComplete();  
Run Code Online (Sandbox Code Playgroud)

通过简单的用户点击调用它:

<p:menuitem value="TestPDF" action="#{menuController.getTestPdf()}" />
Run Code Online (Sandbox Code Playgroud)

我觉得这很容易找到.为什么我看不到它?:)

Bal*_*usC 8

<p:menuitem>默认情况下,Ajax使用.您无法通过ajax下载文件.JavaScript具有正当的安全性原因,无法以编程方式强制使用变量中的任意内容进行" 另存为"对话.

只需关掉ajax.

<p:menuitem ... ajax="false" />
Run Code Online (Sandbox Code Playgroud)

也可以看看: