我的朋友在服务器上设置了我的应用程序(使用Eclipse Kepler Service Release 2,GWT 2.6.0,Tomcat 6开发 - 下一个版本,我正在测试的将是Tomcat 7),我收到了这个来自他的消息: “您可以检查应用程序中是否存在内存泄漏,因为我在Apache Tomcat中运行诊断时收到此消息: 以下Web应用程序已停止(重新加载,取消部署),但是
以前运行的类仍然会加载到内存中,从而导致内存 泄漏(使用分析器确认): / awardtracker“
所以我调查并发现我需要使用ServletContextListener来清理那些引用。所以我找到了一个例子;请看下面。
我有两个问题。
首先,我应该在“context.setAttribute(”TEST“,”TEST_VALUE“)行中加入什么内容;”代替“TEST”和“TEST_VALUE”?
其次,当我运行应用程序时,我收到消息“Context Created”但是当我关闭应用程序时我没有收到消息“Context Destroyed”(我这样做只需关闭浏览器)。我怎样才能破坏背景?
package org.AwardTracker.server;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebServlet;
/**
* Servlet implementation class ServletContextImpl
*/
@WebServlet("/ServletContextImpl")
public class ServletContextImpl implements ServletContextListener{
ServletContext context;
public void contextInitialized(ServletContextEvent contextEvent) {
System.out.println("Context Created");
context = contextEvent.getServletContext();
// set variable to servlet context
context.setAttribute("TEST", "TEST_VALUE");
}
public void contextDestroyed(ServletContextEvent contextEvent) {
context = contextEvent.getServletContext();
System.out.println("Context Destroyed");
}
}
和xml:
<listener>
<listener-class>
org.AwardTracker.server.ServletContextImpl
</listener-class>
</listener>
答案 0 :(得分:0)
您不需要ServletContext
作为ServletContextImpl
课程的实例成员。
只要您需要它,只需从ServletContextEvent
访问它,就像您在下面的代码中所做的那样:
context = contextEvent.getServletContext();
在应用程序中,您可以通过HttpSession#getServletContext()
访问ServletContext
。
ServletContext context = request.getSession().getServletContext();
有关详细信息,请查看How to get the Servlet Context from ServletRequest in Servlet 2.5?
其次,当我运行应用程序时,我会收到消息&#34; Context Created&#34;但是我没有收到消息&#34; Context Destroyed&#34;当我关闭应用程序时(我只需关闭浏览器即可)。
简单地关闭浏览器并不会破坏上下文。应用程序上下文不仅适用于每个客户端。您可以为每个客户端使用HTTP会话。
当服务器以标准方式正常停止时,将调用方法contextDestroyed()
。
欲了解更多信息,请查看以下帖子
如何破坏上下文?
理想情况下,当App服务器(Tomcat或JBoss)关闭或有时甚至重新启动时,ServletContext
会被破坏。
请看下面的链接: