【问题标题】:Help understanding JSF's multiple calls to managed bean帮助理解 JSF 对托管 bean 的多次调用
【发布时间】:2011-03-28 01:42:18
【问题描述】:

我正在使用 h:datatable,这是我的代码的相关行:

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

然后我有一个 Request 范围的 managedBean 以及最新收入的 getter:

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

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

【问题讨论】:

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

标签: java jsf managed-bean


【解决方案1】:

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

但是,对于给定的代码 sn-p,它应该被调用最多 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;
}

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

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2010-12-21
    • 2012-02-02
    • 2012-11-09
    • 2012-05-27
    • 1970-01-01
    • 2013-01-24
    • 2023-03-05
    • 2014-07-06
    相关资源
    最近更新 更多