2008年9月12日星期五

为什么JSF调用我的Getter方法上百次?


JSF 不缓存得到的EL的结果。因此,你会发现一个字符串EL值表达式会导致最少一次的getter方法调用,或许有更多次。如果你在JSF控制标签中使用:例 如迭代标签 <h:dataTable />,<h:selectOneMenu /> 等,这样值表达式可能在每次迭代的时候都会调用一次。

你能做点什么呢?确保你的getter方法是轻量级的,and use some sort of lazy initialization.

例如:下面的示例会导致你的List创建多次:

@Name("fooManager")

@Scope(EVENT)

public class FooManager {

   public List<Foo> getFoos() {
     return createFooList();
  }

}

<h:dataTable value="#{fooManager.foos}">

   ...

下面的示例修复了这个问题:

@Name("fooManager")

@Scope(EVENT)

public class FooManager {

   private List<Foo> foos;

  public List<Foo> getFoos() {
     if (foos == null) {
        foos = createFooList();
     }
     return foos;
  }

}

没有评论: