我有一个J2ee应用程序,其中我基本上需要两个对象,由两个独立的servlet直接通信创建,我需要这些内容稳定,即在会话期间互相“知道”。
序列大致为:
如何在整个会话期间确保这两个实例都知道? 将它们绑定到JNDI并不能完全解决问题,因为对象B需要与其原始servlet(servlet#2)进行通信,而servlet在请求之间不能保持稳定。
有什么想法吗?
提前致谢。
是的,我承认问题描述有点模糊。但这不是一个非常简单的应用程序。 不过,我会试着更好地问它:
我的最终目标是为我的应用程序创建一种“语义调试器”,而不是简单地调试java语句的java调试器。
调试的应用程序基本上是一个servlet。我的工具连接到哪个。 该工具通过另一个控制调试过程的servlet维护与应用程序的连接。 这两个servlet需要不断地直接相互通信。
我目前的想法是建立一个有状态的会话bean来促进这种沟通(从来没有做过,仍然在努力设置它)。
但我很感激有关如何更好地实现这一目标的任何想法。
答案 0 :(得分:1)
是什么阻止你使用Session?您不需要JNDI,只需将对象置于预定义名称下的会话中即可。如果通信对象是应用程序范围的,请使用Singleton。
P.S。它看起来你在做一些奇怪的事情,而解决方案实际上可能更简单。你能描述一下这项任务,而不是拟议的实施吗?无论如何,什么是“语义调试器”?
答案 1 :(得分:0)
说实话:我并不完全明白你想要达到的目的。 您是否可以尝试解释您尝试解决的问题而不是解决方案?
这些对象依赖于什么?他们是用户特定的吗?然后将它们放入会话中,您可以再次从会话中检索它们(request.getSession()。getAttribute(“A”))。
它们对所有用户都是全球性的吗?在这种情况下,将它们放入弹簧配置并从那里检索它们。
永远不要在servlet中存储任何信息。
编辑: 好的,所以根据我的理解,在会话中存储值是imho解决这个问题的最佳方法(在“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);
}
}
}
这有帮助吗?