0

何が起こるのだろうと思っていました。doget()メソッド内でサーブレットの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()をオーバーライドして、実行するとサーブレットがすぐに破棄されるようにします。

4

1 に答える 1

4

もちろん、それはあなたの実装に完全に依存します。オーバーライドしていない場合は、HttpServletのdestroyの実装が空であるため、ほとんど何も実行されません。その結果、アプリケーションは引き続き正常に実行されます。

たぶん、destroyメソッドの目的について混乱があります。目的は、サーブレットコンテナがサーブレットを破棄するメソッドを提供することではありません

代わりに、destroyメソッドがコンテナによって呼び出されたときに実行されるコードを提供する可能性があります。場合によっては、コンテナがサーブレットを削除することを決定したときに、リソースをクリーンアップする必要があります(たとえば、データベース接続を閉じる)。コンテナは、サーブレットを完全に独立して削除できます。たとえば、メモリが不足している場合などです。メソッドdestroyは、削除の一部として呼び出されます。

サーブレットインスタンスを破棄することが目標である場合、destroyメソッドは適切なツールではありません。繰り返しになりますが、destroyの呼び出しは、サーブレットインスタンスの削除の一部であり、削除の原因ではありません。適切なツールは、doGetからUnavailableExceptionをスローすることです(ここではdestroyメソッドは必要ありません)。Javadocで述べたように、パラメータなしのコンストラクタは、サーブレットが永続的に利用できないことを示すインスタンスを作成します。さらに、サーブレット仕様で述べられているように、これに対応するのはコンテナタスクです。

UnavailableExceptionによって永続的な使用不可が示された場合、サーブレットコンテナはサーブレットをサービスから削除し、そのdestroyメソッドを呼び出して、サーブレットインスタンスを解放する必要があります。その原因によってコンテナによって拒否されたリクエストは、SC_NOT_FOUND(404)応答で返される必要があります。

于 2012-07-16T20:28:05.877 に答える