堆栈:在JBoss JSF + PrimeFaces AS与JasperReports的
我一直在使用使用JasperReports的一个三步过程,PDF格式导出的模式:
[1]获得从在战争中的路径编译碧玉报告
[2]放置JasperPrint对象上的会话
[3]重定向到PDFServlet中的URL
因此,当从GUI用户点击一个p:的commandButton背衬-bean的方法被调用,通过变为[1],[2]和[3],如以下示例代码:
XHTML文件:
<p:commandButton ajax="false" action="#{indexController.exportPDF}" value="Export PDF"/>
后台bean的代码:
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;
}
我有两个问题:
[我]你看到任何明显的代码异味或限制这种做法?
[II]与示例代码Chrome和Conkeror以上可以保存它们呈现给用户,用于保存文件的报告,但默认的文件名是简单地“PDF”。 我怎么可以配置为一个有意义的名称(例如“报道,2012-08-23c.pdf”)?