我应该使用 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>
我的问题:
- 正在使用
render
将 HTML 标签包装在 <ui:fragment>
标签内
将推荐的方式归因于有条件地呈现 HTML 标签,或者
此方法是否仅对链接问题中的案例有效和推荐?
- 是否有其他方法可以在 Facelets 中有条件地呈现纯 HTML 标记,应该是首选?
<ui:fragment>
包装方法是否有效,无论其中包含哪种普通 HTML?
- 可以嵌套条件渲染的
<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:include
、c:if
、c:forEach
)在 之前评估 UI 组件(通常包含 rendered
子句).这一直是 JSF 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>
我的问题:
- 正在使用
render
将 HTML 标签包装在<ui:fragment>
标签内 将推荐的方式归因于有条件地呈现 HTML 标签,或者 此方法是否仅对链接问题中的案例有效和推荐? - 是否有其他方法可以在 Facelets 中有条件地呈现纯 HTML 标记,应该是首选?
<ui:fragment>
包装方法是否有效,无论其中包含哪种普通 HTML?- 可以嵌套条件渲染的
<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:include
、c:if
、c:forEach
)在 之前评估 UI 组件(通常包含 rendered
子句).这一直是 JSF 2 中冲突的根源。