当前位置: 首页 > 面试题库 >

无状态和有状态的企业Java Bean

燕烨
2023-03-14
问题内容

我正在阅读Java EE
6教程,试图理解无状态会话bean和有状态会话bean之间的区别。如果无状态会话bean在方法调用之间没有保持其状态,为什么我的程序按原样运行?

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

客户端

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

我原本希望getNumber每次都返回0,但它返回1,并且在浏览器中重新加载servlet会使它更多。问题在于我对无状态会话Bean如何工作的理解,而与库或应用程序服务器无关。有人可以给我一个无状态会话bean的简单hello
world type示例,当您将其更改为有状态时,其行为会有所不同吗?


问题答案:

重要的区别不是私有成员变量,而是将状态与特定用户相关联(请考虑“购物车”)。

有状态会话Bean的有状态片段就像servlet中的会话一样。有状态会话Bean允许您的应用即使没有Web客户端也仍然具有该会话。当应用服务器从对象池中获取无状态会话Bean时,它知道可以将其用于满足ANY请求,因为它与特定用户没有关联。

必须将有状态会话Bean分发给最初获得该会话Bean的用户,因为他们的购物车信息仅应由他们知道。应用服务器确保做到这一点。想象一下,如果您可以开始购物,然后我来的时候,应用服务器就将您的有状态会话bean给我,那么您的应用将会有多受欢迎!

因此,您的私人数据成员确实是“州”,但不是“购物车”。尝试重做您的(非常好)示例,以使增量变量与特定用户相关联。增加它,创建一个新用户,然后查看他们是否仍然可以看到增加的值。如果操作正确,每个用户都应该只看到他们的计数器版本。



 类似资料:
  • 在接口流中: 中间操作可分为有状态和无状态。它们影响并行流的结果。 只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们影响并行流的结果。 如果中间无状态操作执行惰性操作,它们可能会产生副作用。这会影响并行Stream的结果。 中间操作可分为以下几类: 有状态 不同的() 排序() 极限(长l) 跳过(长l) 无国籍 地图(功能f) 以下是我的两个问题: >

  • 实现无状态EJB 3.1以调用Web服务的正确方法是什么?我的客户端作为Servlet工作,但是我想将调用移动到EEJ bean中。我必须在SOAP头信封中添加用户名和密码才能访问WS,这很正常。 servlet正在使用的服务如下所示; 我可以在无状态EJB中包装,还是bean本身应该在不包装MessageService的情况下使用(如教程中所示)? 辅导的

  • 帮助用户快速部署无状态的应用。 无状态应用即Deployment,Deployment的详细介绍内容,请参考kubernets官方文档-Deployments。 Pod是Kubernetes的最小编排单位,无状态deployment应用即通过声明pod模板等信息编排部署无状态应用,适用于pod完全一样、没有顺序、无所谓运行在哪台主机的应用。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中

  • 问题内容: 根据OCP的书,必须避免有状态操作,否则称为有状态lambda表达式。本书中提供的定义是“有状态的lambda表达式,其结果取决于在管道执行期间可能更改的任何状态”。 它们提供了一个示例,其中使用并行流使用函数将固定的数字集合添加到同步的ArrayList 。 arraylist中的顺序是完全随机的,这应该使人看到有状态的lambda表达式在运行时会产生不可预测的结果。因此,强烈建议在

  • 问题内容: 我试图了解React的有状态和无状态组件之间的确切区别。好的,无状态组件只会做某事,但是什么也不会记住,而有状态组件可能会做同样的事情,但是它们会记住其中的内容。那是理论。 但是现在,在检查如何使用代码显示此内容时,我有点麻烦了。以下两个示例对吗?唯一的区别确实是函数的定义。 无状态组件的示例: 有状态组件的示例: 问题答案: 是的,那是有区别的。除了有 状态 组件,您还可以使用以下方

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