tutorial framework etiquetas español ejemplo bean jsf event-handling richfaces

jsf - framework - ¿Ejecuta la acción del bean de respaldo en la carga?



jsf primefaces (3)

Puede enviar solo una respuesta por solicitud. No puede enviar dos respuestas (la página misma y el archivo de descarga) por solicitud. Lo mejor que puedes hacer es usar Javascript para enviar un formulario (oculto) después de la carga de la página.

window.onload = function() { document.formname.submit(); }

Me gustaría crear una página de resultados para una página de exportación de informes. Esta página de resultados debe mostrar el estado de la exportación y ofrecer la descarga de esta exportación.

La exportación se realiza en un método de acción. Puedo ejecutarlo a través de commandButton pero debe ejecutarse automáticamente en la carga.

¿Cómo puedo lograr esto?

JSF:

<h:commandButton value="Download report" action="#{resultsView.downloadReport}"/>

Backing Bean:

public String downloadReport() { ... FileDownloadUtil.downloadContent(tmpReport, REPORT_FILENAME); // Stay on this page return null; }

Aclaración: ¿Esto es factible con a4j? Pensé en una solución que una solicitud de Ajax desencadena mi acción downloadReport y su solicitud es la descarga del archivo.


La respuesta anterior enviará el formulario y quizás cambie la navegación.

Use <rich:jsFunction action="#{bean.action}" name="loadFunction" /> y luego window.onload = loadFunction;


También puede resolver esto en JSF 2.0 utilizando eventos del sistema de componentes, específicamente PreRenderViewEvent.

Simplemente cree una vista de descarga (/download.xhtml) que active un oyente de descarga antes del procesamiento.

<?xml version="1.0" encoding="UTF-8"?> <f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"> <f:event type="preRenderView" listener="#{reportBean.download}"/> </f:view>

Luego, en su informe bean (definido usando JSR-299), usted empuja el archivo y marca la respuesta como completa.

public @Named @RequestScoped class ReportBean { public void download() throws Exception { FacesContext ctx = FacesContext.getCurrentInstance(); pushFile( ctx.getExternalContext(), "/path/to/a/pdf/file.pdf", "file.pdf" ); ctx.responseComplete(); } private void pushFile(ExternalContext extCtx, String fileName, String displayName) throws IOException { File f = new File(fileName); int length = 0; OutputStream os = extCtx.getResponseOutputStream(); String mimetype = extCtx.getMimeType(fileName); extCtx.setResponseContentType( (mimetype != null) ? mimetype : "application/octet-stream"); extCtx.setResponseContentLength((int) f.length()); extCtx.setResponseHeader("Content-Disposition", "attachment; filename=/"" + displayName + "/""); // Stream to the requester. byte[] bbuf = new byte[1024]; DataInputStream in = new DataInputStream(new FileInputStream(f)); while ((in != null) && ((length = in.read(bbuf)) != -1)) { os.write(bbuf, 0, length); } in.close(); } }

¡Eso es todo al respecto!

Puede vincular a la página de descarga (/download.jsf), o usar una metaetiqueta HTML para redirigir a ella en una página de presentación.