Остановить p: 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. Этот код вызывается как общий метод из вспомогательного компонента. Как видите, код установит тип содержимого перед потоковой передачей данных 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 {

    }

}

person futureelite7    schedule 03.06.2014    source источник
comment
Не могли бы вы предоставить свой bean-код, который генерирует файл PDF?   -  person MoYapro    schedule 04.06.2014
comment
Добавил код загрузки. Я могу скачать PDF без проблем, так что я не думаю, что это проблема. Проблема в том, что всякий раз, когда я нажимаю на ссылку, страница переходит наверх.   -  person futureelite7    schedule 05.06.2014
comment
Вы видели мой ответ под futureelite7? я думаю, это могло бы тебе помочь   -  person David H.    schedule 05.06.2014


Ответы (3)


Как вы создаете PDF? Вы установили MIME-тип, чтобы браузер распознал, что вы отвечаете PDF-файлом? Вы также запретили первичным лицам продолжать ответ после того, как вы записали на него свой PDF-файл? (для этого используйте FaceContext.responseComplete();)

person MoYapro    schedule 03.06.2014
comment
Да, я установил тип содержимого и MIME-тип в PDF и установил ответ на завершение после вывода PDF. - person futureelite7; 03.06.2014

Когда вы используете HTML-тег ссылки по умолчанию <a />, вы должны установить href='javascript:void(0)', чтобы текущая страница не прокручивалась вверх.

Может быть, есть способ сделать то же самое с помощью p: commandLink

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

Надеюсь, это поможет вам решить вашу проблему

person David H.    schedule 03.06.2014

Я думаю, это потому, что вы используете ajax=false. Если вы не используете ajax, вся страница будет перезагружена. Либо удалите его, либо измените на ajax=true и попробуйте.

Изменить:

Я ошибался. ajax=false требуется при загрузке файлов.

person LarsBauer    schedule 03.06.2014
comment
Ссылка используется для загрузки PDF-файла в качестве вложения. Насколько я знаю, ajax должен быть ложным при загрузке файлов. - person futureelite7; 03.06.2014
comment
Я прочитал документацию. Ты прав. Итак, вы пробовали использовать <h:commandLink> вместо <p:commandLink>? - person LarsBauer; 03.06.2014