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

How can I use a session bean and deal with many tabs with different parameters?

在 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。 Session bean 使用新的 id 300 值覆盖先前参数 200 的当前值。

所以我的问题是如何使用会话 bean 并处理许多具有不同参数的选项卡?如何为每个选项卡创建一个会话 Bean?如果这不可能,那么人们在这种情况下使用什么解决方案?谢谢

您的应用程序的行为是正确的。请阅读 The Java EE 6 TutorialScopes 部分。

您的应用程序已经为当前用户创建了一个会话作用域 bean,并且该用户的所有请求都将使用它。在此类 bean 中创建的任何变量都将由用户打开的任何选项卡共享。

如果您希望用户在多个选项卡上使用同一变量的不同值进行交互,请考虑使用 请求作用域 bean

A @SessionScope 只要用户会话处于活动状态,Bean 就会存在。 (因此得名)- 它在请求和视图之间共享,也就是您所面对的 "Problem"。

A @RequestScope Bean 将在每次请求时重新创建(无论是首次访问还是 Ajax-请求),这可以用于您的用例(根据重新提交的 ID 重新加载数据) ), 但可以优化。 (这将是传统的 Request/Response-Model,从 PHP 中得知 - JSF 提供了更好的选择)

您的案例与 @ViewScope 完全匹配。每个 View 一个 Bean,只要 View 存在就一直存在。这将允许您打开(几乎)无限数量的不同 Views(因此得名),只要它们是 @ViewScope,每个都有它自己的一组 BackingBeans。同一页面的多个 "Views" 是可能的,每个 View 将维护对其专用 View-Scoped-Bean 的引用。 (在您的示例中:2 个打开的 text.xhtml 页面,因此 TestBean 的 2 个活动实例,每个实例都有自己的 ID