JSF h:datatable-如何处理结果集?

时间:2018-12-09 21:51:02

标签: jsf

我的问题是有关如何在JSF应用程序中处理SQL语句的结果集的最佳实践? 在大多数示例中,建议通过以下方法使用ViewScoped支持bean:

$ sudo more /var/lib/kubeadm.yaml 
apiEndpoint:
  advertiseAddress: 192.168.99.107
  bindPort: 8443
apiVersion: kubeadm.k8s.io/v1alpha3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: minikube
  taints: []
---
apiServerExtraArgs:
  basic-auth-file: "/var/lib/minikube/certs/mini/users.csv"
  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"

apiVersion: kubeadm.k8s.io/v1alpha3
certificatesDir: /var/lib/minikube/certs/
clusterName: kubernetes
controlPlaneEndpoint: localhost:8443
etcd:
  local:
    dataDir: /data/minikube
kind: ClusterConfiguration
kubernetesVersion: v1.13.0
networking:
  dnsDomain: cluster.local
  podSubnet: ""
  serviceSubnet: 10.96.0.0/12$ 

JSF页面如下:

@ManagedBean
@ViewScoped
public class MyController implements Serializable {
   ...
    public List<MyData> getResult()  {
      // select data from SQL database
      ....
    }

但是从我的测试中我可以看到,呈现页面时,多次调用了getResult()方法。这意味着我的SQL查询被多次调用。我认为这是一个糟糕的设计。

因此,我确实将结果存储在成员变量中:

<h:dataTable value="#{myController.result}" var="record">
  ...
</h:dataTable>

但是通过这种方法,我的bean现在将数据存储在服务器上。这浪费了记忆!

由于这个原因,我使用了RequestScoped DataController。使用这种方法,结果数据集不必在页面呈现后不必要地存储在服务器上。

我不明白为什么大多数有关带有h:datatables的JSF的示例都没有涉及这两个非常重要的方面。

所以我的问题是:建议使用JSF Backing Bean设计来自数据库的数据吗?

1 个答案:

答案 0 :(得分:0)

通常不要在get / set()方法中编写任何业务登录信息,因此下面的代码是完全错误的

public class MyController implements Serializable {
   ...
    public List<MyData> getResult()  {
      // select data from SQL database
      ....
    }

请查看此问题,并阅读@Balusc给出的答案

Why JSF calls getters multiple times

如果要加载数据,则JSF中有很多方法

您可以使用preRenderView和call方法来加载数据

<f:metadata>
          <f:event type="preRenderView" listener="#{myController.fetchResult}"/>
 </f:metadata>

我不确定您的页面设计,否则通过某些事件您也可以将数据加载到数据表中。