JSF 中 ui:fragment 的替代方法

2022-09-01 12:44:22

我正在搜索一种受支持的方法来呈现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}"/>

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

另一种方法是使用 BUT c:if 从 JSF 树中删除元素,而不是你一直想要做的事情,尤其是在使用 AJAX 的情况下。<c:if test="#{condtion}">

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


答案 1

由于ui:fragment不支持渲染的大多数IDE(如Netbeans将其标记为错误,但它有效,因为在JSF中参数是继承的)

这实际上是 JSF 2.0 Facelets 标记文件声明中的一个错误(在 Mojarra 中,就是该文件)。该属性在标记文件声明中(以及在 JSF 2.0 <ui:fragment> 标记文档中)中被忽略和丢失,而它确实存在于 .IDE 验证基于标记文件声明,因此会产生误导性的验证错误。此问题在 JSF 2.1 中已修复,缺少的属性已添加到标记文件声明中(以及在 JSF 2.1 <ui:fragment> 标记文档中)。com/sun/faces/metadata/taglib/ui.taglib.xmlrenderedUIComponent

如果不能忽略 IDE 警告或升级到 JSF 2.1,那么您可以考虑改用 <h:panelGroup> 组件

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

如果您不指定 、 和 like 属性,则它无论如何都不会输出任何内容,否则将呈现一个简单的属性。idstylestyleClass<span>

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

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

但是,在 JSF 2.0 中不推荐使用(顺便说一句,JSF 2.0 <f:verbatim> 标记文档没有提到弃用,但 JSF 2.1 <f:verbatim> 标记文档提到了)。<f:verbatim>


答案 2

推荐