0

我有一个 J2ee 应用程序,我基本上想要两个对象,由两个单独的 servlet 创建以直接通信,并且我需要这些实例是稳定的,即在会话期间相互“了解”。

顺序大致是:

  1. 客户端向 Servlet #1 发送请求,后者创建对象 A
  2. 客户端向创建对象 B 的 servlet #2 发送第二个请求(在第一个返回之后)。
  3. 对象 B 使用 JNDI 找到 A,两个对象交互。
  4. 客户端现在继续向需要再次查找 B 的对象 A 发送请求。

我如何确保这两个实例在整个会话期间都知道?将它们绑定到 JNDI 并不能完全解决问题,因为对象 B 需要与其原始 servlet(servlet #2)通信,而该 servlet 在请求之间并不能保持稳定。

有任何想法吗?

提前致谢。


是的,我承认问题描述有点模糊。但这不是一个非常简单的应用程序。不过,我会尝试更好地问它:

我的最终目标是为我的应用程序创建一种“语义调试器”,而不是简单地调试 java 语句的 java 调试器。

被调试的应用程序基本上是一个 servlet。我的工具连接到的。该工具通过另一个控制调试过程的 servlet 维护与应用程序的连接。这两个 servlet 需要不断地直接相互通信。

我目前的想法是设置一个有状态的会话 bean 来促进这种通信(从未做过,仍在努力设置它)。

但我将不胜感激有关如何更好地实现这一目标的任何想法。

4

2 回答 2

1

是什么阻止您使用 Session?您不需要 JNDI,只需将您的对象以预定义的名称放入会话中。如果通信对象是应用程序范围的,请使用 Singleton。

PS在我看来,您正在做一些奇怪的事情,而解决方案实际上可能更简单。你能描述一下任务,而不是建议的实现吗?什么是“语义调试器”?

于 2008-10-31T17:58:47.020 回答
0

老实说:我不完全理解你想要达到的目标。您能否尝试解释您要解决的问题而不是解决方案?

这些对象依赖于什么?它们是特定于用户的吗?然后将它们放入会话中,您可以再次从会话中检索它们(request.getSession().getAttribute("A"))。

它们对所有用户都是全球性的吗?在这种情况下,将它们放入弹簧配置并从那里检索它们。

永远不要在 servlet 中存储任何信息。

编辑:好的,所以据我所知,在会话中存储值是解决这个问题的最佳方法(在“Java-Pseudo-Code”中):

public class BusinessServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
  HttpSession session = req.getSession(true);
  BusinessCode business = session.getAttribute("A");
  if (business == null) {       
    business = new BusinessCode();
    session.setAttribute("A", business);
  }

  DebugObject debug = session.getAttribute("B");
  if (debug == null) {       
    debug = new DebugObject();
    session.setAttribute("B", debug);
  }

  business.doSomeWork(debug); 
  }
} 

public class DebugServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
    HttpSession session = req.getSession(true);
    DebugObject debug = session.getAttribute("B");
    if (debug != null) {
      debug.printDebugMessages(res);
    }
  }
} 

这有帮助吗?

于 2008-10-31T09:52:16.743 回答