我们可以从Servlet中的destroy()方法中调用service()方法吗?



这是几天前我在面试中遇到的一个问题:

是否可以从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在内存中的当前状态同步。

最新更新