获取数据库条目的正确代码模式是什么?

时间:2011-10-17 22:13:22

标签: jsf-2

另外两个问题(herehere)BalusC直截了当地宣布:

  

Getters仅用于访问 bean属性,而不是做一些业务逻辑。你有bean构造函数,初始化块或事件方法。所有这些只在bean的生命中执行一次,而这正是你想要的。

嗯哎 - 这只是使我已经写过的大量代码无效。那么,实现填充数据表的辅助bean的正确方法是什么?我理解他的观点和概念,但不是实践。我的问题有两个:

  1. 为什么我做错了?
  2. 我该如何解决?
  3. 我经常使用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;
    }
    

    一些解释。

    1. 这是来自一个抽象的超类,其中ET是“实体类型”。我所有的CRUD都使用同样的程序。
    2. ATMDataModel 是实现 SelectableListModel 的列表的包装器。 PrimeFaces中的行选择逻辑需要这样。 (这是PF 3中出现的一种痛苦,但它使行选择工作更加可靠。)
    3. TableQueryParameters 是我编写的用于在用户屏幕上封装表的当前状态的内容。它包括什么类型的参数,什么过滤器参数,我们在哪个页面等等。因为这需要保留,支持bean是 ViewAccesScoped (通过MyFaces CODI)和 TableQueryParameters 是其中的一个属性。
    4. TableQueryParameters 会通过AJAX事件进行更新,这些事件也会更新窗体,导致 getDataModel 被调用。当任何变化时,方法 isChangePending 变为 true 。因此, getDataModel 方法使用此方法在更改之间仅从DAO生成一次提取,无论它被调用多少次。
    5. 但是如果 TableQueryParameters 执行更改,我必须使用这些参数调用 runQuery 来获取新的用户想要查看的记录集。如果我不在 getDataModel 中调用它,我在哪里调用它?

      请告知。

1 个答案:

答案 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()的含义,我认为您也可以通过这种方式摆脱它,看起来就像是在动作(侦听器)方法中设置它。