如何使用会话bean并处理具有不同参数的许多选项卡?

时间:2017-10-23 08:25:54

标签: jsf cdi session-scope

在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?如果这不可能是人们用于这种情况的解决方案吗?感谢。

2 个答案:

答案 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