帮助理解JSF对托管bean的多次调用

时间:2011-03-28 01:42:18

标签: java jsf managed-bean

我正在使用h:datatable,这是我的代码的重要部分:

 <h:dataTable value="#{account.latestIncomes}" var="mov" >
 .....
 </h:dataTable>

然后我有一个Request scoped managedBean,带有最新收入的getter:

 public List<Movs> getlatestIncomes() {
    if (incomes == null)
    incomes = this.cajaFacade.getLatestIncomes(20);
    return incomes;
}

这个getter被调用了8次,我没有在其他地方使用它,只是在dataTable的值上。为什么会这样?如果您需要更多代码,请询问。但那是我使用该房产的唯一地方。

1 个答案:

答案 0 :(得分:2)

只要JSF需要访问它就可以调用它。从技术上讲,你不应该担心这一点。

但是,对于给定的代码片段,应该在渲染响应阶段期间以最高3次调用它。在encodeBegin()期间,encodeChildren()期间和encodeEnd()期间一次。或者它是否包含输入元素,您是否在表单提交期间计算了?

无论如何,调试堆栈和getter中的当前阶段ID都应该给出一些见解。

private List<Movs> latestIncomes;
private AtomicInteger counter = new AtomicInteger();

@PostConstruct
public void init() {
    latestIncomes = cajaFacade.getLatestIncomes(20);
}

public List<Movs> getlatestIncomes() {
    System.err.printf("Get call #%d during phase %s%n", counter.incrementAndGet(), 
        FacesContext.getCurrentInstance().getCurrentPhaseId());
    Thread.dumpStack();

    return latestIncomes;
}

(如您所见,我将列表加载到正确的位置)