java - ui repeat jsf
Alternativa a ui: fragmento en JSF (1)
Dado que
ui:fragment
no admite la mayoría de los IDE (como Netbeans lo marcan como error PERO funciona porque en JSF se heredan los parámetros)
Esto es realmente un error en la declaración del archivo de etiqueta JSF 2.0 Facelets (en Mojarra, ese es el archivo com/sun/faces/metadata/taglib/ui.taglib.xml
). El atributo rendered
se pasa por alto y falta en la declaración del archivo de etiqueta (y también en la documentación de la etiqueta JSF 2.0 <ui:fragment>
), mientras que está realmente presente en el UIComponent
. La validación IDE se basa en las declaraciones del archivo de etiqueta y, por lo tanto, da un error de validación engañoso. Este problema se corrigió en JSF 2.1, el atributo que falta se agrega a la declaración del archivo de etiqueta (y también en la documentación de la etiqueta JSF 2.1 <ui:fragment>
).
Si ignorar las advertencias IDE o actualizar a JSF 2.1 no es una opción, entonces puede considerar usar el componente <h:panelGroup>
lugar:
<h:panelGroup rendered="#{condition}">
<h:outputText value="text 1"/>
<h:outputText value="text 2"/>
<h:outputText value="text 3"/>
</h:panelGroup>
No genera nada de todos modos si no especifica los atributos id
, style
, styleClass
y like, de lo contrario se styleClass
un simple <span>
.
Si todo lo que tiene es simple HTML sin formato (es decir, sin componentes JSF), entonces también puede considerar usar <f:verbatim>
.
<f:verbatim rendered="#{condition}">
text 1
text 2
text 3
</f:verbatim>
Sin embargo, la <f:verbatim>
está obsoleta en JSF 2.0 (que a su vez también tiene una falla documental, la documentación de la etiqueta JSF 2.0 <f:verbatim>
no menciona la desaprobación, pero la JSF 2.1 <f:verbatim>
la documentación de la etiqueta lo hace).
Estoy buscando una forma compatible para representar una sección de código en JSF, suelo usar este enfoque:
<ui:fragment rendered="#{condition}">
<h:outputText value="text 1"/>
<h:outputText value="text 2"/>
<h:outputText value="text 3"/>
</ui:fragment>
Dado que ui: fragmento no es compatible con la mayoría de IDE (como netbeans lo marcan como error PERO funciona porque en JSF los parámetros son heredados.
Una forma de resolver esto es usar otra estructura (por ejemplo, si usa SEAM) puede usar
<s:div rendered="#{condition}">
....
</s:div>
Otra forma es configurar el renderizado en todo el contenido interno de esta manera:
<h:outputText value="text 1" rendered="#{condition}"/>
<h:outputText value="text 2" rendered="#{condition}"/>
<h:outputText value="text 3" rendered="#{condition}"/>
Pero no me gusta de esta manera porque tiene que agregar el renderizado a cada elemento.
Otra forma sería usar <c:if test="#{condtion}">
PERO c: si elimina los elementos del árbol JSF y eso no es lo que siempre quiere hacer, especialmente si usa AJAX.
Entonces ustedes tienen otras soluciones?