java - 帮助理解JSF对托管bean的多次调用

标签 java jsf managed-bean

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

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

然后我有一个请求范围的托管Bean,其中包含最新收入的 getter:

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

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

最佳答案

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

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

关于java - 帮助理解JSF对托管bean的多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453862/

相关文章:

java - 在 Duration 步骤中迭代 ZonedDateTime 间隔

jsf - session 范围的托管 bean 与有状态的 ejb

java - 如何将实体添加到数据库而不在数据库中添加相关实体?

jsf - 在 p :calendar 上禁用特定日期

java - 开发用 Java 开发的中等复杂 Web 应用程序的前端(GUI)和 Controller 部分的最佳方法

java - 如何将 JSF 消息编码设置为 UTF-8?

JSF 消息持久化

spring - 将 bean Autowiring 到 JSF 托管 bean 时为空指针

java - 覆盖对象的 toString() 方法后如何获取对象的唯一 id?

java - 获取另一个父节点的子节点