gpt4 book ai didi

java - 当响应包含文件时,页面导航/渲染响应阶段将被忽略

转载 作者:行者123 更新时间:2023-12-01 05:51:56 25 4
gpt4 key购买 nike

JSF/Seam。我有一个页面,它接受用户通过表单提供的一些参数,然后(当用户单击页面上的按钮时)服务器生成一个文件并将其发送到响应中,以便提示用户保存 -作为对话框。

这是我遇到问题的场景:

  1. 如果用户最初输入无效输入,然后单击按钮,Seam 会处理该请求,但会在“处理验证”阶段停止。然后我的页面会显示验证错误消息。
  2. 接下来,如果用户输入正确的内容并单击按钮,Seam 会调用我的操作处理程序,生成文件并在响应中发送给用户 - 但仍然显示验证错误消息!

最初,我尝试了一些技巧来强制重新渲染 <h:messages/>标签,但没有什么令人满意的。 我现在怀疑根本原因是因为当我将文件放入响应中时,Seam 没有进入渲染响应阶段。

这是我的按钮:

<h:commandButton value="#{messages.Reports_RunReportPDF}"
action="#{bean.generateReportPdf}"/>

这是我的操作处理程序:

public String generateReportPdf() throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse();

ServletOutputStream servletOutputStream = response.getOutputStream();

// add this header to make browser prompt user with a save-as dialog
response.addHeader("Content-Disposition",
"attachment;filename=" + reportName + ".pdf");
response.setContentType(exportType.contentType());

try {
HashMap<String, Object> parameters = getReportParameters();
ReportContent content = createReport(parameters);

servletOutputStream.write(content.getContents());
servletOutputStream.flush();
servletOutputStream.close();
} catch (ReportingException e) {
e.printStackTrace();
return "fail";
}

return "success";
}

如果我注释掉添加文件的代码(并且只返回 "success" ,则页面将遵循我正确设置的导航规则。但是使用该文件,页面将与添加文件之前完全相同。按钮被按下。

那么,我怎样才能在响应中返回一个文件,并导致 <h:messages/>标签要重新渲染?

最佳答案

So, how can I both return a file in the response, and cause the tag to be rerendered?

这对于单个 HTTP 请求来说是不可能的。每个请求只能返回一个响应。这不是 JSF 限制,而是 HTTP 限制。

can使用 JavaScript 通过单击触发两个 HTTP 请求,但在您的特定情况下,这不会很好地工作,因为 JSF 对消息的请求取决于 PDF 下载请求的结果。除了让 servlet 设置代表 PDF 导出状态的 session 范围托管属性并引入 ajax 轮询(每隔一段时间请求该属性并在它不再为空时停止)之外,我没有看到其他方法。

关于java - 当响应包含文件时,页面导航/渲染响应阶段将被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com