这不能在一个HTTP响应中完成。您需要让客户端发送两个请求,以便您可以返回两个响应;一个清除错误,另一个返回PDF。你只需要在bean的action方法中做一些返工,并且可能添加一个servlet文件服务。
基本上,您需要将PDF存储在本地(临时)磁盘位置或可能存储在内存中,并让JSF有条件地呈现一些JavaScript,然后下载PDF。可以通过指向本地磁盘位置的servlet或其他webapp上下文来下载PDF。
E.g.
<h:form>
...
<h:commandButton value="Download" action="#{bean.submit}" />
<h:panelGroup rendered="#{not empty bean.pdfURL}">
<script>window.location = '#{bean.pdfURL}';</script>
</h:panelGroup>
</h:form>
与
public void submit() {
// Create PDF and store as byte[] in memory, or as File on disk.
// Then create an unique URL to the PDF.
pdfURL = externalContext.getRequestContextPath() + "/pdf/" + pdfID;
}
应该产生一个成功的形式在以下提交(这也应该清除验证错误!)
<script>window.location = '/contextname/pdf/uniquefilename.pdf';</script>
如果您注册了/some/path/to/pdf
作为另一个webapp上下文在服务器配置中,那么你可以将File
存储在那里,它将被下载。但是,如果你不能,因为你必须在服务器配置无法控制,那么你需要创建它映射在/pdf/*
的URL模式和不喜欢的东西在doGet()
方法如下一个servlet:
String filename = request.getPathInfo().substring(1);
File pdf = new File("/some/path/to/pdf", filename);
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Length", String.valueOf(file.length()));
InputStream input = new FileInputStream(pdf);
OutputStream output = response.getOutputStream();
// Now just write input to output.
感谢BalusC,我认为也许可以通过一些JSF技巧在一个请求中完成它。我明天肯定会给你一个想法,谢谢。 – user790399