我明白一个有状态的EJB可以对java客户端有用。
但是我想知道在哪种情况下在Web应用程序中使用它们?如何?
我们应该将这些有状态的bean放在Session中(因为无状态http)吗?
这是一个很好的做法吗?
(没有辩论太多关于状态与无国籍)
解决方法
in which case to use them on a web
application?
SFSB和Web应用程序的传统示例是购物车。但与此同时,您也可以使用HttpSession做同样的操作。
理想情况下,如果状态与业务逻辑有关,而不是表示逻辑,则应该在SFSB中。但在实践中,人们通常主张反对SFSB(因为它引入的复杂性),除非他们提供一些你不能轻易地使用HttpSession的东西。大多数情况下,您可以调整设计以将信息存储在HttpSession或数据库中,并传递给它,而无需使用SFSB。但它最终是设计纯度的问题。
And how? Should we put these stateful
beans in Session (because of stateless
http)?
EJB模型比HttpSession更为丰富,因为EJB是事务组件,对于SFSB的钝化和激活有明确的回调。特别是(1)异常处理和(2)并发以及(2)SFSB的删除和超时,这对于正确使用SFSB的复杂性越来越高。有关详细信息,请参阅我的答案
> Java: Tracking a user login session – Session EJBs vs HTTPSession
> Correct usage of Stateful Beans with Servlets
如果要使用它们,您需要首先查找SFSB以获取对一个新的远程实例的引用。那么你将需要将这个引用存储在某个地方,以便跨请求重用它。这个地方通常是HttpSession,这意味着即使你使用SFSB,也不能完全摆脱它。
使用EJB2,远程引用(称为句柄)可以被序列化以便稍后重用。这样就可以存储,例如在数据库中,即使我从来没有看到过。我不知道EJB3是否还可以。
Is it a good practice?
正如我已经说过的,人们通常会反对它,除非你知道为什么要使用它们而不是HttpSession,只有你有一个很好的EJB模型的命令。 (例如,如果通过Web前端和桌面客户端访问业务服务,SFSB可能是正当的)许多其他框架与SFSB没有类似的东西,人们仍然可以通过它们创建优秀的应用程序。
PS:我在网络应用程序中使用了SFSB,与HttpSession相比,它的使用效果确实比较棘手,但是它最终起作用。