Jsf 如何停止为每个请求从数据库重新加载数据?

Jsf 如何停止为每个请求从数据库重新加载数据?,jsf,Jsf,我从db加载数据并设置为beans。它显示在屏幕上。假设我单击同一屏幕中的任何按钮,数据将再次从db加载。对于每个请求,所有bean都为空。这就是我无法停止加载的原因。你能告诉我如何解决这个问题吗 我写了这样的代码 public class Bean { private Service service; private String email; private String name; public void setService(final Service newService) {

我从db加载数据并设置为beans。它显示在屏幕上。假设我单击同一屏幕中的任何按钮,数据将再次从db加载。对于每个请求,所有bean都为空。这就是我无法停止加载的原因。你能告诉我如何解决这个问题吗

我写了这样的代码

public class Bean {

private Service service;

private String email;

private String name;

public void setService(final Service newService) {
if(this.service == null)
{
this.service = newService;
try {       
//load data from db set the values of email and name                          
 this.service.createContact(this);
} catch (SQLException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
facess-config.xml

管理服务的bean。
豆子
com.bean.bean
要求
服务
#{service}

您的bean是用请求范围声明的。这意味着,它将为每个请求创建新的。除此之外:
if(this.service==null)
将始终为真,因为setter在创建bean时只被调用一次(不管它有什么作用域)


如果您确定数据不会在请求之间更改,只需使用会话范围声明bean,它将在每个用户会话或应用程序范围中创建一次,以便为整个应用程序创建一次。

您的bean是使用请求范围还是会话范围声明的?谢谢。但它正在工作,但它不会从db加载到注销。例如,如果我回到屏幕,我想再次从DB加载。如果我在同一屏幕上点击了任何按钮,那么就不要从db重新加载。@venkat:在这种情况下,您希望在JSF2中引入视图范围。但是请注意,这意味着您的bean的内容将被序列化并保存为页面本身中的隐藏参数。这会引起很多问题。另一种方法是使用会话范围,但要找到一种检测页面导航的方法,并且仅在这种情况下不要重新加载数据。仅当“状态保存”设置为“客户端”而不是(默认)
server
时,“保存为隐藏”参数才为真。而且这并不特别适用于查看作用域bean。@BalusC:Hm,我没有在任何地方显式设置,当bean不可序列化时,我会遇到异常(会话和应用程序作用域bean不会出现这种情况)。我使用的是MyFaces。视图范围的bean存储在组件树中,组件树在会话中被序列化。唯一隐藏的参数是
javax.faces.ViewState
,它基本上是组件树的会话属性键。
<managed-bean>
<description>The bean to manage service.</description>
<managed-bean-name>Bean</managed-bean-name>
<managed-bean-class>com.bean.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>Service</property-name>
<value>#{service}</value>
</managed-property>
</managed-bean>