我应该使用 ui:fragment 和 render 属性来有条件地在带有 JSF 2.2 的 Facelets 中呈现 HTML 标签吗?

Should I use ui:fragment with the render attribute to conditionally render HTML tags in Facelets with JSF 2.2?

我正在将旧项目从 JSF 1.1 升级到 JSF 2.2。具体来说,我正在将 JSF 实现从 MyFaces 1.1 升级到 MyFaces 2.2.12,将 JSPs 替换为 Facelets 和 upgrading/replacing 过时的标记库。我主要使用 Migrating from JSF 1.2 to JSF 2.0 作为指导。

该项目在其 JSP 页面中使用了一些名为 htmLib 的标记库,其名称空间为 http://jsftutorials.net/htmLib。我再也找不到关于这个标签库的任何文档,无论是在 jsftutorials 网页上还是在其他地方,但显然它被用来包含普通的 HTML 标签,比如 <div><table> in JSP 页。

由于纯 HTML 标签现在可以在 XML Facelets with JSF2 中使用,我现在正在从 htmLib 标签库中删除所有出现的标签,例如 <htm:div>...</htm:div>并用普通的 HTML 标签替换它们,例如 <div>...</div>

但是,htmLib 中使用的一些标签包含用于条件呈现的 render 属性,例如:

<htmLib:h4 render="someCondition">
   ...
</htmLib:h4>

因为普通 HTML 标签没有用于此目的的 render 属性,我正在寻找一种替代方法来有条件地呈现普通 HTML 标签并偶然发现了这个答案所以:How to conditionally render plain HTML elements like <div>s?

所以,我的想法是用类似

的东西替换上面的构造
<ui:fragment render="someCondition">
   <h4>
      ...
   </h4>
</ui:fragment>

我的问题:

没有限制。甚至不用于包装 ui:fragment.

基本上:

  • 为了只是控制里面的内容,没有额外的HTML生成使用 ui:fragment.
  • 要生成额外的 HTML span 元素,请使用 h:panelGroup.
  • 要生成额外的 HTML div 元素,请使用 h:panelGroup layout="block".

你里面的HTML不是问题。 JSF 作为服务器端框架,在服务器中执行所有 HTML building/rendering 作业,因此 JSF/facelet 标记在发送响应之前被转换为 HTML。您在内部使用的所有普通 HTML 将保留 HTML.

但是,从1.x迁移时要注意using tag handlers inside UI Components。标记处理程序(ui:includec:ifc:forEach)在 之前评估 UI 组件(通常包含 rendered 子句).这一直是 JSF 2 中冲突的根源。