JSF中的Bean方法执行优先级

JSF中的Bean方法执行优先级,jsf,render,Jsf,Render,我有一个表格可以从列表中选择一个代理。支持bean决定是否应该呈现列表并填充单选按钮的项目: <h:selectOneRadio rendered="#{myBean.shoudRender}" value="#{myBean.selectedAgent}" id="agents"> <f:selectItems value="#{myBean.allAgents}" /> </h:selectOneRadio> 是否100%确定myBean.get

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

<h:selectOneRadio rendered="#{myBean.shoudRender}" value="#{myBean.selectedAgent}" id="agents">
    <f:selectItems value="#{myBean.allAgents}" />
</h:selectOneRadio>
是否100%确定myBean.getShouldRender将在myBean.getAllAgents之前执行


谢谢

我使用一种叫做XPages的技术,它基于JSF


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

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

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

是的,会的。UIComponentencodeAll将检查isRendered是否返回true,然后再继续编码自身及其子项

另一方面,这表明您正在执行业务逻辑。否则,如果它返回null左右,并且一开始从未问过这个问题,您就不会担心它了。getter方法是执行业务逻辑的错误位置。您应该改为在postconstructor或actionlistener方法中执行此操作。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;
}
另见: 是的,会的。UIComponentencodeAll将检查isRendered是否返回true,然后再继续编码自身及其子项

另一方面,这表明您正在执行业务逻辑。否则,如果它返回null左右,并且一开始从未问过这个问题,您就不会担心它了。getter方法是执行业务逻辑的错误位置。您应该改为在postconstructor或actionlistener方法中执行此操作。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;
}
另见:
回答得很好,谢谢!我在getter方法中有业务逻辑——myBean.isShouldRender和myBean.getAllAgent中都有一个昂贵的服务调用。我只想在myBean.isShouldRender中调用该服务。但是你是对的,我应该早点打电话给服务部。对我来说,最好的选择是在呈现页面之前调用服务。我发现了这篇文章:我认为最好的选择是:或者只是bean的postconstructor。也看到了很好的答案,谢谢!我在getter方法中有业务逻辑——myBean.isShouldRender和myBean.getAllAgent中都有一个昂贵的服务调用。我只想在myBean.isShouldRender中调用该服务。但是你是对的,我应该早点打电话给服务部。对我来说,最好的选择是在呈现页面之前调用服务。我发现了这篇文章:我认为最好的选择是:或者只是bean的postconstructor。另见