代码之家  ›  专栏  ›  技术社区  ›  Karl

JavaEE在Web与EJB层之间的会话管理

  •  2
  • Karl  · 技术社区  · 15 年前

    我有一个JavaEE应用程序,由1个Web模块和1个EJB模块组成。在EJB模块中,我有一个包含业务逻辑的有状态会话bean。

    我想要的是:

    当用户登录到我的Web应用程序并在Web层中创建新会话时,我希望向该用户分配会话be an的实例。

    目前,正在Web层中按预期创建会话,但我不确定如何每次将Web层中的会话映射到新的EJB会话。目前,我正在从servlet调用EJB,这意味着只创建了bean的一个实例。我正在尝试在Web会话和EJB层中的会话之间获得1-1映射。

    我知道使用应用程序客户机可以很容易地实现这一点,但是关于如何在Web层实现这一点的任何建议/设计模式都将非常感谢。

    1 回复  |  直到 11 年前
        1
  •  3
  •   djna    15 年前

    有状态会话并不总是一个好的选择,有时对数据库使用持久性更容易。

    在servlet中,当处理来自用户的请求时,获取到您的sfsb的“句柄”。把这个“把手”放到你的httpsession中。现在,当该用户的下一个请求到达时,您已经准备好了句柄。

    对于EJB3.0,这样做。

    在类范围内用@ejb声明bean引用,这将设置稍后将使用的引用

    @EJB 
    (name=“CounterBean", beanInterface=Counter.class)
    public class MyStarterServlet …
    

    当您处理请求:使用JNDI和声明的bean名称访问EJB时,请注意,此代码在doget()和/或dopost()方法中,“counter”变量必须是本地的(在堆栈上),因为servlet对象可能同时在多个请求之间共享。

    Context ctx = new InitialContext(); 
    Counter counter = (Counter)
    ctx.lookup(“java:comp/env/CounterBean”);
    counter.increment();
    

    将接口存储在要根据需要检索的httpsession对象中

    session.setAttribute(“counter”, counter);