0

我目前正在做一个接缝项目并且有一个问题。

我刚刚创建了一个新页面(一个名为 MyPage.xhtml 的 xhtml)。在 xhtml 我的代码中,您可以找到一个命令按钮和 aa:repeater 来显示我的数据:

<!-- input fields that are filters for my table shown below -->
<h:commandButton value="View details" action="/MyPage.xhtml"/>

<rich:panel rendered=#{myAction.showDetails}>
    <a:repeat value="#{myAction.findRecords()}" var="record">
        <!-- Some of my code to display a table, nothing fancy -->
    </a:repeat>
</rich:panel>

在我的行动中,我有这个:

@DataModel
private List<MyEntity> records = new ArrayList<MyEntity>();

public List<MyEntity> findRecords() {
    //Do some query
    Query query = entityManager.createNamedQuery("myEntityQuery");
    records = query.getResultList();
    return records;
}

这是页面的工作方式:

  1. 显示了我的输入框和命令按钮,而不是丰富的:面板,因为我的 showDetails 布尔值是错误的。
  2. 当 showDetails 布尔值设置为 true 时,将显示面板并且迭代调用我的操作方法 findRecords()。到目前为止,一切都很好!
  3. 但是当我再次单击我的操作按钮时,操作方法 findRecords() 会执行两次。这是我的问题...

为什么要执行两次?我怎样才能将其限制为一次?现在它花费了我们很多性能..!

氪,

短剑

4

2 回答 2

0

该方法很可能在视图重建期间(恢复视图阶段)和再次渲染期间(渲染响应阶段)执行。

尝试缓存该方法是否已经执行或仅在单击按钮时执行它,并提供一个简单的 getter 来传递数据。

作为一般说明,您应该仅在需要时(缓存结果)或在调用应用程序阶段(通常使用actionor actionListener)执行昂贵的操作,例如数据库查询

于 2011-09-13T12:42:31.757 回答
0

我会做这样的事情,并使用范围来存储数据。如果您在重复中使用类似的函数,它将访问重复中每一行的方法。

<h:commandButton value="View details" action="/MyPage.xhtml"/>

<rich:panel rendered=#{myAction.showDetails}>
    <a:repeat value="#{records}" var="record">
        <!-- Some of my code to display a table, nothing fancy -->
    </a:repeat>
</rich:panel>



@Out
private List<MyEntity> records = new ArrayList<MyEntity>();

@Factory(value="records")
public void findRecords() {
   //Do some query
   Query query = entityManager.createNamedQuery("myEntityQuery");
   records = query.getResultList();
}
于 2011-09-18T19:34:58.037 回答