我如何使用会话 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 Tutorial 的 Scopes 部分。
您的应用程序已经为当前用户创建了一个会话作用域 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
)
在 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 Tutorial 的 Scopes 部分。
您的应用程序已经为当前用户创建了一个会话作用域 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
)