Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帮助理解JSF';s对托管bean的多个调用_Java_Jsf_Managed Bean - Fatal编程技术网

Java 帮助理解JSF';s对托管bean的多个调用

Java 帮助理解JSF';s对托管bean的多个调用,java,jsf,managed-bean,Java,Jsf,Managed Bean,我使用的是h:datatable,下面是我代码的相关行: <h:dataTable value="#{account.latestIncomes}" var="mov" > ..... </h:dataTable> ..... 然后我有一个请求范围的managedBean,其中包含获取最新收入的getter: public List<Movs> getlatestIncomes() { if (incomes == null) i

我使用的是h:datatable,下面是我代码的相关行:

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

.....
然后我有一个请求范围的managedBean,其中包含获取最新收入的getter:

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

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

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

但是,对于给定的代码段,应该最多调用3次,全部在渲染响应阶段。一次中,一次中,一次中。或者它是否包含输入元素,并且在表单提交过程中是否计数

无论如何,在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;
}
私有列表;
私有AtomicInteger计数器=新的AtomicInteger();
@施工后
公共void init(){
latestIncomes=cajaFacade.getLatestIncomes(20);
}
公共列表getlatestIncomes(){
System.err.printf(“在阶段%s%n期间获取调用#%d”),counter.incrementAndGet(),
FacesContext.getCurrentInstance().getCurrentPhaseId());
Thread.dumpStack();
回来晚了;
}

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

看看是的,这是3到4次,但是getter被调用8到10次是正常的吗?正如BalusC在那个问题中提到的,您不应该像在代码中那样在getter方法中执行业务逻辑。你能把代码移到init()或constructor()方法中吗?这样,当调用getter时,它只返回预加载的列表?