无状态和有状态企业 Java Bean [英] Stateless and Stateful Enterprise Java Beans

查看:22
本文介绍了无状态和有状态企业 Java Bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在阅读 Java EE 6 教程,并试图了解无状态和有状态会话 bean 之间的区别.如果无状态会话 bean 在方法调用之间没有保持它们的状态,为什么我的程序会按照现在的方式运行?

I am going through the Java EE 6 tutorial and I am trying to understand the difference between stateless and stateful session beans. If stateless session beans do not retain their state in between method calls, why is my program acting the way it is?

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 如何工作的理解,而不是库或应用程序服务器,当然.有人能给我一个简单的 hello world 类型的无状态会话 bean 示例,当您将其更改为有状态时,它的行为会有所不同吗?

I was expecting getNumber to return 0 every time but it is returning 1 and reloads of the servlet in my browser increase it more. The problem is with my understanding of how stateless session beans work and not with the libraries or application server, of course. Can somebody give me a simple hello world type example of a stateless session bean that behaves differently when you change it to stateful?

推荐答案

重要的区别不是私有成员变量,而是将状态与特定用户相关联(想想购物车").

The important difference is not private member variables, but associating state with a particular user (think "shopping cart").

有状态会话 bean 的有状态部分类似于 servlet 中的会话.即使没有 Web 客户端,有状态会话 bean 也允许您的应用程序仍然具有该会话.当应用服务器从对象池中取出一个无状态会话 bean 时,它知道它可以用来满足任何请求,因为它与特定用户无关.

The stateful piece of stateful session bean is like the session in servlets. Stateful session beans allow your app to still have that session even if there isn't a web client. When the app server fetches a stateless session bean out of the object pool, it knows that it can be used to satisfy ANY request, because it's not associated with a particular user.

一个有状态会话 bean 必须首先分发给获得它的用户,因为他们的购物车信息应该只有他们知道.应用程序服务器确保如此.想象一下,如果您可以开始购物,然后应用服务器在我出现时将您的有状态会话 bean 提供给我,那么您的应用会有多受欢迎!

A stateful session bean has to be doled out to the user that got it in the first place, because their shopping cart info should be known only to them. The app server ensures that this is so. Imagine how popular your app would be if you could start shopping and then the app server gave your stateful session bean to me when I came along!

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

So your private data member is indeed "state", but it's not "shopping cart". Try to redo your (very good) example to make it so the incremented variable is associated with a particular user. Increment it, create a new user, and see if they can still see the incremented value. If done correctly, every user should see just their version of the counter.

这篇关于无状态和有状态企业 Java Bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆