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

Jsf 如何使用会话bean并处理具有不同参数的多个选项卡?,jsf,cdi,session-scope,Jsf,Cdi,Session Scope,在JSF2.2应用程序中,有一个名为test.xhtml的页面,它接受一个名为“id”的参数,例如test.xhtml?id=200。该页面由名为“TestBean”的CDI会话bean支持。该页面包含以下代码以加载数据: <f:metadata> <f:viewAction action="#{testBean.redirectNoParameters}"></f:viewAction> </f:metadata> 到现在为止一切都很好

在JSF2.2应用程序中,有一个名为test.xhtml的页面,它接受一个名为“id”的参数,例如
test.xhtml?id=200
。该页面由名为“TestBean”的CDI会话bean支持。该页面包含以下代码以加载数据:

<f:metadata>
    <f:viewAction action="#{testBean.redirectNoParameters}"></f:viewAction>
</f:metadata>
到现在为止一切都很好

除了当用户在浏览器中打开一个新选项卡并指定一个不同的id时,例如
test.xhtml?id=300
。会话bean用新的id300值覆盖上一个参数200的当前值


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

应用程序的行为是正确的。请阅读有关的范围的部分

您的应用程序已经为当前用户创建了一个会话范围bean,该bean将由该用户的所有请求使用。在这样的bean中创建的任何变量都将被用户打开的任何选项卡共享


如果您希望用户在同一个变量的多个选项卡上交互,请考虑使用“强>请求范围bean”/>强>

a >代码> @ Session Seist<:/Cule> bean,只要用户会话处于活动状态,Bean就可以生存。(因此得名)-它在请求和视图之间共享,这是您面临的“问题”

@RequestScope
Bean将在每次请求时重新创建(无论是首次访问还是Ajax请求),这可以用于您的用例(基于重新提交的ID重新加载数据),但可以进行优化。(这将是一个传统的请求/响应模型,如PHP所知,JSF提供了一个更好的选择)


您的案例与
@ViewScope
完全匹配。每个视图一个Bean,只要视图存在就可以生存。这将允许您打开(几乎)无限多不同的
视图
(因此,名称),每个视图都有一组单独的backingbean,只要它们是
@ViewScope
。同一页面的多个“视图”是可能的,每个视图将维护对其专用视图范围bean的引用。(在您的示例中:打开了两个
text.xhtml
页面,因此有两个
TestBean
的活动实例,每个实例都有自己的
ID

例如,当您打开“test.xhtml?ID=200”时,页面上有一个删除按钮,用于删除实体测试,该实体测试的值为200。在会话范围中,我只调用testDao.remove(test.getId),其中test是会话bean testBean中加载的字段。在RequestScoped bean中,没有测试实体,字段不会被保存。那么,应该如何为后续请求保存“测试”实体??!!谢谢您可以在url:test.xhtml?ID=200&action=delete ViewAccessScoped或WindowScoped ViewAccessScoped或WindowScopedThanks中传递ID和操作。我将尝试更改范围。
public String redirectNoParameters() {
//Code…
//Load fields
            test = testDao.find(id); 
//Code…
    }