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

sch*_*olt 3 jsf facelets taglib jsf-2.2

我正在将旧项目从 JSF 1.1 升级到 JSF 2.2。具体来说,我将 JSF 实现从 MyFaces 1.1 升级到 MyFaces 2.2.12,用 Facelets 替换 JSP 并升级/替换过时的标签库。我主要使用从 JSF 1.2 迁移到 JSF 2.0作为指南。

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

由于现在可以在带有 JSF2 的 XML Facelets 中使用纯 HTML 标记,因此我现在正在从htmLibtaglib 中删除所有出现的标记,<htm:div>...</htm:div>例如<div>...</div>.

但是,从使用的一些标签htmLib包含render用于条件渲染的属性,如下所示:

<htmLib:h4 render="someCondition">
   ...
</htmLib:h4>
Run Code Online (Sandbox Code Playgroud)

因为纯 HTML 标签没有render用于此目的的属性,所以我正在寻找一种有条件地呈现纯 HTML 标签的替代方法,并在 SO 上偶然发现了这个答案:如何有条件地呈现像 <div> 这样的纯 HTML 元素?

所以,我的想法是用类似的东西替换上面的结构

<ui:fragment render="someCondition">
   <h4>
      ...
   </h4>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 将 HTML 标签包装在<ui:fragment>带有render 属性的标签内是否是有条件地呈现 HTML 标签的推荐方式,还是这种方法仅对链接问题中的情况有效并推荐?
  • 是否有其他方法可以在 Facelets 中有条件地呈现纯 HTML 标签,这应该是首选?
  • <ui:fragment>包装方法是否有效,无论其中包含哪种纯 HTML?
  • 可以<ui:fragment>嵌套条件渲染块吗?

Xtr*_*ica 5

没有限制在。甚至不是包装ui:fragment

基本上:

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

你里面的 HTML 不是问题。JSF 作为服务器端框架,在服务器中执行所有 HTML 构建/渲染工作,因此 JSF/facelet 标记在发送响应之前被转换为 HTML。您在其中使用的所有纯 HTML 都将保留为 HTML。

但是,从 1.x 迁移时,请注意在 UI 组件使用标签处理程序。标记处理程序 ( ui:include, c:if, c:forEach)UI 组件(通常包含rendered子句)之前评估。这一直是 JSF 2 中冲突的根源。