当我回到同一屏幕时,Bean 值不会被删除。
- 我创建用户详细信息并插入数据
- 我查看数据库中所有可用的列出用户
- 我搜索特定用户
- 当我回到创建用户页面时,我看到了搜索用户的数据
如何从 bean 中删除旧数据?托管 bean 在会话范围内。
您需要一个充分的理由来说明为什么要将用户列表放入会话范围的 bean 中。它可能会引起一些麻烦,并最终反映多用户环境中的过时数据。改为创建bean @ViewScoped
,并在方法中加载所有用户或用户子集@PostConstruct
。
至于使用会话范围 bean 时的连贯性,我的猜测是您没有更新当前用户列表。基本上这种情况下需要加倍操作:第一个操作是数据库操作,第二个是列表更新操作。就像在下面的代码中一样:
public void deleteUser() {
yourEJB.remove(user);
listOfUsers.remove(user);
}
此外,要更新您的 UI,请务必通过从操作方法返回void
/进行回发,或者通过 AJAX 更新所需的组件,方法是在标签的属性中指定其客户端 ID 。null
render
<f:ajax>
我认为您正在考虑 @Remove 注释,它应该在特定方法上(或者我理解您的问题是错误的)。
参考:http ://docs.oracle.com/javaee/5/api/javax/ejb/Remove.html
这里有几件事:首先,发布一个简单的示例:它允许我们运行它来帮助您。但这就是(可能)正在发生的事情。您的 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 的窍门,与它一起工作就会很有意义。