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



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

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

myBean.getShouldRender()myBean.getAllAgents之前执行是否100%确定?

谢谢!

会的。UIComponent#encodeAll()将检查isRendered()是否返回true,然后继续对其自身及其子节点进行编码。

另一方面,这表明您在<f:selectItems>的getter中执行业务逻辑。否则,如果它返回null左右,并且从一开始就没有问过这个问题,那么您根本就不用担心它。getter方法不是执行业务逻辑的正确位置。您应该在(post)构造函数或(action)侦听器方法中这样做。getter应该只返回已经准备好的值。

所以这是错误的:

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;
}

参见:

  • 为什么JSF多次调用getter

我从事一种叫做XPages的技术,它基于JSF。

在我的世界里,至少渲染会首先被评估。所以我想你会没事的。

最新更新