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