1

h:datatableバッキング Bean を呼び出し、生成された PDF ドキュメントを「返すべき」リンクを含む列を含む があります。

列は次のようになります。

<h:form>
    ...
    <h:datatable>
        ...
        <h:column >
            <h:commandLink action="#{bean.downloadPDF}" target="_blank" >
                <f:param name="value1" value="#{bean.val1}"/>
                <f:param name="value2" value="#{bean.val2}"/>
                <f:param name="value3" value="#{bean.val3}"/>
                <h:graphicImage name="certificate.jpg" library="images"/>
            </h:commandLink>
        </h:column>
        ...
    </h:datatable>
...
</h:form>  

ページに JavaScript エラーはありません (chrome と firebug によると)。バッキング Bean は次のようになります。

public void downloadPDF() {
...
File outputPDF = new File(outputFileName);

//Get ready to return pdf to user
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
    // Open file.
    input = new BufferedInputStream(new FileInputStream(outputPDF), 10240);

    //Return PDF to user
    // Init servlet response.
    response.reset();
    response.setHeader("Content-Type", "application/pdf");
    response.setHeader("Content-Length", String.valueOf(outputPDF.length()));
    response.setHeader("Content-Disposition", "inline; filename=\"" + pdfName + "\"");
    output = new BufferedOutputStream(response.getOutputStream(), 10240);

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

    // Finalize task.
    output.flush();
} catch(IOException e) {
    e.printStackTrace();
} finally {
    output.close();
    input.close();
}
facesContext.responseComplete();
}

これで、カスタム PDF を作成してドライブに保存できるため、PDF 生成が機能することがわかりました。

次に、メソッドに追加<f:ajax/>すると、h:commandLinkメソッドが呼び出されます。それがなければ、アクション メソッドが呼び出されることなく、現在のページがリロードされます。

私はいくつかの異なることを試しました... sの有無にかかわらずf:paramString関数に戻り値を追加しdownloadPDF()ます。編集:パラメータを取り除きtarget="_blank"ます。actionListenerの代わりに使用しactionます。を使用するactionと、Bean メソッドは呼び出されませんが、: にこのエラー メッセージが表示されh:messagesますConversion Error setting value '' for 'null Converter'.

関数を呼び出すことができません。私が望んでいるのは、downloadPDFリンクをクリックすると、新しいウィンドウが開き、PDFがダウンロードされることです。

どんな助けでも大歓迎です。

EDIT 2 /ソリューション(一時)

attribute を使用してこれを機能させることができましたimmediate="true"。を提供している正確なフィールドはまだ見つかりConversion Errorませんでしたが、この特定の機能のために送信する必要のないフォーム内のフィールドであると想定しています。

4

1 に答える 1

1

質問に関連付けられたロジックは良好でした。この問題は、null のままであったフォーム内の他の項目にありました。Edit 2と同様に、 を追加するimmediate="true"と、必要なフィールドだけがサーブレットに送信されるようになりました。

学んだ教訓

JSF でフォームの一部を送信する場合は、必要なフィールドのみが送信されていることを確認してください。特に大きなフォームでは、フォームのサブセクションと ajax を統合します。

于 2013-02-16T02:02:20.603 に答える