【问题标题】:calling destroy method of servlet inside doget() method在 doget() 方法中调用 servlet 的 destroy 方法
【发布时间】:2012-07-16 17:44:20
【问题描述】:

我想知道会发生什么,如果我在 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 立即被销毁

【问题讨论】:

  • No Man,直到现在我都没有这样做,但我想知道在后台会发生什么。
  • 伙计们,我已经用状态消息更新了它

标签: java jakarta-ee tomcat servlets


【解决方案1】:

这当然完全取决于您的实施。如果你没有重写它,那么它几乎什么也做不了,因为在 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) 响应。

【讨论】:

  • 感谢您的解释,但是如果我想编写一个会破坏该 servlet 的代码,您能否就此提出建议,因为这次我的实现发生了变化并且我正在覆盖它,您能否发布里面销毁这样一段代码的那段代码将像容器通常那样立即销毁servlet。提前谢谢
  • 不过,您不想从 destroy 方法中执行此操作,它是在 servlet 删除期间调用的方法,而不是导致 servlet 实例被删除的方法。现在添加了有关在目标是删除 servlet 时使用 UnavailableException 的说明。
猜你喜欢
  • 2012-11-06
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2015-06-02
  • 2011-08-18
  • 2012-01-31
相关资源
最近更新 更多