gpt4 book ai didi

java - 调用 ServletOutputStream 后转发到 JSP

转载 作者:行者123 更新时间:2023-11-30 06:38:20 28 4
gpt4 key购买 nike

据我所知,这属于“你不能那样做”的范畴。我即将重新考虑我的解决方案并解决它,但我认为在这里提问至少值得一试。

我的 JSP/Spring/Struts Servlet 生成报告,将它们写入 PDF,并将它们排队等待下载,然后等待用户请求更多报告。细节不是太重要。我使用以下函数调用将 PDF 流式传输到服务器:

public static void streamFileToBrowser(File docFile, HttpServletResponse response) throws Exception {
try {
// return file to user
// set contextType
response.setContentType("application/pdf");
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setHeader("Content-Disposition","attachment; filename=" + docFile.getName() );

ServletOutputStream outs = response.getOutputStream();
byte[] outputFileBytes = util_getBytesFromFile(docFile.getAbsolutePath());
response.setContentLength(outputFileBytes.length);
outs.write(outputFileBytes); // byte[]
outs.flush();
outs.close();
} catch (Exception e) {
throw e;
}
}

这很简单。我使用响应的 ServletOutputStream 对象来传送我的位。它运行良好。

但是,有时我会捕获一些在生成报告期间导致的错误。它们是信息性消息,例如“没有来自帐户等等的订单”。我的 JSP 中有一个部分将捕获并显示这些内容。

问题来了:当我没有要发送的报告时,我不会调用上述函数。但我总是这样称呼:

return mapping.findForward("pullReports");

作为我的 ActionForward 方法的最后一行,出现了错误。但是,如果我有要通过 streamFileToBrowser() 函数发送的位,我对 mapping.findForward 的最终调用不会执行任何操作。

一点挖掘告诉我,Struts 一次只能处理对 HttpServletResponse 对象的一个​​响应。我在调用 streamFileToBrowser() 时使用了它,因此最终调用 mapping.findForward(...) 对我的客户而言没有任何作用。

还有其他人遇到这个问题并找到了解决方案吗?

最佳答案

我所做的是尽可能确保在 PDF 生成开始之前捕获所有错误。这样你就可以发回一组普通的旧表单错误,或者其他什么。一旦您开始发回这样的附件,浏览器就不会再关注任何其他内容。如果您在生成 PDF 文件之前绝对找不到错误,我认为您唯一能做的就是将错误消息嵌入 PDF 本身(我知道这很不愉快)。

关于java - 调用 ServletOutputStream 后转发到 JSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336925/

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