8

这是我前几天面临的面试问题之一:

是否可以从 调用该service()方法destroy()

提前致谢。

4

2 回答 2

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 容器负责。

于 2013-05-25T03:20:34.573 回答
2

的目的destroy()是取消分配/释放 Servlet 实例使用的所有资源。通过调用destroy()容器注销 servlet 及其服务。

是的,您可以调用任何service(request, response) 类似的方法,destroy()但它不会被执行,因此调用服务方法是没有用的,destroy()因为这些服务方法永远不会被调用/执行,请求和响应将为空,因为容器不会提供这些对象。

public void destroy() {
      try
      { 
          doPost(null, null); // will not be executed 
          doGet(null, null); // will not be executed 
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
    }

来自Java 文档

公共无效销毁()

由 servlet 容器调用以向 servlet 指示 servlet 正在停止服务。只有在 servlet 的服务方法中的所有线程都退出或经过超时时间之后,才会调用此方法。

servlet容器调用该方法后,不会再在该servlet上调用service方法。

此方法使 servlet 有机会清理任何被占用的资源(例如,内存、文件句柄、线程),并确保任何持久状态与 servlet 在内存中的当前状态同步。

于 2013-05-25T04:25:59.507 回答