JSF 2.x
从JSF 2.x开始,有4个Bean范围:
@ViewScoped
@RequestScoped
@SessionScoped
@ApplicationScoped
ViewScope: View范围是在JSF 2.0中添加的。 重新显示相同的JSF页面时,视图范围内的bean仍然存在。 (JSF规范将术语“视图”用于JSF页面。)一旦用户导航到另一个页面,Bean就会超出范围。
RequestScope:请求范围是短暂的。 它在提交HTTP请求时开始,在将响应发送回客户端后结束。 如果将托管bean放入请求范围,则会为每个请求创建一个新实例。 如果您担心会话范围存储的成本,则值得考虑请求范围。
SessionScoped:会话范围从建立会话到会话终止一直存在。 如果Web应用程序在HttpSession对象上调用invalidate方法,或者会话超时,则会话终止。
ApplicationScope:应用程序作用域在Web应用程序的整个过程中一直存在。 该范围在所有请求和所有会话之间共享。 如果应在Web应用程序的所有实例之间共享单个bean,则将托管bean放入应用程序范围。 Bean是在应用程序的任何用户首次请求时构造的,并且一直保持活动状态,直到从应用程序服务器中删除Web应用程序为止。
根据需要选择范围。
JSF 2.3
从JSF 2.3开始,已弃用javax.faces.bean包中定义的所有bean作用域,以使作用域与CDI对齐。 此外,它们仅在您的bean使用@ManagedBean注释时才适用。 如果您使用的JSF版本低于2.3,请参考最后的遗留答案。
从JSF 2.3开始,这里是可以在JSF Backing Bean上使用的范围:
@javax.enterprise.context.ApplicationScoped :应用程序作用域在Web应用程序的整个持续时间内一直存在。 该范围在所有请求和所有会话之间共享。 当您拥有整个应用程序的数据时,这很有用。
@javax.enterprise.context.SessionScoped :会话范围从建立会话的时间一直持续到会话终止为止。 会话上下文在同一HTTP会话中发生的所有请求之间共享。 当您不想为特定会话保存特定客户端的数据时,此功能很有用。
@javax.enterprise.context.ConversationScoped :对话范围随着bean的存在而保持为日志。 范围提供2种方法: Conversation.begin()和Conversation.end() 。 这些方法应显式调用,以开始或结束Bean的生命。
@javax.enterprise.context.RequestScoped :请求范围是短暂的。 它在提交HTTP请求时开始,在将响应发送回客户端后结束。 如果将托管bean放入请求范围,则会为每个请求创建一个新实例。 如果您担心会话范围存储的成本,则值得考虑请求范围。
@javax.faces.flow.FlowScoped :只要Flow存在,Flow范围就会持续存在。 流可以定义为一组包含页面(或视图)的页面,这些页面定义了一个工作单元。 只要用户在Flow中进行导航,作用域就可以激活。
@javax.faces.view.ViewScoped :视图范围内的Bean在重新显示同一JSF页面时仍然存在。 一旦用户导航到另一个页面,Bean就会超出范围。