0

我是 EJB 的新手,所以请不要介意这个问题有什么愚蠢的。

我怀疑有人可能有希望解决。

我有以下有状态的 Bean:

@Stateful
public class SessionBean implements SessionBeanRemote {

    private int count = 0;

    @Override
    public int getCount(){
    count++;
    return count;

    }

}

这是调用 Bean (Servlet) 的客户端

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        InitialContext ctx;
        HttpSession session = null;
        SessionBeanRemote obj;
        try {
            if (session.getAttribute("myBean") == null) {
                ctx = new InitialContext();
                obj = (SessionBeanRemote) ctx.lookup("SessionBean/remote");
                session.setAttribute("myBean", obj);
            } else {
                obj = (SessionBeanRemote) session.getAttribute("myBean");
            }

            System.out.println(obj.getCount());

        } catch (NamingException ex) {
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

现在我想知道是否最终是 HttpSession 必须持有会话 bean,那么为什么要使用 EJB,为什么不直接在会话中存储我们想要的任何内容,而不是先将它存储在会话 bean 中,然后将该 bean 存储在会议。

而且我想知道是否可以说我将@Stateful注释更改为@Stateless,然后在客户端执行相同的代码并将bean存储在会话中,然后我也可以从会话中提取相同的bean,那么有什么区别在无状态和有状态之间,我知道当新的查找完成时,有可能将相同的无状态 bean 返回给我,而与有状态 bean 一样,当我们进行查找时它总是新的。但就是这样吗?

PS 正如我之前提到的,我是 EJB 的新手,所有的疑问都是基于我从一些在线教程和一些关于 SO 的问题中了解到的。我也尝试在本地运行它,但不幸的是我无法在 GlassFish 上部署应用程序,因为出现以下错误“加载应用程序时出现异常:EJB 容器初始化错误”。我正在尝试调查它。

4

3 回答 3

1

这是两个不相关的概念。

如果你分开关注,你应该这样做。然后 HTTP 会话和 EJB 会话在逻辑上不同的层上运行。http 会话用于保存单个 Web 浏览器和用户状态。EJB 会话用于在企业应用程序客户端的上下文中保持事务性、可伸缩性和容错性以及“透明”(并且可能是远程)引用。

您使用 EJB 来提供 Web 内容这一事实并不意味着您也不能使用相同的 EJB 来为 JFC/Swing(或 JavaFX)客户端提供服务。

于 2015-01-15T04:14:46.787 回答
0

EJB 会话

EJB 中的会话是使用服务器 JVM 上的 SessionBeans 来维护的。您设计的 bean 可以包含业务逻辑或计算或动态页面,并且可以由客户端使用。您有两种不同的会话 bean:有状态和无状态。

有状态的:以某种方式与单个客户端(每个 bean 的对象)连接。它维护该客户端的状态,只能由该客户端使用,当客户端“死亡”时,会话 bean 将“丢失”。有状态 bean 的生命周期与客户端绑定。(在基于角色的应用程序/系统中非常有用)

无状态:无状态会话 Bean 不维护任何状态,并且无法保证同一个客户端将使用同一个无状态 bean,即使是一个接一个的两个调用。无状态会话 EJB 的生命周期与有状态会话 EJB 的生命周期略有不同。EJB Container 是否负责准确了解如何跟踪每个会话并将请求从客户端重定向到正确的会话 Bean 实例以及每个实例的相同作业。

在哪里:

HTTPSession:通过请求对象获取。你不能真正实例化一个新的 HttpSession 对象,它不包含任何业务逻辑或计算,但更多的是存储对象(客户端作为输出或服务器作为输入)的地方,以及两个或多个系统的通信通过网络。

于 2015-01-15T04:57:29.820 回答
0

我会尽量给你一个简化的答案。

是的,您必须在某处存储对 SFSB 的引用,以防 Web 应用程序在 http 会话中,但正如 Elliott 所写,您可能也有不同的客户端类型。

Session bean 与 POJO 的一些好处:

  • 容器事务管理
  • 集装箱安全执法
  • 可以通过远程接口进行远程访问
  • 允许部署为单独的模块 (EJB),以获得更好的可重用性。

如果您的会话 bean 依赖于状态,那么将状态保存在 bean 中比在每个方法调用中传递所有状态信息更合乎逻辑。

您的示例非常简单,您不使用事务、持久性、安全性,因此根本没有使用 SFSB 甚至 EJB 的意义。

SFSB 被认为是相当重量级的,通常应该避免使用,我想说大多数 Web 应用程序不使用它们(实际上取决于应用程序要求)。所以你应该把你的服务设计成无状态的,宁愿使用无状态的bean而不是有状态的,这样你就会有更好的性能和更容易的可重用性。

因此,如果您打算使用我提供的某些功能,您可能会从 EJB 中受益,否则您可能会对 POJO 中的 Http 会话和业务逻辑感到满意。

于 2015-01-15T09:56:13.913 回答