2012-07-27 19 views
0

在JSF,EJB和JPA中创建Web应用程序时,我们有一个意识形态问题。在EJB中的一个会话中存储同时编辑的实体JSF

我们的例子情况是:

管理员显示的数据表的用户列表。接下来,他选择user1,这导致他进入新的用户版网站。如果他尝试打开第二张卡或窗口并在同一会话中选择user2进行同步编辑,则会出现此问题。 当我们尝试在编辑后保存user1数据时,它是不可能的,因为它在端点被user2覆盖。

数据存储: 因为我们没有在我们的项目的View部分存储任何数据[下图可用],所以在显示它之后,Managed Beans被销毁。因此,在Controller部分中,我们决定将当前选定的用户保留为Endpoint [Stateful EJB Bean]中的字段,该会话由Session Sessiond Managed Bean持有,因此对于会话是不变的。 我们相信我们不应该在Endpoint或Session Scope Managed Bean中存储任何集合。

问题: 特定情况是对情况的概述。在我们的应用程序中,我们希望在会话期间编辑同一类型的多个实体。

问题: 我们应该在哪里以及如何存储用户/管理员的当前选择,从而导致该选定实体的版本。

将数据存储在视图中,请求作用域部分允许我们控制同一会话中的多个实体,尽管我们认为这不是合适的方法。但是现在将其存储在控制器部分中会导致在同一会话中编辑同一类型的一个实体的限制。

框图位置:http://i.stack.imgur.com/9PyYr.jpg

+0

什么应用程序服务器和它使用什么版本? – 2012-07-27 13:59:58

+0

Glassfish 3.1。 它使@AdrianMitev有什么不同? – Atais 2012-07-27 14:14:51

回答

1

由于您使用的是Java EE服务器(Glassfish的3.1),你可以得到好处使用CDI支持JSF比不同范围的。有一个名为CODI的CDI扩展,它提供了所谓的“窗口范围”,允许您为每个浏览器窗口调整bean的范围,这将解决您的问题。有关窗口范围的更多信息可以在here找到。

另一种选择是使用IceFaces JSF库,该库也支持其自己的窗口范围。更多信息可以发现here

+0

我在此期间发现了类似的解决方案,但对于JBoss,感谢您的链接!:) – Atais 2012-07-27 14:25:02

2

因此,您希望获得的教训是不要使用会话范围编辑数据或在页面之间传输数据。

你应该在这里做的是使用一个GET请求,只需要编辑用户的ID。然后在编辑页面上,使用单个视图范围的支持bean。

使用这种模式,你不需要额外的扩展。只有当你使用CDI bean作为支持bean时,你需要CODI,因为默认的@ViewScoped不幸的不能用于CDI bean。 CODI提供了一个与CDI一起工作的版本。

但是,如果您使用JSF托管的bean,请遵循上面概述的模式,您会没事的。

+0

GET请求是否是一个最佳解决方案?编辑数据时,我从未在任何公共应用程序中看到任何参数。这就是为什么我认为这很容易,但不建议。 @Mike你经常使用它吗? – Atais 2012-07-30 09:19:14

+0

这是超高效的,是的,我每天都在使用它;) – 2012-07-31 19:29:42

相关问题