FlexCache y Paso de parámetros

10/02/2010       Sergio Raposo Vargas. Director técnico de Saga Soluciones       Administración, OpenCms

En este post intentaré explicar un poco un error que me he encontrado esta misma mañana que ha sido de lo más curioso y bueno, aunque es un caso extraño, es posible que a más de uno le haya pasado.

Bueno, resulta que uno de mis “pages” usa un element el cual se dedica a pintar una galería de imágenes. Este element recibirá por parámetro la lista de todas las imágenes que debe pintar. Para ello, en nuestro page cargamos en el request la lista de imágenes:
<c:set var="images" value="${noticia.valueList.Image}" scope="request"/>

Y llamamos a nuestro element:
<cms:include file="%(link.weak:/system/modules/com.saga.opencms.templatesaga/elements/parrafos/c_galeriaImagenesParrafo.jsp:32e5f500-8be0-11de-9b34-6399d30fb500)"/>

Dentro del element tendremos un bucle que nos permitirá recorrer la lista de imágenes:
<c:forEach var="image" items="${images}">

Hasta aquí todo bien. El problema viene cuando a nuestro pages le añadimos la FlexCache.

¿Cómo funciona el cacheado de OpenCms?

Por cada consulta que se haga a la jsp, se comprueba si existe una entrada en la FlexCache correspondiente a esta jsp. Si existe, devuelve lo cacheado, si no, ejecuta la jsp y la cachea para que la próxima consulta no haya que volver a ejecturla.

Lo normal es que usemos la directiva uri en nuestro pages, de esta forma, se creará una entrada en la caché por cada recurso de OpenCms que tenga este page asociado (por ejemplo, imaginaros que es un detalle de una noticia, por cada recurso noticia que use esta jsp se creará una entrada en la caché).

El problema viene que, usando solo la directiva uri, la flexcache no guarda los parámetros almacenados en la sesión ni en el request, de esta forma, el parámetro “images” no se cachea. El resultado, en la primera ejecución como la jsp no está cacheada funciona correctamente. El segundo acceso como si lo está, la coge de la cache, como esa variable no se ha cacheado, no se muestran las imágenes.

La solución:

Rebuscando entre las directivas me encontré con una llamada: Session. La documentación oficial nos dice:

If you use session=(attribute1, attribute2,...) there will be one variation entry generated for every value of all listed session attributes (or combination thereof). You must at least use one attribute value.

Pues eso, usando esta directive hacemos que también se cacheen los parámetros en sesión y por tanto, nuestra lista de imágenes también será cacheada. De esta forma el cacheo se produce correctamente y todo funciona como debe.