这是我几天前遇到的面试问题之一:
是否可以从service()
调用destroy()
方法?
提前致谢。
答案 0 :(得分:22)
destroy()
是一个生命周期方法,在卸载Servlet的特定实例时由Servlet容器调用。同样,当客户端请求Servlet时,容器将调用service()
。
我们可以从Servlet中的
service()
方法调用destroy()
方法吗?
简短回答: 是,因为service()
是一种与其他方法一样的方法。
答案很长: 你可以,但这没有意义。 service()
需要一个请求和响应参数,这些参数通常在调用Servlet时由容器提供。如果您自己致电service()
,您将如何提供这些参数?做什么的?你会在两者上使用null
吗?两个空参数有service()
有什么用处?
我们可以从Servlet中的
destroy()
方法调用service()
方法吗?
是,再一次,您可以在destroy()
内拨打service()
,因为它也是一种与其他方法一样的方法。虽然仍然很奇怪,但这有时会有意义,因为destroy()
将执行您定义的任何逻辑(清理,删除属性等)。
重要提示:请记住,简单地调用destroy()
将不会卸载 Servlet实例。您不管理程序中Servlet的生命周期,Servlet容器会这样做。
答案 1 :(得分:2)
destroy()
的目的是解除分配/释放Servlet实例使用的所有资源。通过调用destroy()
容器注销servlet及其服务。
是的,您可以从service(request, response)
调用类似于任何方法的destroy()
,但它不会被执行,因此无法从destroy()
调用服务方法作为这些服务方法永远不会被调用/执行,请求和响应将为null,因为容器不会提供这些对象。
public void destroy() {
try
{
doPost(null, null); // will not be executed
doGet(null, null); // will not be executed
}
catch(Exception e)
{
e.printStackTrace();
}
}
来自Java doc:
public void destroy()
由servlet容器调用,以向servlet指示servlet正在停止服务。只有在servlet的服务方法中的所有线程都已退出或超时期限过后,才会调用此方法。
在servlet容器调用此方法之后,它不会再在此servlet上调用服务方法。
此方法为servlet提供了清理所有资源的机会(例如,内存,文件句柄,线程),并确保任何持久状态与servlet在内存中的当前状态同步。