2013-05-03 63 views
1

当我回到同一屏幕时,Bean值不会被删除。重新访问视图时清除会话作用域bean的数据

  1. 我创建用户的详细信息,并插入数据
  2. 我认为所有列出的用户在数据库中可用
  3. 我搜索特定用户
  4. 我回来的时候创建的用户页面上,我看到的数据搜索用户

如何从bean中删除旧数据?受管理的bean在会话范围内。

+1

你的bean的范围是什么?你在谈论JSF中的EJB或ManagedBean吗?一个小的代码示例将清楚地解释这一点。这绝对是一个范围问题。 – 2013-05-03 15:13:13

+0

@DanielChapman我更新了帖子,请检查 – developer 2013-05-03 15:22:09

回答

2

你需要一个很好的理由,为什么你会希望把用户的列表到会话作用域bean。这可能会导致一些麻烦,并最终在多用户环境中反映过时的数据。取而代之的是使用豆@ViewScoped,并将所有用户或用户子集加载到@PostConstruct方法中。

至于一致性当使用会话范围的豆,我的猜测是,你没有更新当前用户的列表。基本上你需要在这种情况下加倍操作:第一个操作是数据库操作,第二个操作是列表更新操作。就像下面的代码:

public void deleteUser() { 
    yourEJB.remove(user); 
    listOfUsers.remove(user); 
} 

此外,有你的UI更新,务必使回传,由操作方法返回void/null,或通过AJAX更新所需的组件,通过指定客户端ID为render属性的<f:ajax>标记。

0

这里有几件事情:首先,发布一个简单的例子:它允许我们运行它来帮助你。但是,这可能是(可能)发生的。您的bean是会话作用域,这意味着它将在用户进行会话的整个时间内都存在。除非你明确地销毁会话,否则请改变它为那个会话“存在”的值。

使用JSF2注释试试这个:

@ManagedBean(name="seesionScopedBean") 
@SessionScoped 
public class SessionScopedBean { private String data;//create getter/setter} 

@ManagedBean(name="viewScopedBean") 
@ViewScoped 
public class ViewScopedBean { private String data;} 

@ManagedBean(name="requestScopedBean") 
@RequestScoped 
public class RequestScopedBean { private String data;} 

假设你的三个范围做一个网页,基本上是

<f:view> 
<h:form> 
<h:inputText value="#{sessionScopedBean.data}" /> 
<h:inputText value="#{viewScopedBean.data}" /> 
<h:inputText value="#{requestScopedBean.data}" /> 
<!-- whatever listener/action to set things --> 
</h::form> 
</f:view> 

你会发现,“SessionScoped”数据保持,直到你注销,只要你和这个视图交互,视图就会保留下来(不完全正确,但这就是它的要点,而且请求范围在每个请求中都存在)

基本上你创建用户bean感觉它应该有一个请求或查看范围(如前面的答案中所述)。希望这有助于。整个生命周期需要花费一些时间,但JSF一旦掌握了它就可以继续工作。