是否可以这样做:当用户会话开始时,我从数据库中读取某个完整的属性。当用户在此会话中执行某些活动时,我会更新该变量(存储在会话中)和会话结束时,然后我最终将该值存储到数据库中。
我的问题是如果用户会话已经结束,我如何识别使用 JSF 框架,然后我应该将值存储回 DB?
是否可以这样做:当用户会话开始时,我从数据库中读取某个完整的属性。当用户在此会话中执行某些活动时,我会更新该变量(存储在会话中)和会话结束时,然后我最终将该值存储到数据库中。
我的问题是如果用户会话已经结束,我如何识别使用 JSF 框架,然后我应该将值存储回 DB?
除了 之外HttpSessionListener
,您还可以为此使用会话范围的托管 bean。您使用@PostConstruct
(或只是 bean 的构造函数)和@PreDestroy
注释来挂钩会话创建和销毁
@ManagedBean
@SessionScoped
public class SessionManager {
@PostConstruct
public void sessionInitialized() {
// ...
}
@PreDestroy
public void sessionDestroyed() {
// ...
}
}
@ManagedProperty
唯一的要求是在 JSF 页面或任何请求范围的 bean中引用此bean。否则它不会被创建。但是在您的情况下,这应该没有问题,因为您显然已经在使用会话范围的托管 bean,只需添加一个@PreDestroy
方法就足够了。
我的问题是如果用户会话已经结束,我如何识别使用 JSF 框架,然后我应该将值存储回 DB?
JSF 框架没有单独的会话概念;它使用 Servlet 规范的底层会话管理特性。
您必须创建一个HttpSessionListener,它为您提供挂钩以捕获会话创建和销毁事件,您可以在其中读取值并将其存储回数据库。
HttpSessionListener
,或者如果你需要依赖注入来保存,你可以使用@PostConstruct & @PreDestroy
. 请记住,会话在您调用invalidate()
或会话超时后被销毁,而不是在用户关闭浏览器时被销毁。无论如何你为什么要使用 Session Scope,Conversation Scope可能更适合你。