2010-09-23 48 views
0

我正在使用。 和我的托管bean在会话范围中定义。当我打开一个新的浏览器时,托管bean的构造函数第一次被调用。但在此之后,当我打开另一个浏览器实例时,我直接看到该方法正在调用,而不是通过托管bean的构造函数。JSF:如何强制为每个浏览实例创建一个新的托管bean实例

有没有做具体的方式,在JSF中创建托管Bean的新实例为每个浏览器实例

Apprecitate任何帮助

鲍勃

回答

2

“问题”是在你的网页浏览器。它在所有实例/窗口/选项卡之间共享相同的会话。这是正常的行为。在JSF 2.x中,您可以通过将bean放置在view范围内来“解决”这个问题,只要您每次提交并导航回相同的视图,就可以使bean保持活动状态。在JSF 1.x中,它缺乏view范围,你可以通过将豆在request范围和使用任何Tomahawk's <t:saveState>,或RichFaces' <a4j:keepAlive>,或JBoss Seam对话范围,或MyFaces Orchestra实现期望的行为。

同样,这个问题不是JSF特有的。标准的HTTP规范根本不提供任何方式来区分客户端的状态(新实例,选项卡或窗口)和服务器端。

+0

感谢您的回复。请您告诉我,如何在视图范围内定义bean – Bob 2010-09-24 00:13:47

+0

使用'@ ViewScoped'或'视图'。再一次,这只是JSF 2.x。在JSF 1.x中,你只有'request','session','application'和'none'。 – BalusC 2010-09-24 00:32:03

+0

非常感谢BalusC的帮助。最后一个问题,我使用的是JSF2.0(Mojarra),而且我有一个preRenderView事件,那么a4j:keepAlive会工作吗?因为我试过了,我没有看到任何效果。 – Bob 2010-09-24 05:57:15

0

第一种方法,最明显的是使用请求范围bean

但是,正如前面描述的那样,您不能为每个浏览器窗口都创建会话bean的新实例。

相关问题