我的问题是有关如何在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设计来自数据库的数据吗?
答案 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>
我不确定您的页面设计,否则通过某些事件您也可以将数据加载到数据表中。