2

条件に基づいて3つの子xhtmlを含むホームページxhtmlがあります。私が直面している問題は、シナリオが何であれ、Book.xhtmlが常に呼び出されることです。レンダリングされた条件をfalseに変更するか、別の条件に移動しましたが、ファイルは常に呼び出されます。そのため、バッキング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>
4

2 に答える 2

13

これは、jsfのライフサイクルが原因で発生しています。JSF UIComponentsはビューのレンダリング時に評価されますが、jstlタグはビルド時に評価されます。

したがって、h:panelGridのrendered属性を使用する場合、インクルードされたページでマネージド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

于 2013-01-18T08:25:46.357 に答える
0

これを行う:

  • 常にサブページを含める
  • 常に含めるページ内に(レンダリングされた)panelGridを配置します

なんで ?レンダリングが評価される前に包含が実行されるためです。

于 2013-01-18T10:45:32.073 に答える