pdf生成后无法隐藏primefaces blockui

时间:2014-02-09 06:09:18

标签: jsf-2 primefaces

我正在生成pdf并使用The BalusC Code: PDF handling中描述的方法在单独的窗口/选项卡中显示它。当我选择commandlink以显示pdf时,我需要显示blockui ajax loader。生成pdf但是ajax加载器图像保持不变。我需要手动刷新页面以隐藏它。有任何方法可以在pdf显示后立即隐藏它。

我的代码段如下

JSF页面

<h:form id="subFrm">

    <p:commandLink value="Download PDF" action="#{pdfBean.downloadPDF}" 
    onclick="blkUi.show()" oncomplete="blkUi.hide()" id="cmdLink"
    ajax="false" />

        <p:blockUI block="subFrm" trigger="cmdLink" widgetVar="blkUi">  
    processing...<br />
            <p:graphicImage value="/images/ajaxLoader.gif" />
        </p:blockUI>

</h:form>

请求范围的托管bean片段

@ManagedBean
@RequestScoped
public class PdfBean {

    // Constants ----------------------------------------------------------------------------------

    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.

    // Actions ------------------------------------------------------------------------------------

    public void downloadPDF() throws IOException {

        // Prepare.
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
        String filePath=externalContext.getRealPath("/pdf");
        File file = new File(filePath, "modified.pdf");
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open file.
            input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);

            // Init servlet response.
            response.reset();
            response.setHeader("Content-Type", "application/pdf");
            response.setHeader("Content-Length", String.valueOf(file.length()));
            response.setHeader("Content-Disposition", "inline; filename=\"" + "modified.pdf" + "\"");
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Finalize task.
            output.flush();
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }

        // Inform JSF that it doesn't need to handle response.
        // This is very important, otherwise you will get the following exception in the logs:
        // java.lang.IllegalStateException: Cannot forward after response has been committed.
        //externalContext.redirect(((HttpServletRequest)externalContext.getRequest()).getRequestURI());
        facesContext.responseComplete();
        /*FacesContext.getCurrentInstance().getExternalContext()
        .redirect("index.xhtml");*/
    }

    // Helpers (can be refactored to public utility class) ----------------------------------------

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it. It may be useful to 
                // know that this will generally only be thrown when the client aborted the download.
                e.printStackTrace();
            }
        }
    }


}

1 个答案:

答案 0 :(得分:0)

您无需明确打开blockui。只需从commandLink

中删除代码即可
onclick="blkUi.show()" oncomplete="blkUi.hide()"

删除上面。 BlockUI会显示并隐藏自己。