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:param
。String
関数に戻り値を追加し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
ませんでしたが、この特定の機能のために送信する必要のないフォーム内のフィールドであると想定しています。