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



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

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

如何生成PDF?您是否设置了mime类型以便浏览器能够识别出您的响应是pdf?您是否还阻止primefaces在您将PDF文件写入后继续响应?(使用facesContext.responseComplete ();

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

也许有一种方法与p:commandLink做同样的事情

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

希望这将帮助您解决您的问题

我认为这是因为你正在使用ajax=false。如果您没有使用ajax,整个页面将被重新加载。要么删除它,要么更改为ajax=true并尝试一下。

编辑:

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

相关内容

  • 没有找到相关文章

最新更新