我目前正在研究一个接缝项目并遇到问题。
我刚创建了一个新页面(一个名为MyPage.xhtml的xhtml)。 在xhtml我的代码中,你可以找到一个命令按钮和一个: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;
}
这是页面的工作方式:
为什么要执行两次?我该如何限制它一次?现在它给我们带来了很多性能......!
氪,
德克
答案 0 :(得分:0)
最有可能的方法是在视图重建(恢复视图阶段)和渲染期间(渲染响应阶段)执行。
尝试缓存方法是否已经执行或仅在单击按钮时执行该方法并提供简单的getter来传递数据。
作为一般说明,您应该仅在需要时(缓存结果)或在调用应用程序阶段(通常使用action
或actionListener
)执行昂贵的操作(如数据库查询)
答案 1 :(得分:0)
我会做这样的事情并使用Scopes来存储数据。如果你在重复中使用这样的函数,它将访问重复中每一行的方法。
<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();
}