【问题标题】:Conditional include with empty value in JSFJSF 中的条件包含空值
【发布时间】:2015-02-11 10:01:17
【问题描述】:

我希望我对 JSF 的理解是正确的,这一切都说得通。我尝试通过使用(条件)包含在页面内进行某种简单的模板化。 面板通过选择进行更新。

<p:outputPanel id="panel">
  <h:panelGroup rendered="#{not empty someBean.selectedObject}">
    <ui:include src="WEB-INF/pages/#{someBean.selectedObject.pageName}.xhtml" />
  </h:panelGroup>
</p:outputPanel>

如果我是对的,ui:include 在某种视图准备阶段得到处理,rendered 属性在页面渲染之前得到处理。结果我得到一个 FileNotFoundException,因为它试图加载 WEB-INF/pages/.xhtml。这对我来说很有意义,但是如何解决这个问题而不需要像创建一个空页面作为文件名的前缀(page.xhtml)并为应该使用此字符串实际呈现的每个页面添加前缀(pageSamplePage.xhtml) )?

【问题讨论】:

标签: jsf primefaces


【解决方案1】:

您需要有条件地构建&lt;ui:include&gt;,而不是有条件地渲染它。使用&lt;c:if&gt; 而不是rendered

<p:outputPanel id="panel">
  <c:if test="#{not empty someBean.selectedObject}">
    <ui:include src="WEB-INF/pages/#{someBean.selectedObject.pageName}.xhtml" />
  </c:if>
</p:outputPanel>

否则,&lt;ui:include&gt; 仍然会出现在组件树中。

另见:


与具体问题无关,即使您打算有条件地渲染部分视图,您最好使用&lt;ui:fragment&gt; 而不是&lt;h:panelGroup&gt;,因为它的开销较小。

【讨论】:

  • 我阅读了链接的帖子,这是有道理的;)但它不起作用:(现在它似乎通过 if 语句。即使是硬编码的 false 也会跳转到包装语句中。我更新了示例片段的问题。我可以检查 JSF 的任何配置。我只有一年的 jsf 经验,我一直在与这种极端情况作斗争。;)
  • 什么...?你是对的,我可以在我的 html 中看到 c:if 标签。但我在“文件”开头的ui:composition 标记中声明了xmlns:c="http://java.sun.com/jstl/core"(此页面也只是主模板的一部分,以防万一。)
  • 谢谢。这就是原因。当我的 IDE 建议它时,我将包含 jsp 的 taglib 过滤为废话;)
【解决方案2】:

防止使用&lt;c:if&gt;,因为它会破坏一些标准的JSF 组件。 我们观察到它的使用会导致 UI:Panel 中的子元素重复,这是一种副作用,并且需要一段时间才能确定这是根本原因。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2019-06-01
    • 2020-02-21
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多