【问题标题】:Why use session bean at all if ultimately its the HttpSession that holds the state如果最终它是持有状态的 HttpSession,为什么还要使用会话 bean
【发布时间】:2015-01-15 04:05:09
【问题描述】:

我是 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 一样,当我们进行查找时它总是新的。但就是这样吗?

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

【问题讨论】:

  • 除了下面的好答案之外,永远不要低估“这是自动为我处理”的价值。
  • @chrylis 但它并没有被自动处理,在查找之后我必须将它存储在 HttpSession 中,以便我总是得到相同的实例。那么为什么不存储一个普通的对象而不是一个bean。或者为什么不存储无状态 bean。

标签: java ejb session-bean


【解决方案1】:

它们是两个不相关的概念。

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

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

【讨论】:

  • 很抱歉,您能否简化一下。正如我所说的新概念。
  • 这个答案很简单。 Java的企业版非常复杂。它为您提供了很多工具。例如,您可以构建没有基于 Web 的 UI 的应用程序。通过基于 Web 的 UI,您可以构建使用 EJB 的应用程序。那么,您最终要构建什么样的应用程序,以及您必须构建和维护与其他系统的哪些其他集成?你需要可重用的模块吗?您是否有高可用性和 SLA 要求?扩展要求?
【解决方案2】:

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

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

Session bean 与 POJO 的一些好处:

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

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

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

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

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

【讨论】:

  • 这是一个新手会理解的东西.. :-) 谢谢我的朋友。我想我需要查看 Transaction, Security 才能更好地了解 SFSB 的用途。 @ 你是否知道我可以在任何地方获得这些示例或教程。
【解决方案3】:

EJB 会话

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

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

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

地点:

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

【讨论】:

  • @Sarx 如果我错了,请纠正我,但在所有情况下,您都需要在客户端会话(例如 HTTP)中存储对有状态 SB 的引用,因为每次对有状态 SB 的查找都会返回一个新的实例。所以我想知道为什么不存储一个普通的对象而不是存储一个 bean。这里的 bean 有什么特别之处。
  • HttpSession 仅用于识别用户,比如说用户分析。有状态的会话 bean(为每个客户端创建新对象)跟踪您的身份并相应地从数据库中动态填充数据(基于角色),例如使用 PersistenceContext。 HttpSession 是 Web 技术服务器,可以通过多种方式维护会话,例如使用 cookie 或重写 URL,而 EJB 会话是 Java 技术服务器将状态作为 Java 应用程序的对象进行维护。我认为你混合了他们的名字。
猜你喜欢
  • 2010-12-13
  • 2012-09-06
  • 2010-09-13
  • 2017-09-15
  • 2016-04-14
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多