jsf - para - que es primefaces
PrimeFaces 6.0 no almacena imágenes en el lado del cliente (1)
Los encabezados se ven bien. Esto sugiere que algo en los parámetros de cadena de consulta cambia de solicitud a solicitud. Esto también se interpretaría como un nuevo recurso y, por lo tanto, reventaría el almacenamiento en caché aunque el URI base (el separador de cadenas de consulta de la parte anterior a la URL) sea exactamente el mismo.
Y, de hecho, PrimeFaces 6.0 ha cambiado la forma en que se genera el parámetro de cadena de consulta pfdrid
. Se ha convertido en un UUID
completamente aleatorio que cambia cada vez que se representa HTML <img src>
. Ver también la línea 59 del código fuente PF 6.0 . En PrimeFaces 5.3, se cifró en función de la cadena de expresión EL y, por lo tanto, se garantiza que será el mismo en todas las solicitudes, siempre que la cadena de expresión EL sea la misma. Ver también la línea 53 del código fuente de PF 5.3 .
El cambio fue introducido por Cagatay sin una referencia a un ticket de problema. Por lo tanto, no está claro por qué exactamente se realizó este cambio. Pero, después de todo, ya no le ofrece al cliente la oportunidad de almacenar en caché el contenido dinámico y, por lo tanto, de hecho, disminuiría el rendimiento en ambos extremos. Esto definitivamente vale la pena un boleto de problema en PrimeFaces, así que creé uno: número 1765 .
No veo una manera limpia de resolver esto aparte de piratear el código fuente PrimeFaces. Su mejor <p:graphicImage>
es reemplazar la <p:graphicImage>
por una <h:graphicImage>
con un "servlet simple de vainilla", o si usa la biblioteca de utilidades JSF OmniFaces , entonces la <o:graphicImage>
con un bean simple. Esos enfoques ya están detallados en este Q & A relacionado: Mostrar imagen como byte [] desde la base de datos como imagen gráfica en la página JSF .
Actualización : según el número 1765 , se ha corregido para PrimeFaces 6.1.
Dado un <p:dataTable>
representación de imágenes en una de las columnas.
<p:dataTable id="dataTable" var="row" value="#{bean}"
lazy="true"
skipChildren="true">
<p:column headerText="Image">
<p:cellEditor>
<f:facet name="output">
<p:graphicImage value="#{imageBean.image}" stream="true" cache="true">
<f:param name="id" value="#{row.id}"/>
<f:param name="width" value="100"/>
<f:param name="height" value="100"/>
</p:graphicImage>
</f:facet>
<f:facet name="input">
<p:graphicImage value="#{imageBean.image}" stream="true" cache="true">
<f:param name="id" value="#{row.id}"/>
<f:param name="width" value="100"/>
<f:param name="height" value="100"/>
</p:graphicImage>
<!-- <p:overlayPanel> here for file upload -->
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit">
<p:rowEditor/>
</p:column>
</p:dataTable>
La tabla de datos puede contener otros atributos y columnas esenciales de uso común cuando sea necesario.
Cuando esta tabla se actualiza (Ajaxically), todas las imágenes se obtienen de la base de datos (o del sistema de archivos del disco, si se utiliza) como si el navegador no las almacenara en cache
aunque la cache
se establece explícitamente en true
(que es el valor predeterminado) ) Esto estaba funcionando bien antes con PrimeFaces 5.3 final.
La guía de migración no dice nada al respecto, pero aparentemente algo ha cambiado sobre el almacenamiento en caché <p:graphicImage>
.
¿Alguna sugerencia para solucionar el problema?
En el ejemplo anterior, si la tabla contiene 5 imágenes en 5 filas, por ejemplo, la base de datos se consultará 10 veces en cada actualización hecha a la <p:dataTable>
(excepto la edición de fila en línea que por defecto es la fila actual) que no debería suceder ya que obtener imágenes especialmente de una base de datos es muy costoso.
Los encabezados de solicitud / respuesta usando PrimeFaces 6.0 final (ejecutándose en el final de WildFly 10.0.0), cuando se realiza una solicitud inicial al servidor para servir una imagen (no funciona, las imágenes no se almacenan en caché).
General
Request URL:https://localhost:8443/ContextRoot/javax.faces.resource/dynamiccontent.properties.xhtml?ln=primefaces&v=6.0&pfdrid=aed903cc-daba-4822-a62b-888b9a0ef2ac&pfdrt=sc&id=14&width=100&height=100&pfdrid_c=true
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8443
Response Headers
Cache-Control:max-age=29030400
Connection:keep-alive
Date:Sat, 23 Jul 2016 06:59:54 GMT
Expires:Sun, 23 Jul 2017 06:59:54 GMT
Server:WildFly/10
Transfer-Encoding:chunked
X-Powered-By:Undertow/1
Request Headers
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=4AoRGa1IAPTB4KssnikbO9uUetcQpMupli8BkGga.om-f6b0ea3ad206; __utma=111872281.616526714.1454485589.1468749319.1468751735.4; __utmz=111872281.1454485589.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Host:localhost:8443
Referer:https://localhost:8443/ContextRoot/admin/Brand
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
Query String Parameters
ln:primefaces
v:6.0
pfdrid:aed903cc-daba-4822-a62b-888b9a0ef2ac
pfdrt:sc
id:14
width:100
height:100
pfdrid_c:true
Los encabezados de solicitud / respuesta utilizando PrimeFaces 5.3 final (que se ejecuta en GlassFish 4.1), cuando se realiza una solicitud inicial al servidor para servir una imagen (funciona como se esperaba: las imágenes se almacenan en caché).
General
Request URL:https://localhost:8181/ContextRoot/javax.faces.resource/dynamiccontent.properties.xhtml?ln=primefaces&v=5.3&pfdrid=aAPHlxcQ2lcqfvzacYoCC6iUxLU1VVFp&pfdrt=sc&id=11&width=100&height=100&pfdrid_c=true
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8181
Response Headers
Cache-Control:max-age=29030400
Date:Sat, 23 Jul 2016 07:15:03 GMT
Expires:Sun, 23 Jul 2017 07:15:04 GMT
Pragma:No-cache
Server:GlassFish Server Open Source Edition 4.1
Transfer-Encoding:chunked
X-Powered-By:Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.8)
Request Headers
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=69b5070218cfe0fc6eaac2141c13; __utma=111872281.616526714.1454485589.1468749319.1468751735.4; __utmz=111872281.1454485589.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Host:localhost:8181
Referer:https://localhost:8181/ContextRoot/admin/Brand
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
Query String Parameters
ln:primefaces
v:5.3
pfdrid:aAPHlxcQ2lcqfvzacYoCC6iUxLU1VVFp
pfdrt:sc
id:11
width:100
height:100
pfdrid_c:true