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>

我想将它包装在一个有条件地隐藏整个表格的标签中,但我似乎无法弄清楚。这是我尝试过的:

将标记包装在&lt;h:panelGroup rendered="..."&gt; 中。虽然这个正确显示/隐藏了标记,但所有原始 HTML 都从生成的 HTML 中剥离。 将标记包装在&lt;f:verbatim&gt; 中。这不起作用,因为逐字标记在 JSF 1.1 中没有渲染属性 将整个内容封装在&lt;h:panelGroup rendered="..."&gt;&lt;f:verbatim&gt; 组合中。这与第一次尝试的效果相同。 我也尝试过&lt;f:view&gt;&lt;f:subview&gt; 无济于事。

我知道可以在 JSF 页面中包含 JSTL 标记并使用&lt;c:if&gt;,但我想避免这种情况。有什么想法吗?

注意:我意识到(至少在某些人看来)混合 HTML 和 JSF 被认为是不好的做法,但是这个页面是由其他人创建的,我只需要修改它(它的页面有点大,上面的 HTML只是它的一个小sn-p)..

【问题讨论】:

【参考方案1】:

&lt;table&gt; 替换为&lt;h:panelGrid&gt;

<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 附带了一个改进的视图处理程序,它消除了&lt;f:verbatim&gt; 的噩梦(即不再需要它)。它还附带了许多错误修复和性能增强,您会非常感谢。


与具体问题无关,至于您关于混合 HTML 和 JSF 是一种不好的做法的说法,这不一定是正确的。至少自 JSF 1.2 起不再。在 JSF 1.0/1.1 上,您需要使用 &lt;f:verbatim&gt;,这反过来确实是开发/维护的痛苦。这导致了混合 JSF/HTML 是“坏”的错误神话。另请参阅 What are the main disadvantages of Java Server Faces 2.0? 了解有关这方面的一些历史记录。

【讨论】:

以上是关于JSF 1.1:有条件地隐藏原始 HTML 和标签的主要内容,如果未能解决你的问题,请参考以下文章

在 JSF 1.2 中显示或隐藏 HTML DIV

基于布尔值有条件地切换组件属性的值

如何有条件地将某些内容封装在 HTML 元素中

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

使用 JSF Datatable 有条件地显示行

有条件地渲染 JSF 组件以进行打印