ventana pagina misma evento con cerrar capturar abrir javascript jsf primefaces download new-window

javascript - pagina - Actualizar/navegar la página actual mientras se abre/descarga el archivo en una nueva pestaña/ventana



abrir pagina en la misma ventana jquery (2)

Como dijo BalusC, Refresh/navigate current page y opening downloading file son dos respuestas diferentes, debe haber dos resúmenes. Encontré un problema similar. Lo resolví con jsf ajax con éxito.

Aquí hay parte de mi código:

XHTML:

<h:commandButton id="download-button" class="download-button" value="download"> <f:ajax event="click" execute="@form" render=":msg-area" listener="#{myController.checkForDownload}" onevent="checkCallBack" /> </h:commandButton> <h:commandButton id="download-button2" class="download-button2" value="download" style="display: none;" action="#{myController.download}"> </h:commandButton>

Javascript:

function checkCallBack(data) { var ajaxStatus = data.status; switch (ajaxStatus) { case "begin": break; case "complete": break; case "success": document.getElementById(''download-form:download-button2'').click(); break; } }

download-button muestra un área de mensaje en la página y download-button2 activa un método de descarga. son dos solicitudes diferentes Cuando se complete la primera solicitud, se activará la segunda solicitud.

Tengo un botón que abre una nueva pestaña con un archivo PDF generado. Sin embargo, después de hacer clic en el botón, quiero navegar a otra página.

Eso significa que, después de hacer clic en el botón, quiero abrir una nueva pestaña con el pdf y navegar a otra página en la pestaña inicial. Estoy usando primefaces p:commandButton y lo intenté con onclick="window.location.href=''www.google.de''" pero no funciona. Sin embargo, onclick="window.lalert(''www.google.de'')" funciona.

Este es mi código:

<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() crea un archivo PDF con el siguiente código, creo que aquí está el problema:

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();


Básicamente estás tratando de enviar 2 respuestas a 1 solicitud. Esto nunca va a funcionar en HTTP. Si desea enviar 2 respuestas, debe permitir que el cliente active 2 solicitudes de alguna manera. Ya estaba buscando la solución correcta en la dirección correcta, con poca ayuda de JavaScript es posible activar varias solicitudes en un solo evento (clic). Sin embargo, su intento de onclick no es válido, el cambio de window.location al hacer clic en el botón de enviar, justo antes del envío del formulario, cancela por completo la acción original del botón, al enviar el formulario.

Su mejor opción es navegar directamente a la página de resultados que, a su vez, invoca JavaScript window.open() al cargar la página, apuntando a la URL del archivo PDF que desea abrir. Es posible que no se pueda enviar código HTML / JS junto con el archivo PDF que da instrucciones para la navegación (ya que esto obviamente dañaría el archivo PDF). Esto también significa que no puede devolver el PDF directamente a la solicitud de envío del formulario. El código debe rediseñarse de tal forma que el PDF pueda recuperarse mediante una solicitud GET subsiguiente. La mejor forma es usar un servlet simple. Puede almacenar el PDF generado temporalmente en el disco o en la sesión, asociado con una clave única, y pasar esa clave única como request pathinfo o parameter al servlet en window.open() URL.

Aquí hay un ejemplo de inicio:

Forma inicial:

<h:form> ... <p:commandButton ... action="#{bean.submit}" /> </h:form>

Frijol:

public String submit() { File file = File.createTempFile("zertifikat", ".pdf", "/path/to/pdfs"); this.filename = file.getName(); // Write content to it. return "targetview"; }

Vista de destino:

<h:outputScript rendered="#{not empty bean.filename}"> window.open(''#{request.contextPath}/pdfservlet/#{bean.filename}''); </h:outputScript>

Servlet de PDF (nullchecks, etc., omitido por brevedad, se supone que Java 7 para 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()); } }