JSF 中 ui:fragment 的替代方案
Posted
技术标签:
【中文标题】JSF 中 ui:fragment 的替代方案【英文标题】:Alternative to ui:fragment in JSF 【发布时间】:2011-04-12 10:11:35 【问题描述】:我正在寻找一种支持的方式来在 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">
BUT c:if 从 JSF 树中删除元素,这不是您一直想做的事情,尤其是在使用 AJAX 时。
那么你们还有其他解决方案吗?
【问题讨论】:
【参考方案1】:由于
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>
如果您不指定id
、style
、styleClass
等属性,它不会输出任何内容,否则将呈现一个简单的<span>
。
如果您拥有的只是普通的 html(即没有 JSF 组件),那么您也可以考虑使用 <f:verbatim>
。
<f:verbatim rendered="#condition">
text 1
text 2
text 3
</f:verbatim>
但是,<f:verbatim>
在 JSF 2.0 中被弃用(顺便说一下,这也有一个文档错误,JSF 2.0 <f:verbatim>
tag documentation 没有提及弃用,但 JSF 2.1 <f:verbatim>
tag documentation 确实如此) .
【讨论】:
以上是关于JSF 中 ui:fragment 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章