1

私はh:datatableを使用しています、これが私のコードの関連する行です:

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

次に、最新の収入のゲッターを備えたRequestスコープのmanagedBeanがあります。

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

このゲッターは8回呼び出されますが、他の場所では使用せず、dataTableの値でのみ使用しています。なぜこうなった?さらにコードが必要な場合は、お問い合わせください。しかし、それは私がそのプロパティを使用する唯一の場所です。

4

1 に答える 1

2

これは、JSF がアクセスする必要がある回数だけ呼び出されます。技術的には、これについて心配する必要はありません。

ただし、指定されたコード スニペットでは、レンダリング レスポンス フェーズ中に最大 3 回呼び出す必要があります。中encodeBegin()に 1 回、 中に 1 回、 中にencodeChildren()1 回encodeEnd()。または、入力要素が含まれていて、フォームの送信中にカウントしましたか?

とにかく、ゲッターでスタックと現在のフェーズ 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;
}

(ご覧のとおり、リストの読み込みを適切な場所に移動しました)

于 2011-03-28T12:35:25.717 に答える