1

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

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

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

4

3 回答 3

2

您需要一个充分的理由来说明为什么要将用户列表放入会话范围的 bean 中。它可能会引起一些麻烦,并最终反映多用户环境中的过时数据。改为创建bean @ViewScoped,并在方法中加载所有用户或用户子集@PostConstruct

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

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

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

于 2013-05-03T15:16:53.850 回答
0

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

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

于 2013-05-03T15:10:08.283 回答
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 的窍门,与它一起工作就会很有意义。

于 2013-05-04T15:58:29.760 回答