我有一个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
该方法被调用。没有它,它会重新加载当前页面,而不会调用 action 方法。
我尝试了一些不同的东西......有或没有任何f:param
s。向函数添加String
返回值downloadPDF()
。编辑:带走target="_blank"
参数。使用actionListener
而不是action
. 使用时action
,不会调用 bean 方法,但我在h:messages
:中收到此错误消息Conversion Error setting value '' for 'null Converter'.
。
无法让它调用该函数。我希望得到的是,当单击 downloadPDF 链接时,它会打开一个新窗口并下载 PDF。
任何帮助将不胜感激。
编辑 2 / 解决方案(临时)
我已经设法使用属性来完成这项工作immediate="true"
。仍然没有找到给我的确切字段Conversion Error
,但我假设是表单中的一个字段,不需要为此特定功能提交。