另外两个问题(here和here)BalusC直截了当地宣布:
Getters仅用于访问 bean属性,而不是做一些业务逻辑。你有bean构造函数,初始化块或事件方法。所有这些只在bean的生命中执行一次,而这正是你想要的。
嗯哎 - 这只是使我已经写过的大量代码无效。那么,实现填充数据表的辅助bean的正确方法是什么?我理解他的观点和概念,但不是实践。我的问题有两个:
我经常使用PrimeFaces p:dataTable ,并且 value 属性解析为集合。由于我没有进入这里的原因,我不使用PrimeFaces的懒惰表加载功能。相反,我实现了自己的过滤器/排序控件,但它们触发了AJAX事件,然后导致表中填充了从数据库中提取的记录。
表格标记如下:
<p:panel id="mqTable">
<h:outputText value="Sort/Filter: #{maintCategory.tableQueryParameters}" />
<p:dataTable
id="mqDataTable"
rows="#{maintCategory.pageSize}"
value="#{maintCategory.dataModel}"
selection="#{maintCategory.selected}"
var="cat"
selectionMode="single"
emptyMessage="No Categories Found">
现在, dataModel 的令人难以置信的糟糕的UN-JSFish(或者我刚刚发现)得到的是这样的:
public ATMDataModel getDataModel() {
TableQueryParameters p = getTableQueryParameters();
if (p.isChangePending()) clearDataModel();
p.setChangePending(false);
if (dataModel != null) return dataModel;
List<ET> list = getDAO().runQuery(p);
if (p.isNeedResultSize()) p.setResultSize(getDAO().runQueryCount(p));
dataModel = new ATMDataModel(list);
return dataModel;
}
一些解释。
但是如果 TableQueryParameters 执行更改,我必须使用这些参数调用 runQuery 来获取新的用户想要查看的记录集。如果我不在 getDataModel 中调用它,我在哪里调用它?
请告知。
答案 0 :(得分:1)
你基本上懒得加载getter中的数据。您没有在同一请求(或视图)范围内的每个getter调用上访问数据库。这是负担得起的。我不使用CODI,但我认为getTableQueryParameters()
电话也特别便宜,无需担心。
关于具体问题,您通常在附加到UICommand
组件和/或ajax事件标记的action(侦听器)方法中执行DB / business作业。
例如(虽然也可以作为<p:commandButton action>
)
<p:ajax listener="#{bean.deleteSelectedRow}" />
...
<p:ajax listener="#{bean.saveRowDetail}" />
与
public void deleteSelectedRow() {
someService.delete(selectedRow);
dataModel = loadDataModel();
}
public void saveRowDetail() {
someService.save(selectedRow);
dataModel = loadDataModel();
}
根据p.isChangePending()
的含义,我认为您也可以通过这种方式摆脱它,看起来就像是在动作(侦听器)方法中设置它。