重新访问视图时清除会话范围bean的数据

时间:2013-05-03 15:02:53

标签: java jsf session

当我回到同一个屏幕时,Bean值不会被删除。

  1. 我创建用户详细信息并插入数据
  2. 我查看数据库中可用的所有列出的用户
  3. 我搜索特定用户
  4. 当我回到创建用户页面时,我看到搜索到的用户的数据
  5. 如何从bean中删除旧数据?托管bean在会话范围内。

3 个答案:

答案 0 :(得分:2)

您需要一个很好的理由,以便将用户列表放入会话范围的bean中。它可能会导致一些麻烦,并最终反映多用户环境中过时的数据。改为使用@ViewScoped bean,并使用@PostConstruct方法加载所有用户或用户子集。

关于使用会话范围bean 时的连贯性,我的猜测是你没有更新当前用户列表。在这种情况下,您基本上需要将操作加倍:第一个操作是数据库操作,第二个操作是列表更新操作。如下面的代码所示:

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

此外,要更新您的UI,请确保通过从操作方法返回void / null或通过AJAX更新所需组件来进行回发,方法是在其中指定其客户端ID render标记的<f:ajax>属性。

答案 1 :(得分:0)

我认为你正在考虑@Remove注释,它应该是特定方法(或者我理解你的问题是错误的)。

参考:http://docs.oracle.com/javaee/5/api/javax/ejb/Remove.html

答案 2 :(得分: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就会给你带来回报。