【发布时间】:2015-09-17 20:07:18
【问题描述】:
我有这个页面:
<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>
我的想法是我可以配置该页面并将组件放置在我想要的位置,并使用许多不同的配置。它工作得很好,人们对此很满意,但我不满意。如果您在页面上查看,我会在循环中的每次运行中调用 configuracionEnPosicion(x,y) 和 atributoEnPosicion(x,y) 方法 300 次。这些方法像其他 3 种方法一样调用并执行 foreach 以在 x,y 中查找实际配置。令人惊讶的是,它的运行速度并不慢,但我觉得这是我可以避免的很多开销。
在我尝试将 configuracionEnPosicion(x,y) 和 atributoEnPosicion(x,y) 的结果与它们各自的 getter 和 setter 一起保存在客户端的变量中之前,但是由于 JSTL Core 标记在构建时运行,因此在渲染时间该变量未更新,导致该变量保持其最后一个值并给出不希望的行为。我的“解决方案”是实际的,但我的最后一个问题是:有没有办法存储该变量的值,所以我只能在构建时保持它的生命或类似的东西?我想在每个 x 和 y 位置只调用一次这些方法,但我对 JSF 和 Primefaces 的了解不足以实现这一点。
附加信息:
- Apache Tomcat 7.0.41。
- JSF 2.2
- Primefaces 4.0
- Mojarra 2.7.2
- jstl-1.2
【问题讨论】:
-
configuracionEnPosicion 的返回类型是什么?
-
抱歉,之前没有读过这个:一个 JPA 实体。所以,一个带有数据的 POJO。
标签: jsf jsf-2 primefaces