在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覆盖上一个参数 200 的当前值,并使用新的id 300 值。
所以我的问题是如何使用会话bean并处理具有不同参数的许多选项卡?如何为每个选项卡提供会话bean?如果这不可能是人们用于这种情况的解决方案吗?感谢。
答案 0 :(得分:1)
只要用户会话处于活动状态,就会生存@SessionScope
Bean。 (因此得名) - 它在请求和视图之间共享,这是&#34;问题&#34;你面对的是。
每次请求都会重新创建@RequestScope
Bean(如果是第一次访问或Ajax请求则无关紧要),这可以用于您的用例(根据重新提交的ID重新加载数据),但可以进行优化。 (这将是PHP中已知的传统请求/响应模型 - JSF提供了更好的选择)
您的案例与@ViewScope
完全匹配。每个视图一个Bean,只要视图存在就一直存在。这将允许您打开(几乎)无限量的不同Views
(因此,名称),每个都具有它的单独的BackingBeans集合,只要它们是@ViewScope
。多个&#34;视图&#34;在同一页面中,每个View都将保留对它的专用View-Scoped-Beans的引用。 (在您的示例中:2个已打开的text.xhtml
页面,因此有2个TestBean
的有效实例,每个都有自己的ID
)
答案 1 :(得分:0)
您的应用程序的行为是正确的。请阅读The Java EE 6 Tutorial的范围部分。
您的应用已为当前用户创建了会话范围的bean ,并且所有请求都会使用该用户。在此类bean中创建的任何变量都将由用户打开的任何选项卡共享。
如果您希望用户在同一变量的不同值的多个选项卡上进行交互,请考虑使用请求范围的bean 。