替代ui:JSF中的片段

时间:2010-09-14 22:48:04

标签: java jsf

我正在搜索支持的方式来渲染JSF中的一段代码,我通常使用这种方法:

<ui:fragment rendered="#{condition}">
   <h:outputText value="text 1"/>
   <h:outputText value="text 2"/>
   <h:outputText value="text 3"/>
</ui:fragment>

由于ui:fragment不支持渲染大部分IDE(比如netbeans将其标记为错误但是它可以工作,因为在JSF参数中是继承的。

解决此问题的一种方法是使用其他结构(例如,如果您使用SEAM),您可以使用

<s:div rendered="#{condition}">
   ....
</s:div>

另一种方法是在所有内部内容中设置渲染,如下所示:

<h:outputText value="text 1" rendered="#{condition}"/>
<h:outputText value="text 2" rendered="#{condition}"/>
<h:outputText value="text 3" rendered="#{condition}"/>

但我不喜欢这种方式,因为你必须将渲染添加到每个元素。

另一种方法是使用<c:if test="#{condtion}">但是c:如果从JSF树中删除元素,而不是你总是想要做的,特别是如果你使用AJAX。

所以你们有另一种解决方案吗?

1 个答案:

答案 0 :(得分:55)

  

由于ui:fragment不支持呈现大部分IDE(如Netbeans将其标记为错误但是它可以正常运行,因为在JSF参数中是继承的)

这实际上是JSF 2.0 Facelets标记文件声明中的错误(在Mojarra中,即com/sun/faces/metadata/taglib/ui.taglib.xml文件)。 rendered属性在标记文件声明(以及JSF 2.0 <ui:fragment> tag documentation)中被忽略和遗漏,而UIComponent中的确实。 IDE验证基于标记文件声明,因此它会产生误导性验证错误。此问题已在JSF 2.1中修复,缺少的属性将添加到标记文件声明(以及JSF 2.1 <ui:fragment> tag documentation)中。

如果无法忽略IDE警告或升级到JSF 2.1,则可以考虑使用the <h:panelGroup> component代替:

<h:panelGroup rendered="#{condition}">
   <h:outputText value="text 1"/>
   <h:outputText value="text 2"/>
   <h:outputText value="text 3"/>
</h:panelGroup>

如果您未指定idstylestyleClass和类似属性,则无论如何都不输出,否则将呈现简单的<span>

如果您拥有的只是普通的HTML(即没有JSF组件),那么您也可以考虑使用<f:verbatim>

<f:verbatim rendered="#{condition}">
   text 1
   text 2
   text 3
</f:verbatim>

但是,JSF 2.0中的<f:verbatim> 已弃用(顺便说一下,这也是一个纪录片错误,JSF 2.0 <f:verbatim> tag documentation没有提及弃用,但{ {3}}确实如此。