我有一个按钮,它会打开一个带有生成的pdf文件的新标签页。但是,单击按钮后,我想导航到另一个页面。
这意味着,单击按钮后,我想用pdf打开一个新标签,然后导航到初始标签上的另一页。我正在使用primefacesp:commandButton
并尝试过,onclick="window.location.href='www.google.de'"
但是它不起作用。但是onclick="window.lalert('www.google.de')"
确实有效。
这是我的代码:
<h:form id="transForm" target="_blank">
<p:commandButton value="Zertifikat erstellen" ajax="false"
label="Speichert die Anmeldung und erstellt ein Zertifikat im PDF-Format"
action="#{transportErfassen.generatePDFZertifikat()}"/>
</h:form>
generatePDFZertifikat()
确实使用以下代码创建了pdf文件,我认为这是问题所在:
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.setResponseContentType("application/pdf" );
externalContext.setResponseHeader("Expires", "0");
externalContext.setResponseHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
externalContext.setResponseHeader("Pragma", "public");
externalContext.setResponseHeader("Content-disposition", "inline; filename=\"" + fileName +"\"");
externalContext.setResponseContentLength(out.length);
externalContext.addResponseCookie(Constants.DOWNLOAD_COOKIE, "true", new HashMap<String, Object>());
//setze explizit auf OK
externalContext.setResponseStatus(200);
OutputStream os = externalContext.getResponseOutputStream();
os.write(out, 0, out.length);
os.flush();
facesContext.responseComplete();
facesContext.renderResponse();
您基本上是在尝试将2个响应发送回1个请求。这永远不会在HTTP中起作用。如果您想发回2个响应,则必须让客户端以某种方式触发2个请求。您已经在为解决方案寻找正确的方向,而在JavaScript的帮助下,有可能在单个事件(点击)上触发多个请求。onclick
但是您的尝试是无效的,在window.location
提交表单之前,单击提交按钮的单击更改完全中止了按钮的原始操作,即提交了表单。
最好的选择是直接导航到结果页面,该页面依次window.open()
在页面加载时调用JavaScript ,指向您要打开的PDF文件的URL。也就是说,无法将一些HTML / JS代码与PDF文件一起发送以指示导航(因为这显然会损坏PDF文件)。这也意味着,您不能将PDF直接返回到表单提交请求。必须重新设计代码,以便可以通过后续的GET请求检索PDF。最好的方法是使用一个简单的servlet。您可以将生成的PDF与唯一键临时存储在磁盘或会话中,并将该唯一键作为请求pathinfo或参数传递给window.open()
URL中的servlet 。
这是一个启动示例:
初始形式:
<h:form>
...
<p:commandButton ... action="#{bean.submit}" />
</h:form>
豆角,扁豆:
public String submit() {
File file = File.createTempFile("zertifikat", ".pdf", "/path/to/pdfs");
this.filename = file.getName();
// Write content to it.
return "targetview";
}
目标视图:
<h:outputScript rendered="#{not empty bean.filename}">
window.open('#{request.contextPath}/pdfservlet/#{bean.filename}');
</h:outputScript>
PDF servlet(为简洁起见,省略了nullchecks等;假定使用Java 7 Files#copy()
):
@WebServlet("/pdfservlet/*")
public class PdfServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File file = new File("/path/to/pdfs", request.getPathInfo().substring(1));
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"zertifikat.pdf\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句