单击时停止p:commandLink从滚动到页面顶部

时间:2014-06-03 08:41:40

标签: java jsf primefaces commandlink

我有一个带图像的JSF2命令链接。单击图像时,服务器将下载PDF文件。在单击图像链接后下载文件时,它也会导致整个页面滚动到页面顶部。该链接的代码段如下:

<p:commandLink ajax="false"
        action="#{refereeAssessmentSummaryBean.stateLatestFormInPAVer(project.appId)}">
<p:graphicImage name="images/pdf.png"
            title="#{msg['label.downloadpdf']}" />
</p:commandLink>    

我如何使用commandlink下载PDF文件,每次点击它时网页都不会滚动到页面顶部?

编辑:FWIW,添加了PDF下载代码。此代码作为辅助bean的共享方法调用。如您所见,代码将在将PDF数据流式传输到客户端之前设置内容类型。

public void downloadEformPdf(Integer appId, Integer revNo, Integer meetingId, 
            String password, boolean showSaveDialog, boolean getEditedIfAvailable, boolean showVersionInfo) {

    User user = WebUtils.getCurrentUser();

    PermissionResult permissionResult = ServiceProxy.getPermissionService().checkViewOnlineProposalPermission(user, appId, meetingId);

    if (permissionResult != PermissionResult.GRANTED) {

        if (!(permissionResult == PermissionResult.REJECTED_GRBE_COI_NOT_APPROVED
            || permissionResult == PermissionResult.REJECTED_GRBE_COI_NOT_DECLARED)) {
            throw new PermissionDeniedException("Permission Denied");
        } 
    }

    Application appl = ServiceProxy.getAppService().getApplication(appId);
    String scheme = appl.getScheme();

    boolean withNomination = false;
    boolean isEditedVersion = false;

    byte[] pdfData;

    if (getEditedIfAvailable) {

        if (revNo == null) {
            Appmatching appMatching = ServiceProxy.getAppFormService().getLatestAppMatching(appId,false);
            revNo = appMatching.getMainRevno();
        }

        Appattacheditedeform editedEntry = ServiceProxy.getAppService().getEditedProposalForApplication(appId, revNo, true);

        // give GRB, ER the edited version if it exists
        if (editedEntry != null) {

            Filestorage storage = editedEntry.getFilestorage();
            pdfData = storage.getContent();

            isEditedVersion = true;

        } else {

            pdfData = ServiceProxy.getReportService().getHMRFReportContentByRevNo(
                    appId.intValue(), revNo, withNomination);

        }

    } else { //Get the unedited version

        //Get latest rev no.
        if (revNo == null) {
            Appmatching appMatching = ServiceProxy.getAppFormService().getLatestAppMatching(appId,false);
            revNo = appMatching.getMainRevno();
        }

        pdfData = ServiceProxy.getReportService().getHMRFReportContentByRevNo(
                appId.intValue(), revNo, withNomination);

    }

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext extContext = context.getExternalContext();

    extContext.responseReset();

    PDDocument doc = null;
    try {

        if (pdfData != null) {

            PDFParser parser = new PDFParser(new ByteArrayInputStream(pdfData));
            parser.parse();
            doc = parser.getPDDocument();

            AccessPermission ap = new AccessPermission();
            ap.setReadOnly();

            if (password != null) {
                StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password, ap);
                spp.setEncryptionKeyLength(128);
                doc.protect(spp);
            }

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            doc.save(bos);
            doc.close();

            byte[] docbuff = bos.toByteArray();

            String refNo = appl.getRefNo();

            String filename = null;

            if (showVersionInfo) {

                if (isEditedVersion) {
                    filename = scheme.toLowerCase() + "_eform_" + refNo + "_(v" + revNo + ")_(Edited).pdf";
                } else {
                    filename = scheme.toLowerCase() + "_eform_" + refNo + "_(v" + revNo + ")_(PA).pdf";
                }
            } else {
                filename = scheme.toLowerCase() + "_eform_" + refNo + ".pdf";
            }

            extContext.setResponseContentType("application/pdf");
            extContext.setResponseContentLength(docbuff.length);
            extContext.setResponseHeader("Content-Disposition", (!showSaveDialog) ? "inline"
                    : "attachment" + "; filename=\"" + filename + "\"");

            OutputStream os = extContext.getResponseOutputStream();

            os.write(docbuff);
            os.close();

            context.responseComplete();

        } else {

            extContext.setResponseContentType("text/html");

            Writer writer = extContext.getResponseOutputWriter();
            writer.write("Cannot retrieve PDF form for this proposal.");
            writer.close();

            context.responseComplete();
        }

    } catch (IOException e) {
        logger.log(Level.ERROR, e.getMessage(), e);
    } catch (COSVisitorException e) {
        logger.log(Level.ERROR, e.getMessage(), e);
    } catch (BadSecurityHandlerException e) {
        logger.log(Level.ERROR, e.getMessage(), e);
    } finally {

    }

}

3 个答案:

答案 0 :(得分:0)

我认为这是因为您使用的是ajax=false。 如果您不使用ajax,将重新加载整个页面。 删除它或更改为ajax=true并试一试。

修改

我错了。下载文件时需要ajax=false

答案 1 :(得分:0)

如何生成PDF? 您是否设置了mimetype以便浏览器能够识别您使用pdf进行响应? 在将PDF文件写入文件后,您是否也阻止了表面继续响应? (使用facesContext.responseComplete();为此)

答案 2 :(得分:0)

当您使用默认的HTML链接标记<a />时,您必须设置href='javascript:void(0)'以避免当前页面滚动到顶部。

也许p:commandLink有办法做同样的事情

<p:commandLink url="javascript:void(0)" ... /> ??

希望这可以帮助您解决问题