Bean方法在JSF中的执行优先级

时间:2013-04-04 16:05:57

标签: jsf render

我有一个表单可以从列表中选择一个代理。支持bean决定是否应该呈现列表并填充单选按钮的项目:

<h:selectOneRadio rendered="#{myBean.shoudRender}" value="#{myBean.selectedAgent}" id="agents">
    <f:selectItems value="#{myBean.allAgents}" />
</h:selectOneRadio>

100%确定,myBean.getShouldRender()会在 myBean.getAllAgents之前执行吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,它会的。在继续编码自身及其子代之前,UIComponent#encodeAll()会检查isRendered()是否返回true

另一方面,这表明您在<f:selectItems>的getter中执行业务逻辑。否则,你根本不会担心它返回null左右的情况,并且从来没有问过这个问题。 getter方法是执行业务逻辑的错误位置。您应该在(post)构造函数或(action)侦听器方法中执行此操作。吸气剂应该只返回已经准备好的值。

因此,这是错误的:

public boolean isShouldRender() {
    boolean shouldRender = // Some business logic...
    // ...

    return shouldRender;
}

public List<Agent> getAllAgents() {
    List<Agent> allAgents = // Some business logic...
    // ...

    return allAgents ;
}

相反,你应该做

// Have properties which you initialize during an event.
private boolean shouldRender;
private List<Agent> allAgents;

public void someEventMethod() { // E.g. postconstruct, action, ajax behavior, value change, etc.
    shouldRender = // Some business logic.
    allAgents = // Some business logic.
}

// Keep the getters untouched!
public boolean isShouldRender() {
    return shouldRender;
}

public List<Agent> getAllAgents() {
    return allAgents;
}

另见:

答案 1 :(得分:0)

我使用的是一种名为XPages的技术,它基于JSF。

在我的世界中,至少渲染将首先进行评估。所以我认为你会好的。