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



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

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

只要用户会话处于活动状态,@SessionScopeBean 就会存在。(因此得名) - 它在请求和视图之间共享,这是您面临的"问题"。

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

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

应用程序的行为是正确的。请阅读有关 Java EE 6 教程的作用的部分。

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

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

最新更新