2011-03-28 83 views
1

我使用h動車組呼叫:數據表,這裏是我的代碼revelant行:幫助理解JSF的託管豆

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

然後我有一個請求範圍的managedBean與吸氣最新收入:

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

此getter被調用8次,並且我沒有在其他任何地方使用它,只在dataTable的值上使用它。這是爲什麼發生?如果您需要更多代碼,請詢問。但那是我使用該財產的唯一地方。

+0

看看http://stackoverflow.com/questions/2090033/why-jsf-calls-getters - 多次 – Mark 2011-03-28 01:52:31

+0

是的,這是3或4次,但吸氣劑被稱爲8到10次是正常的嗎? – arg20 2011-03-28 02:13:46

+0

正如BalusC在那個問題中提到的 - 你不應該像你在代碼中那樣在你的getter方法中做業務邏輯。你可以將這些代碼移動到init()或者構造函數()方法嗎?這樣,當你的getter被調用時,它只是返回預先加載的列表? – CoolBeans 2011-03-28 03:34:46

回答

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

(正如你看到的,讓我感動的列表裝載到合適的位置)