在JSF 2.2应用程序中,有一个名为test.xhtml的页面,它采用一个名为">id"的参数,例如test.xhtml?id=200
。该页面由名为">TestBean"的 CDI 会话 Bean 提供支持。该页面包含以下代码来加载数据:
<f:metadata>
<f:viewAction action="#{testBean.redirectNoParameters}"></f:viewAction>
</f:metadata>
现在,应用程序根据 id 在会话 Bean 中加载一组具有正确值的字段。
public String redirectNoParameters() {
//Code…
//Load fields
test = testDao.find(id);
//Code…
}
到现在都很好。
除了当用户在浏览器中打开新选项卡并指定不同的 id(例如test.xhtml?id=300
. 会话 Bean 使用新的 id 300 值覆盖前一个参数200的当前值。
所以我的问题是如何使用会话 bean 并处理许多具有不同参数的选项卡?如何为每个选项卡设置一个会话 Bean?如果这是不可能的,那么人们在这种情况下使用什么解决方案?谢谢。
只要用户会话处于活动状态,@SessionScope
Bean 就会存在。(因此得名) - 它在请求和视图之间共享,这是您面临的"问题"。
每个请求(无论是首次访问还是 Ajax 请求)都会重新创建一个@RequestScope
Bean,这可以用于您的用例(根据重新提交的 ID 重新加载数据),但可以进行优化。(这将是PHP中已知的传统请求/响应模型 - JSF提供了更好的选择)
您的案例与@ViewScope
完美匹配。每个视图一个 Bean,只要视图存在,它就一直存在。这将允许您打开(几乎)无限数量的不同Views
(因此,名称),每个都有单独的一组 BackingBeans,只要它们是@ViewScope
。同一页面的多个"视图"是可能的,每个视图将保留对其专用视图范围 Bean 的引用。(在您的示例中:2 个打开的text.xhtml
个页面,因此 2 个活动TestBean
实例,每个实例都有自己的ID
)
应用程序的行为是正确的。请阅读有关 Java EE 6 教程的作用域的部分。
您的应用程序已为当前用户创建了一个会话范围的 Bean,该用户的所有请求都将使用该 Bean。在此类 Bean 中创建的任何变量都将由用户打开的任何选项卡共享。
如果您希望用户在多个选项卡上使用同一变量的不同值进行交互,请考虑使用请求范围的 Bean。