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

时间:2017-05-03 14:12:53

标签: jsf jsf-2.2 facelets taglib

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

该项目在其JSP页面中使用了一些名为htmLib的标记库,其名称空间为http://jsftutorials.net/htmLib。我在jsftutorials网页上或其他地方都找不到关于这个标签库的任何文档,但显然它在JSP页面中用于包含<div><table>等纯HTML标签。

由于现在可以在带有JSF2的XML Facelets中使用纯HTML标记,我现在正在从htmLib taglib中删除所有标记,例如<htm:div>...</htm:div>,并用{<div>...</div>之类的纯HTML标记替换它们。 1}}。

但是,htmLib中使用的某些标记包含条件渲染的render属性,如下所示:

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

因为纯HTML标签没有render属性用于此目的,我正在寻找另一种有条件地呈现纯HTML标签的方法,并在SO上发现了这个答案:How to conditionally render plain HTML elements like <div>s?

所以,我的想法是用类似

的方法替换上面的结构
<ui:fragment render="someCondition">
   <h4>
      ...
   </h4>
</ui:fragment>

我的问题:

  • 使用<ui:fragment>将HTML标记包装在render标记内 属性推荐的方式来有条件地呈现HTML标记,或 此方法仅对链接问题中的案例有效并推荐吗?
  • 是否还有其他方法可以在Facelets中有条件地呈现纯文本HTML标签?
  • <ui:fragment>包装方法是否有效,无论其中包含什么类型的纯HTML?
  • 可以有条件地渲染<ui:fragment>块吗?

1 个答案:

答案 0 :(得分:3)

没有限制。甚至不包裹ui:fragment

基本上:

  • 为了控制内部内容,不使用额外的HTML生成 ui:fragment
  • 要生成额外的HTML span元素,请使用h:panelGroup
  • 要生成额外的HTML div元素,请使用h:panelGroup layout="block"

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

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