0

我想知道会发生什么,如果我在 doget() 方法中调用 servlet 的 destroy() 方法,假设这是我在 doget() 方法本身中的第一个语句。请告知..

我已经在我的应用程序中尝试过,如下所示..

public class MyServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{

     destroy(); //calling destroy


String name=request.getParameter("txtName");
HttpSession ses=request.getSession();
ses.setAttribute("username",name);
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<html><head><title>Cookie example</title></head><body>");
out.println("welcome,"+name);
out.println("<br><a href=ck>Take a Tour</a></body></html>");
out.close();
}
}

但是我的应用程序运行良好,但仍然请解释我的逻辑,因为我仍然不清楚。

请告知需要编写哪段代码,我想覆盖 destroy() 以便在执行它时 servlet 立即被销毁

4

1 回答 1

4

这当然完全取决于您的实施。如果你没有覆盖它,那么它几乎什么都不做,因为在 HttpServlet 中销毁的实现是空的。结果应用程序继续正常运行。

也许对destroy方法的目的有些混淆。目的不是 servlet 容器提供一些破坏 servlet 的方法

相反,它使您可以提供一些代码,这些代码将在容器调用 destroy 方法时执行。在某些情况下,当容器决定删除 servlet 时,需要清理资源(例如关闭数据库连接)。容器可以非常独立地删除 servlet:例如,如果它内存不足。方法destroy将作为删除的一部分被调用。

如果您的目标是销毁 servlet 实例,那么 destroy 方法不是正确的工具。再一次,对destroy 的调用是删除servlet 实例的一部分,而不是删除的原因。正确的工具是从 doGet 抛出UnavailableException(这里不需要销毁方法)。正如Javadoc中所说,无参数构造函数会创建这样一个实例,表明 servlet 永久不可用。此外,容器任务对此做出反应,如 servlet 规范中所述:

如果 UnavailableException 指示永久不可用,则 servlet 容器必须从服务中删除 servlet,调用其 destroy 方法,并释放 servlet 实例。任何因该原因被容器拒绝的请求都必须返回一个 SC_NOT_FOUND (404) 响应。

于 2012-07-16T20:28:05.877 回答