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"/>

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

另一种方法是使用&lt;c:if test="#condtion"&gt; 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 &lt;ui:fragment&gt; tag documentation)中被忽略和缺失,而它确实存在于UIComponent 中。 IDE 验证基于标记文件声明,因此会产生误导性验证错误。这个问题在 JSF 2.1 中得到修复,缺少的属性被添加到标记文件声明中(也在 JSF 2.1 &lt;ui:fragment&gt; tag documentation 中)。

如果忽略 IDE 警告或升级到 JSF 2.1 不是一个选项,那么您可以考虑使用 the &lt;h:panelGroup&gt; component 代替:

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

如果您不指定idstylestyleClass 等属性,它不会输出任何内容,否则将呈现一个简单的&lt;span&gt;

如果您拥有的只是普通的 html(即没有 JSF 组件),那么您也可以考虑使用 &lt;f:verbatim&gt;

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

但是,&lt;f:verbatim&gt; 在 JSF 2.0 中被弃用(顺便说一下,这也有一个文档错误,JSF 2.0 &lt;f:verbatim&gt; tag documentation 没有提及弃用,但 JSF 2.1 &lt;f:verbatim&gt; tag documentation 确实如此) .

【讨论】:

以上是关于JSF 中 ui:fragment 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

“ui:fragment”中的“rendered”属性

是否有可用的 AJAX JSF 库列表?

java中的Web开发存在哪些Spring+JSF/Facelets的替代品?

JSP for Spring MVC视图层的替代方案

JSF 视图技术如何翻译客户端?

何时从容器管理的安全性转移到 Apache Shiro、Spring Security 等替代方案?