使用辅助bean方法和Primefaces对话框的'oncomplete'属性出现意外行为。

时间:2014-02-27 02:09:41

标签: java jsf primefaces jasper-reports

(首先,抱歉我的英语不好) 我正在使用JSF 2 + Primefaces 3.5 + Spring 3.2。 我在p:datatable组件中有一个订单列表。

我想选择表格的一行(工作正常,这里没问题),然后点击一个工具栏按钮:首先,使用JasperReports 4.8创建一个PDF文件(这里没问题),然后显示PDF预览p:media组件中的p:dialog。 这是我的p:commandButton :(注意updateoncomplete属性)

    <p:commandButton id="previewPDF" value="Preview PDF" 
    action="#{ordenBean.printPreview}" icon="ui-icon-print" 
    update="pdfDialog" oncomplete="PF('dlg_pdf').show();" />

这是一个简单的对话框:

<p:dialog id="pdfDialog" widgetVar="dlg_pdf" modal="true" draggable="false" header="PDF Preview" width="75%" position="center" height="600px">
    <p:media player="pdf" value="/pdf/preview.pdf" width="100%" height="100%" />
</p:dialog>

显示加载对话框的p:ajaxstatus组件。工作正常。

<p:ajaxStatus onstart="PF('statusDialog').show();" onsuccess="PF('statusDialog').hide();"/>

<p:dialog modal="true" widgetVar="statusDialog" header="Processing..." draggable="false" closable="false">  
    <p:graphicImage value="/images/loading.gif" />  
</p:dialog>  

一切正常,PDF文件已创建,对话框显示,但有时我选择一行,按下按钮,对话框显示以前创建的PDF(以前选中的行),即对话框在创建新文件之前(即在printPreview()进程完成之前)加载PDF文件。 这是创建PDF文件的bean方法printPreview() :(也可以正常工作)

public void printPreview() {
    try {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("ID", orden.getId());
        map.put("LOCALE", java.util.Locale.US);
        DataSource ds = (DataSource) ApplicationContextProvider.getApplicationContext().getBean("dataSource", DataSource.class);
        Connection cn = ds.getConnection();
        Resource rsc = ApplicationContextProvider.getApplicationContext().getResource("classpath:reports/preview.jasper");
        String outFileName = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/") + "pdf\\preview.pdf";
        JasperPrint jasperPrint= JasperFillManager.fillReport((JasperReport) JRLoader.loadObject(rsc.getInputStream()), map, cn);
        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,outFileName);
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
        JasperExportManager.exportReportToPdfFile(jasperPrint, outFileName);
    } catch (Exception ex) {
        // handling exceptions
    }
}

怎么了?对话框显示并加载以前的PDF后,我导航到创建PDF文件的路径,文件正常(我实际选择的订单)。

0 个答案:

没有答案