I have this page:
<c:forEach begin="0" end="#{tareaController.tipoFuncion.filas}" step="1" var="x">
<p:row>
<c:forEach begin="0" end="#{tareaController.tipoFuncion.columnas}" step="1" var="y">
<c:choose>
<c:when test="#{tareaController.configuracionEnPosicion(x,y) ne null}">
<p:column style="width: 80px"
colspan="#{tareaController.configuracionEnPosicion(x,y).colSpan}"
rowspan="#{tareaController.configuracionEnPosicion(x,y).rowSpan}">
<p:outputLabel value="#{tareaController.atributoEnPosicion(x,y).labelAtributo}:"
rendered="#{!tareaController.validar.isBoton(tareaController.atributoEnPosicion(x, y).tipoAtributosOpcionales)}">
<c:if test="#{tareaController.configuracionEnPosicion(x,y).esObligatorio}">
*
</c:if>
</p:outputLabel>
</p:column>
<p:column colspan="#{tareaController.configuracionEnPosicion(x,y).colSpan}"
rowspan="#{tareaController.configuracionEnPosicion(x,y).rowSpan}">
<c:choose>
<c:when test="#{tareaController.validar.isSeparador(tareaController.atributoEnPosicion(x, y).tipoAtributosOpcionales)}">
<p:separator/>
</c:when>
<c:when test="#{tareaController.validar.isNumerico(tareaController.atributoEnPosicion(x,y).tipoAtributosOpcionales)}">
<pe:inputNumber decimalSeparator="#{tareaController.configuracionEnPosicion(x,y).separadorDecimal}"
thousandSeparator="#{tareaController.configuracionEnPosicion(x,y).separadorMiles}"
decimalPlaces="#{tareaController.configuracionEnPosicion(x,y).cantidadDecimales}"
disabled="#{mFuncion.soloLectura || !tareaController.tareaAceptada || tareaController.tomadaPorOtroUsuario || tareaController.configuracionEnPosicion(x,y).soloLectura}"
maxValue="#{tareaController.configuracionEnPosicion(x,y).valorMaximo}"
rendered="#{!tareaController.configuracionEnPosicion(x,y).ocultarAtributo}"
value="#{tareaController.atributoEnPosicion(x,y).valorAtributoNumerico}"
style="width: #{tareaController.configuracionEnPosicion(x,y).ancho}px; height: #{tareaController.configuracionEnPosicion(x,y).alto}px;">
<p:ajax global="false" update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:nombreRepetido, :f_tarea:b_completarT" listener="#{tareaController.validarTarea()}"/>
</pe:inputNumber>
</c:when>
<c:when test="#{tareaController.validar.isBoton(tareaController.atributoEnPosicion(x, y).tipoAtributosOpcionales)}">
<p:commandButton value="#{tareaController.atributoEnPosicion(x,y).labelAtributo}"
actionListener="#{tareaController.ejecutarWs(tareaController.configuracionEnPosicion(x,y))}"
update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:pg_funcion_#{tareaController.indiceTramite}"/>
</c:when>
<c:when test="#{tareaController.validar.isFecha(tareaController.atributoEnPosicion(x,y).tipoAtributosOpcionales)}">
<p:calendar value="#{tareaController.atributoEnPosicion(x,y).valorAtributoFecha}"
maxdate="#{tareaController.configuracionEnPosicion(x,y).fechaMaxima}"
mindate="#{tareaController.configuracionEnPosicion(x,y).fechaMinima}"
rendered="#{!tareaController.configuracionEnPosicion(x,y).ocultarAtributo}"
disabled="#{mFuncion.soloLectura || !tareaController.tareaAceptada || tareaController.tomadaPorOtroUsuario || tareaController.configuracionEnPosicion(x,y).soloLectura || tareaController.atributoEnPosicion(x,y).bloquear}"
size="20"
pattern="#{tareaController.configuracionEnPosicion(x,y).formatoFecha}">
<p:ajax global="false" update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:nombreRepetido, :f_tarea:b_completarT" listener="#{tareaController.validarTarea()}"/>
<p:ajax event="dateSelect" global="false" update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:nombreRepetido, :f_tarea:b_completarT" listener="#{tareaController.validarTarea()}"/>
</p:calendar>
</c:when>
<c:otherwise test="#{tareaController.validar.isAlfanumerico(tareaController.atributoEnPosicion(x,y).tipoAtributosOpcionales)}">
<p:inputTextarea value="#{tareaController.atributoEnPosicion(x,y).valorAtributoAlfanumerico}"
disabled="#{mFuncion.soloLectura || !tareaController.tareaAceptada || tareaController.tomadaPorOtroUsuario || tareaController.configuracionEnPosicion(x,y).soloLectura}"
rendered="#{!tareaController.configuracionEnPosicion(x,y).ocultarAtributo}"
style="width: #{tareaController.configuracionEnPosicion(x,y).ancho}px;
height: #{tareaController.configuracionEnPosicion(x,y).alto}px;
word-break: normal;">
<p:ajax global="false" update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:nombreRepetido, :f_tarea:b_completarT" listener="#{tareaController.validarTarea()}"/>
<p:ajax event="select" global="false" update=":f_tarea:tabView:tab_#{tareaController.indiceTramite}:nombreRepetido, :f_tarea:b_completarT" listener="#{tareaController.validarTarea()}"/>
</p:inputTextarea>
</c:otherwise>
</c:choose>
</p:column>
</c:when>
<c:otherwise>
<p:column>
<h:panelGroup/>
</p:column>
<p:column>
<h:panelGroup/>
</p:column>
</c:otherwise>
</c:choose>
</c:forEach>
The idea is that I can configure that page and place the components in the position I want with lots of different configurations. It work pretty fine and people is happy with that, but I'm not. If you check on the page I call the methods configuracionEnPosicion(x,y) and atributoEnPosicion(x,y) like 300 times on every run on the cycle. And these methods call like other 3 methods and do a foreach for find the actual configuration in x,y. Amazingly it doesn't work slow but I feel like that's a lot of overhead that I can avoid.
Before I tried to save the result of configuracionEnPosicion(x,y) and atributoEnPosicion(x,y) in a variable on the client side with their respective getter and setter, but since the JSTL Core tag runs on build time, in rendering time that variable was not updated, resulting in that variable keeping its last value and giving a not desired behavior. My "solution" was the actual one, but my final question is: Is there a way to store the value of that variable so I'd could only keep it alive during build time or something like that? I'd like to call these methods just ONCE per every x and y position, but my knowledges on JSF and Primefaces are not enough to achieve that.
Aditional information:
- Apache Tomcat 7.0.41.
- JSF 2.2
- Primefaces 4.0
- Mojarra 2.7.2
- jstl-1.2