JSF 1.1:有条件地隐藏原始 HTML 和标签
Posted
技术标签:
【中文标题】JSF 1.1:有条件地隐藏原始 HTML 和标签【英文标题】:JSF 1.1: Conditionally hide raw HTML and tags 【发布时间】:2012-09-01 01:12:37 【问题描述】:我正在尝试更改 JSF 1.1 页面以有条件地隐藏页面的某些部分。该页面是使用混合的原始 html 和标签构建的。具体来说,我有以下几点:
<table>
<tr>
<td>Foo</td>
<td><h:inputText ... /></td>
</tr>
<tr>
<td>Bar</td>
<td><h:inputText ... /></td>
</tr>
<!-- more stuff, including <h:dataTable>
</table>
我想将它包装在一个有条件地隐藏整个表格的标签中,但我似乎无法弄清楚。这是我尝试过的:
将标记包装在<h:panelGroup rendered="...">
中。虽然这个正确显示/隐藏了标记,但所有原始 HTML 都从生成的 HTML 中剥离。
将标记包装在<f:verbatim>
中。这不起作用,因为逐字标记在 JSF 1.1 中没有渲染属性
将整个内容封装在<h:panelGroup rendered="..."><f:verbatim>
组合中。这与第一次尝试的效果相同。
我也尝试过<f:view>
和<f:subview>
无济于事。
我知道可以在 JSF 页面中包含 JSTL 标记并使用<c:if>
,但我想避免这种情况。有什么想法吗?
注意:我意识到(至少在某些人看来)混合 HTML 和 JSF 被认为是不好的做法,但是这个页面是由其他人创建的,我只需要修改它(它的页面有点大,上面的 HTML只是它的一个小sn-p)..
【问题讨论】:
【参考方案1】:将<table>
替换为<h:panelGrid>
。
<h:panelGrid columns="2">
<h:outputText value="Foo" />
<h:inputText ... />
<h:outputText value="Bar" />
<h:inputText ... />
<!-- more stuff, including <h:dataTable>
</h:panelGrid>
或者使用 CSS display:none/block:
<table style="display: $some condition ? 'none' : 'block';">
或者只是升级到 JSF 1.2。从技术上讲,JSF 1.1 Web 应用程序可以轻松升级到 JSF 1.2,而无需更改任何代码。只需更新 JAR 并更改 faces-config.xml
根声明以将 JSF 1.1 DTD 替换为 JSF 1.2 XSD。 JSF 1.2 附带了一个改进的视图处理程序,它消除了<f:verbatim>
的噩梦(即不再需要它)。它还附带了许多错误修复和性能增强,您会非常感谢。
与具体问题无关,至于您关于混合 HTML 和 JSF 是一种不好的做法的说法,这不一定是正确的。至少自 JSF 1.2 起不再。在 JSF 1.0/1.1 上,您需要使用 <f:verbatim>
,这反过来确实是开发/维护的痛苦。这导致了混合 JSF/HTML 是“坏”的错误神话。另请参阅 What are the main disadvantages of Java Server Faces 2.0? 了解有关这方面的一些历史记录。
【讨论】:
以上是关于JSF 1.1:有条件地隐藏原始 HTML 和标签的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用带有 render 属性的 ui:fragment 来有条件地在带有 JSF 2.2 的 Facelets 中呈现 HTML 标记吗?