2015-08-28 83 views
1

Mojarra 2.1。即使渲染屬性爲false,組件仍然會以組件樹結尾

我檢查了類com.sun.faces.lifecycle.RestoreViewPhase中的方法public void execute(FacesContext facesContext) throws FacesException。現在,一旦通過調用viewRoot = viewHandler.restoreView(facesContext, viewId);恢復了視圖,我們就可以從先前的請求中獲得優勢樹(如果它是回發)。

我檢查樹(通過組件在調試器的children屬性中手動迭代),並發現該複合材料組件,聲明如下:

<h:panelGroup rendered="#{bean.id == 1}"> 
    <utils:dropDownListFilterItem /> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.id == 2}"> 
    <utils:dateFilterItem /> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.id == 3}"> 
    <utils:fieldFilterItem /> 
</h:panelGroup> 

都在該樹。儘管事實上#{bean.id}被評估爲2,但它感到很高興。我指出,唯一的<utils:dateFilterItem />實例將在樹中。

所以,我的問題是如何處理Mojarra rendered屬性?該屬性是否影響了唯一的渲染響應階段?

回答

7

RestoreView -Phase期間不使用呈現的屬性。第一次評估是在ApplyRequestValue -Phase。這是因爲在RestoreView -Phase期間沒有應用「請求值」。因此可能無法評估可能依賴於這些值的屬性rendered

都在那棵樹上。儘管事實上#{bean.id}被評估爲2,但它感到興奮。我表明,唯一的實例將在樹中。

JSF的組件樹知道所有成分,如果沒有他們渲染或沒有關係的。這使您可以重新呈現某種成分與它的所有內部組件如果內(通常與複選框等使用) - 沒有渲染的成分 - 將組件樹內丟失的render="outerComponent"使用將無法顯示如果內部組件的rendered-屬性現在評估爲真。

爲了避免組件beeing添加到樹的一切,你必須使用一個JSTL -Tag如<c:if > - 如果這個計算結果爲false,組件將不會被添加到組件樹好,所以JSF會在不知道某個組件的情況下開始處理樹。

您可能還需要閱讀這篇文章,其中的差與實例解釋和更多的細節: JSTL in JSF2 Facelets... makes sense?

+4

另一個相關的問題:http://stackoverflow.com/q/18768527 – BalusC