即使渲染属性为false,组件仍然会以组件树结尾

即使渲染属性为false,组件仍然会以组件树结尾

问题描述:

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属性?该属性是否影响了唯一的渲染响应阶段?

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://*.com/q/18768527 – BalusC