【问题标题】:Private instance variable in servlet set to null?servlet中的私有实例变量设置为null?
【发布时间】:2011-11-25 10:25:20
【问题描述】:

在我的 servlet 中,我启动了一个后台线程 onContextInitialized(),因此我需要停止它 onContextDestroyed()。所以我的 servlet 需要一个指向这个守护线程的私有实例变量(我们称之为daemon)。 守护进程运行良好,但是当我退出 contextInitialized() 时引用就丢失了!例如,如果我实现doGet() 来显示线程的状态,它会抛出一个NPE

所以答案是,谁能访问我的 servlet 私有实例变量并将其设置为 null? 我注意到线程运行得很好,只是引用被破坏了

【问题讨论】:

  • 可以把onContextInitialized的代码贴上来吗?这听起来很奇怪。是不是因为你在 onContextInitialized 中声明了一个类似的命名局部变量,所以实例变量被隐藏了?
  • 不,在我看来,servlet 对象在 contextInitialized() 执行后被销毁。很难理解为什么..

标签: java jakarta-ee tomcat servlets servlet-listeners


【解决方案1】:

只需在应用程序上下文中设置引用或将其设置为某个类的某个静态字段[不太可取]

不确定你想达到什么目的,但这会做

【讨论】:

  • 谢谢,这正是文档所说的:)
  • 但是我不明白为什么在调用 contextInitialized() 之后 servlet 对象在 Tomcat 中被销毁...
  • 我不明白 However I don't understand why the servlet object is destroyed in Tomcat after contextInitialized() is called... 如果你想解决这个疑问,请输入代码
  • 抱歉,我无法发布我的代码,因为我现在和周末都无法访问它。无论如何,它非常小:一个实现 ServletContextListener 的简单 servlet
【解决方案2】:

将其设为static,以便所有实例都可以看到它:

private static Thread daemon;

【讨论】:

  • AFAIK 这应该不是必需的,因为 Tomcat 会初始化 servlet,然后引用该实例对象
  • @Raggaele 你是对的,在大多数 Servlet 容器中它不应该是必需的。如果可以,请发布您的代码。
  • 将其设置为静态就可以了。但是我更喜欢@Jigar Joshi 的答案,因为这正是官方文档所说的(即,使用 ServletContext.setAttribute())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2011-01-09
  • 2011-01-23
  • 2012-02-20
  • 2012-04-10
  • 2013-07-07
  • 1970-01-01
相关资源
最近更新 更多