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

时间:2013-05-25 02:29:52

标签: java java-ee servlets service methods

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

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

提前致谢。

2 个答案:

答案 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在内存中的当前状态同步。