Componente Media con Streamed Content
En esta guía técnica vamos a explicar como utilizar el componente <p:media> de Primefaces que obtiene los valores a mostrar mediante contenido en Stream de datos.
Tenemos que tener encuenta varios escenarios, que tienen que ver con el ambito del componente que procesas las peticiones.
Pero lo primero que tenemos que verificar la configuración en el fichero components.xml de la declaración del context-filter primefacesResources. La configuración correcta es:
<web:context-filter name="primefacesResources" regex-url-pattern="/javax\.faces\.resource/dynamiccontent\.properties\.seam(;/.*\.pdf)?" />
Conversacion Temporal y Bean de Respaldo con Ambito Event o Page
En este caso estamos en el escenario, en el cual, las peticiones se hacen en conversaciones temporales y el bean de respaldo tiene ambito Event o Page.
Veamos la configuración del componente en la página XHTML.
<p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" width="100%" height="300px">Your browser can't display pdf.</p:media>
El componente <p:media> esta obteniendo el documento menidante la propiedad document del componente primeFacesMediaBean. Indicamos que el player es el que procesa documentos PDFs. Lo importante es el manejo de los contenidos en stream y no el tipo de contenido en sí.
Veamos el código del bean de respaldo:
package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.ResourceLoader; import org.jboss.seam.document.DocumentData.DocumentType; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; import es.um.atica.seam.document.GlobalDocumentStore; @Name( "primeFacesMediaBean" ) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_documento.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); GlobalDocumentStore.instance().saveData( DOCUMENT_NAME, new FundeWebDocumentData( "mi_documento", new DocumentType("pdf", DOCUMENT_MIMETYPE), document, false ) ); } public StreamedContent getDocument() { return (StreamedContent) ( (FundeWebDocumentData) GlobalDocumentStore.instance().getDocumentData( DOCUMENT_NAME ) ).getData(); } }
En este caso, el componente tiene ámbito Event y tenemos el método obtenerDocumento() que obtiene el documento que esta dentro de la carpeta WEB-INF del módulo Web. La forma de obtener el docuemnto o medio, es indiferente.
En este método creamos una instancia de la clase DefaultStreamedContent que implementa la interface StreamedContent, todas de la líbrería PrimeFaces. Hay tres clases que implementan dicha interface, que son:
- ByteArrayContent: donde el contenido es un objeto byte[].
- DefaultStreamedContent: donde el contenido es una instancia de una clase que implementa la interface InputStream.
- LazyDefaultStreamedContent: clase abstracta, donde el contenido es una instancia de una clase que implementa la interface InputStream. Pero que se puede iniciar de forma lazy. Hay que definir el método initializeStream().
Para terminar con el método obtenerDocumento(), guardamos el objeto StreamedContent dentro del componente GlobalDocumentStore. Un almacen de documentos de ambito sesión, que funciona de la siguiente manera:
- Los documentos almacenados se borran automaticamente a los 60 segundos, aunque se puede especificar el tiempo de espurgo mendiante la propiedad keepAlive, al almacenar el documento.
- Por defecto, cuando se recupera el documento del almacen, este se borra. Se puede modificar este comportamiento con la propiedad removeAfterRetrieve de la clse FundeWebDocumentData, por defecto su valor es true, por eso en el ejemplo pasamos el valor false, en el último parámetro del constructor.
Conversacion de Largo Recorrido y Bean de Respaldo con Ambito Event o Page
En este escenario podemos utilizar la estrategia anterior u otra diferente, donde almacenamos los documentos en http://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/document/DocumentStore.html\DocumenStore. Este es un almacen de documentos de ámbito conversación, por lo que todos los documentos son destruidos al eliminarse la conversación,a diferencia del GlobalDocumentStore.
Veamos la configuración del componente en la página XHTML.
<p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" width="100%" height="300px">Your browser can't display pdf. <s:conversationId /> </p:media>
Veamos el código del bean de respaldo:
package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.ResourceLoader; import org.jboss.seam.document.DocumentData.DocumentType; import org.jboss.seam.document.DocumentStore; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); DocumentStore.instance().saveData( DOCUMENT_NAME, new FundeWebDocumentData( "mi_docuemnto", new DocumentType("pdf", DOCUMENT_MIMETYPE), document) ); } public StreamedContent getDocumento() { return (StreamedContent) ( (FundeWebDocumentData) DocumentStore.instance().getDocumentData( DOCUMENT_NAME ) ).getData(); } }
Conversacion temporal y Bean de Respaldo con Ambito Conversacion
En este caso utilizamos una estrategia similar a la primera.
Conversacion de largo recorrido y Bean de Respaldo con Ambito Conversacion
En este caso utilizamos una estrategia similar a la segunda o la siguiente:
Veamos la configuración del componente en la página XHTML.
<p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" width="100%" height="300px">Your browser can't display pdf. <s:conversationId /> </p:media>
Veamos el código del bean de respaldo:
package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.core.ResourceLoader; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) @Scope(ScopeType.CONVERSATION) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); } public StreamedContent getDocumento() { return document ; } }
Bean de Respaldo con Ambito Sesión o Aplicación
Veamos la configuración del componente en la página XHTML.
<p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" width="100%" height="300px">Your browser can't display pdf. </p:media>
Veamos el código del bean de respaldo:
package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.core.ResourceLoader; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) @Scope(ScopeType.SESSION) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); } public StreamedContent getDocumento() { return document ; } }
— JUAN MIGUEL BERNAL GONZALEZ 14/02/2019 08:47
- fdw2.0/fundeweb2.0/gt/componente_media_streamedcontent.txt
- Última modificación: 15/02/2019 11:05
- por JUAN MIGUEL BERNAL GONZALEZ