Stack: JSF + PrimeFaces on JBoss AS with JasperReports
I have been using a pattern of exporting in PDF format using JasperReports with a three steps process:
[1] obtain the compiled Jasper report from a path in the war
[2] place the JasperPrint object on the session
[3] redirect to the URL of the PdfServlet
So when the user from the GUI clicks on a p:commandButton a backing-bean's method is called that goes through [1], [2] and [3] as in the following example code:
xhtml file:
<p:commandButton ajax="false" action="#{indexController.exportPDF}" value="Export PDF"/>
backing bean code:
private void putPrintObjectInSession() throws JRException {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
ServletContext context = (ServletContext) externalContext.getContext();
String reportFileName = context.getRealPath("/reports/PrimeNumbersReport.jasper");
File reportFile = new File(reportFileName);
if (!reportFile.exists())
throw new JRRuntimeException(".jasper file not found in the war.");
Map parameters = new HashMap();
parameters.put("ReportTitle", "2nd Prime Numbers Report");
parameters.put("BaseDir", reportFile.getParentFile());
JasperPrint jasperPrint =
JasperFillManager.fillReport(
reportFileName,
parameters,
getSQLConnection()
);
((HttpSession) externalContext.getSession(false)).setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
}
public String exportPDF() throws IOException, JRException {
putPrintObjectInSession();
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.redirect("servlets/pdf");
return null;
}
I have two questions:
[i] do you see any obvious code smells or limitations with this approach?
[ii] with the example code above both Chrome and Conkeror can save the report but the default filename they present to the user for saving the file is simply "pdf". How can I configure that to a meaningful name (e.g. "report-2012-08-23c.pdf") ?