JSF 2.0〜 XHTML包含即使裁决始终是假的(Jsf 2.0-xhtml inc

2019-07-18 09:00发布

我有一个主页的XHTML我在哪里,包括基于条件的3子XHTML。 我面临的是问题,无论是场景,Book.xhtml总是被调用。 我改变了渲染的条件,虚假或移动到另一个状态,但该文件一直被调用由于它的后台bean也被调用造成不必要的开销。 请给我提供一个解决方案

<ui:composition template="/xhtml/baseLayout.xhtml">
    <ui:define name="browserTitle">
        <h:outputText value="HOME PAGE" />
    </ui:define>
    <ui:define name="header">
        <ui:include src="/xhtml/header.xhtml" />
    </ui:define>
    <ui:define name="bodyContent">

        <h:panelGrid width="100%"
            rendered="#{pogcore:isRoleAuthorized(BUNDLE.SUPER)}"  >
            <ui:include src="/xhtml/SuperUser.xhtml"  />
        </h:panelGrid>
        <h:panelGrid width="100%"
            rendered="#{pogcore:isRoleAuthorized(BUNDLE.MAINTENANCE)}" >
            <ui:include src="/xhtml/Maintenance.xhtml" />
        </h:panelGrid>

        <h:panelGrid width="100%"
            rendered="#{pogcore:isRoleAuthorized(BUNDLE.PRINT)}">
            <ui:include src="/xhtml/Book.xhtml" />
        </h:panelGrid>

    </ui:define>
</ui:composition>

Answer 1:

这是发生由于JSF的生命周期。 鉴于在JSF的UIComponents评估渲染其中的JSTL标记在构建时计算时间。

所以,当你使用渲染h的属性:panelGrid的为时已晚不调用包含页面下管理的bean。 要解决此尝试有使用JSTL标记条件,下面应该为你工作。

<c:if test="#{bean.yourCondition}">
    <h:panelGrid width="100%"> 
        <h:outputText value="#{bean.yourCondition}"/> <!--if this is not getting printed there is smtg wrong with your condition, ensure the syntax, the method signature is correct-->
        <ui:include src="/xhtml/Book.xhtml" /> 
    </h:panelGrid>
</c:if> 
<c:if test="#{!bean.yourCondition}"> 
    <h:outputText value="#{bean.yourCondition}"/> <!--This should print false-->
</c:if>

下面的文档介绍JSTL和JSF生命周期的细节。

http://www.znetdevelopment.com/blogs/2008/10/18/jstl-with-jsffacelets/

检查下列文件看到另一个办法来解决这个不使用JSTL标签。

http://pilhuhn.blogspot.com/2009/12/facelets-uiinclude-considered-powerful.html



Answer 2:

做这个:

  • 始终包含子页面
  • 把panelGrid中(与渲染)的页面,你总是包括内部

为什么呢? 由于夹杂物呈现前进行评估。



文章来源: Jsf 2.0-xhtml included always even if rendered is false