堆棧:JSF + PrimeFaces上的JBoss AS與JasperReports的JasperReports PdfServlet將報告保存爲PDF - 如何設置瀏覽器的文件名以提示用戶?
我已經使用利用JasperReports的具有三個步驟過程中PDF格式導出的圖案:
[1]從戰爭中獲取編譯後的Jasper報告
[2]將放在JasperPri上的會話NT對象
[3]重定向到的PDFServlet中
的URL所以,當從GUI用戶點擊一個號碼:的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]以上面的示例代碼都可以保存報告,但是它們向用戶保存文件的默認文件名只是「pdf」。我如何將其配置爲一個有意義的名稱(例如「report-2012-08-23c.pdf」)?
我與JSF和JasperReports的工作壓力太大。就我而言,我們不會在會話中保存任何內容,我們從JasperReport生成PDF(或Excel或其他格式),然後將內容下載到用戶客戶端(通過在響應中寫入文件內容)。這種方法適合我們。 –