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该方法被调用。没有它,它会重新加载当前页面,而不会调用 action 方法。

我尝试了一些不同的东西......有或没有任何f:params。向函数添加String返回值downloadPDF()编辑:带走target="_blank"参数。使用actionListener而不是action. 使用时action,不会调用 bean 方法,但我在h:messages:中收到此错误消息Conversion Error setting value '' for 'null Converter'.

无法让它调用该函数。我希望得到的是,当单击 downloadPDF 链接时,它会打开一个新窗口并下载 PDF。

任何帮助将不胜感激。

编辑 2 / 解决方案(临时)

我已经设法使用属性来完成这项工作immediate="true"。仍然没有找到给我的确切字段Conversion Error,但我假设是表单中的一个字段,不需要为此特定功能提交。

4

1 回答 1

1

与问题相关的逻辑很好。问题在于表单中的其他项目保持为空。与Edit 2一样,添加immediate="true"make it 以便将我需要的字段单独发送到 servlet。

学过的知识

在 JSF 中提交表单的一部分时,请确保只提交您需要的字段。尤其是在大型表单中并将 ajax 与表单的子部分集成。

于 2013-02-16T02:02:20.603 回答