2015-01-14 148 views
0

我最近了解到有关ejb中的有状态和无状态会话bean。我可以与无状态会话bean一起工​​作,但没有任何问题(创建了多个应用程序),但是我发现使用有状态会话bean实现应用程序很困难。使用有状态会话bean(EJB)

以下是我的场景: 客户可以使用ID登录并在其账户中进行交易。我想将id保存到登录servlet本身的会话bean中,以便我可以从会话中检索id来执行事务。

我知道如何使用httpSession而不是使用这些ejb会话(有状态bean)。请指导,我想将帐户ID保存到会话(ejb有状态会话)并将其恢复回另一个servlet。

我用的HttpSession,下面是我的代码:

HttpSession session=request.getSession(); 
session.setAttribute("accountID", accountid); 

但上面是正常的会话,我如何使用该帐户会话bean保存ID和检索。

谢谢

+0

这可能会帮助你:http://stackoverflow.com/questions/8480096/using-a-stateful-session-bean-to-track-an-users-session – asohun

回答

4

请参阅本教程here,它创建一个简单的状态会话Bean(EJB),并在Web应用程序上下文中使用它

更新感谢@Gimby:

关键在于'客户端'(这个案例中的网络应用程序本身在 中)通过将其粘贴在 的sessio中n,它使有状态bean在服务器端保持活动状态。

你需要做的第一件事就是试图从像下面的HttpSession中得到你的EJB:

MyBean bean = (MyBean) request.getSession().getAttribute("myBean"); 

然后检查豆为空或不为空,如果空创建EJB并把它添加到会话,如下所示:

if(bean == null){ 
      // EJB is not present in the HTTP session 
      // so let's fetch a new one from the container 
      try { 
      InitialContext ic = new InitialContext(); 
      bean = (MyBean) 
      ic.lookup("java:global/MyBean"); 

      // put EJB in HTTP session for future servlet calls 
      request.getSession().setAttribute(
       "myBean", 
       bean); 

      } catch (NamingException e) { 
      throw new ServletException(e); 
      } 
    } 

,这样的方式在第一时间,你需要将创建它,并把它添加到会话bean的,第二个,第三个......等等,你将它存储在会话中。

希望有帮助。

+0

关键是,'客户'(在这种情况下,Web应用程序本身)通过将它粘在会话中来保持对有状态bean的引用,这会将有状态bean保持在服务器端处于活动状态。 – Gimby

+0

@Gimby,这就是我试图在我的答案中展示的那些。 –

+0

我知道,我不是抱怨(但我忘了upvote,对不起);我只是添加一些小故事来为你的HOW添加一个WHY。海事组织这是非常重要的,尤其是因为JEE教程解释得相当糟糕。 – Gimby