当前位置: 首页 > 知识库问答 >
问题:

在servlet中使用有状态会话bean

於和志
2023-03-14

我正在使用Glassfish服务器(一个简单的购物车)尝试我的第一个EJB。我打算为每个Http会话使用CartBean。如果我的车豆跟着-

public interface CartLocal {
 public void addItem(String item);
 public void removeItem(String item);
}

@Stateful
public class CartBean implements CartLocal {
 List<String> item = new java.util.ArrayList<String>();
 public void addItem(String item) {
  ....
 }
 public void removeItem(String item) {
  ....
 }
}
@EJB CartLocal cart;

protected void doGet(....) throws IOException...... {
 cart.addItem(....);
}

共有1个答案

广献
2023-03-14

http servlet由该servlet的所有客户端共享,因此向其注入有状态会话bean是不正确的,并将导致不希望的效果。会话bean用于每个客户端,它们通常存储在http会话中,以便对该会话的所有请求都可以访问会话bean。您必须在doget方法中使用jndi查找,并将该引用存储在http会话中。存储后,您需要从http会话中检索并使用该会话。

更多信息

你有点搞错了。有状态会话bean类表示如何对有状态数据建模,它可以是细粒度相关类的图。您从容器中请求一个有状态的bean(它创建/管理/激活/钝化它)。这些服务就是我们使用有状态会话bean的目的。然而,容器并不知道它移交的任何对象属于哪个客户机。这样http会话就会出现。这部分是什么是没有强调的,因为它应该是,因此你的困惑。Http会话是一个完美存储场所,来自同一web客户端的所有请求都可以访问Http会话中存储的所有属性。因此,您可以从容器中请求它,并将它保存在一个地方(http会话),在那里,同一会话的所有请求都可以再次引用它。现在想象一下非Web客户端的情况。您没有http会话或类似的机制。一种可能的方法是将有状态bean引用存储在某个地方(例如,将key作为clientId,将value作为bean引用存储在一个map中),当客户机下一次想要访问bean时,它会传递clientId并从map中获取它。

就http会话优先于有状态bean而言,理解http会话不是线程安全的很重要。因此,如果有一个ajax重型应用程序同时访问会话中的对象,则必须提供自己的同步机制,这将是不可伸缩的,并且会严重影响性能。在有状态会话bean的情况下,容器管理同步。

这里有一个关于使用http会话存储状态主题的有趣讨论。讨论的是Brian Goetz的一篇内容丰富的文章“所有有状态Java Web应用程序都坏了吗?”。不幸的是,我无法在IBM站点上找到原始文章,但讨论线程提供了足够的材料来思考。

 类似资料:
  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果

  • 有状态会话bean定义如下: 无状态会话bean无状态会话bean不维护与客户端的会话状态。当客户机调用无状态bean的方法时,该bean的实例变量可能包含特定于该客户机的状态,但仅限于调用期间。当方法完成时,客户端特定状态不应保留。然而,客户端可能会更改池化无状态bean中实例变量的状态,并且此状态将保留到下一次调用池化无状态bean时。除了在方法调用期间,无状态bean的所有实例都是等效的,允