サーブレットオブジェクトのライフサイクルについて話す

サーブレットオブジェクトのライフサイクルとは何ですか?

  1. サーブレット オブジェクトはいつ作成されますか?
  2. サーブレット オブジェクトはいつ破棄されますか?
  3. サーブレット オブジェクトはいくつ作成されますか?
  4. サーブレット オブジェクトのライフ サイクル表現、つまり、サーブレット オブジェクトの作成から最終的な破棄までのプロセス全体とは何ですか?

        

上記の質問を通じて、サーブレット オブジェクトのライフ サイクルについて話しましょう

        サーブレットのライフ サイクル全体は、jakarta.servlet.Servlet インターフェイスを使用してサーブレット オブジェクトを理解し、管理するサーブレット コンテナによって管理されます。サーブレットのライフ サイクルは、ロード段階、初期化段階、リクエストの処理と破棄フェーズ

                

サーブレット オブジェクトは誰が管理しますか?

        サーブレット オブジェクトの作成、オブジェクト上のメソッドの呼び出し、およびオブジェクトの最終的な破棄には、JavaWeb プログラマには介入する権利がなく、サーブレット オブジェクトのライフ サイクルは Web サーバーが単独で責任を負います。Tomcat サーバーは通常 Web コンテナ (Web Container) と呼ばれ、Web コンテナを通じて Servlet オブジェクトの作成と破棄を管理します。

        

自分で作成したサーブレット オブジェクトは Web コンテナによって管理されますか?

        自身で作成したサーブレットオブジェクトはWebコンテナでは管理されません Webコンテナで作成したサーブレットオブジェクトはコレクション(HashMap)に配置されます このコレクションに配置されたサーブレットのみWebコンテナで管理できます サーブレットオブジェクトはこのコレクションには含まれていないため、Web コンテナーによって管理されません。
        
    Web コンテナの基礎となる実装は、Servlet オブジェクトとリクエスト パスの間の関係が保存される HashMap のコレクションです。

        
サーバーが起動すると、サーブレット オブジェクトが (デフォルトで) 作成されますか?

        サーブレットにパラメータなしの構築メソッドを提供し、構築メソッド内でプロンプト情報を出力し、サーバーの起動時に構築メソッドが実行されるかどうかを監視します。

        Aサーブレットクラス

public class AServlet implements Servlet {
    public AServlet() {
        System.out.println("AServlet无参构造方法被执行了");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("AServlet's init method execute!");
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("AServlet's service method execute!");
    }
    @Override
    public void destroy() {
        System.out.println("AServlet's destroy method execute!");
    }
    
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}

        web.xmlの設定

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    
    <servlet>
        <servlet-name>AServlet</servlet-name>
        <servlet-class>servlet.lxy.AServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>AServlet</servlet-name>
        <url-pattern>/servlet/test</url-pattern>
    </servlet-mapping>
</web-app>

        デフォルトでは、Tomcat サーバーの起動後、コンソールは AServlet の関連する構築情報を出力せず、この時点では AServlet オブジェクトがインスタンス化されていないことを示します。

        

ユーザーが最初のリクエストを送信すると、コンソールは次を出力します。

        AServlet パラメータのない構築メソッドが実行されます
        AServlet の init メソッドが実行されます
        AServlet のサービス メソッドが実行されます!

上記の出力内容より、
        ユーザが最初のリクエストを送信した時点、つまりAServletの構築メソッドが実行された時点でServletオブジェクトがインスタンス化されたと判断され、パラメータなしの構築メソッドが実行されます。
        AServlet オブジェクトが作成された後、Tomcat サーバーはすぐに AServlet オブジェクトの init メソッドを呼び出します (Aservlet オブジェクトは init メソッドの実行中にすでに存在します)。init メソッドが実行された後、Tomcat サーバーはすぐに AServlet オブジェクトの service メソッドを呼び出します。 AServlet オブジェクト。

        

ユーザーが 2 番目の複数のリクエストを送信し続けると、コンソールに次の出力が表示されます。

        AServlet のサービス メソッドを実行します。

        AServlet のサービス メソッドを実行します。

        AServlet のサービス メソッドを実行します。

上記の出力結果によれば、次のように結論付けることができます。

        ユーザーが 2 回目以降のリクエストを送信する場合、Servlet オブジェクトは新たに作成されず、以前に作成された Servlet オブジェクトが引き続き使用され、Servlet オブジェクトの init メソッドを経由せずに、オブジェクトの service メソッドが直接呼び出されます。これらの現象は次のことを説明できます。

        まず、サーブレット オブジェクトはシングルトン (シングル インスタンスです。サーブレット オブジェクトはシングル インスタンスですが、サーブレットがシングルトン モードに準拠していないため、これを偽シングルトンと呼びます) です。サーブレット オブジェクトがシングルトンである理由は次のとおりです。サーブレット オブジェクト Java Web プログラマの作成は、Tomcat (または他の Web アプリケーション サーバー) によってのみ管理できるこのオブジェクトの作成を認識できません。Tomcat はサーブレット オブジェクトのみを作成します。これによりシングルトンが生成されますが、これは false です。シングルトン、および真のシングルトン サンプル モードでは、その構築メソッドはプライベート化されています。
        第 2 に、引数なしの構築メソッドです。init メソッドは、ユーザーが最初にリクエストを送信するときのみ実行されます。つまり、引数なしです。 construction メソッドは 1 回だけ実行され、init メソッドは Tomcat によってのみ実行されます
        。 サーバーは 1 回呼び出します。 3 番目に、ユーザーがリクエストを送信する限り、サービス メソッドは Tomcat サーバーによって確実に 1 回呼び出されます。サービスメソッドも複数回呼び出されます。

        

サーバーをシャットダウンすると、コンソールには以下が出力されます。

        AService の destory メソッドを実行します。

 上記の出力結果によれば、次のように結論付けることができます。

        サーブレットの destroy メソッドは、Tomcat サーバーによって 1 回だけ呼び出されます。Web サーバーが閉じられると、Tomcat はサーブレット オブジェクトのメモリを破棄する必要があります。サーブレット オブジェクトを破棄する前に、Tomcat サーバーは destroy メソッドを 1 回呼び出します。destroy メソッドが呼び出されるとき、サーブレット オブジェクトはまだ存続します。破棄後もメソッドが実行されると、サーブレット オブジェクトは破棄されます。

        

       上記はサーブレット オブジェクトのライフ サイクル プロセスの紹介であり、サーブレットのライフ サイクルを理解することによってのみ、対応する時点でサーブレット オブジェクトを適切に処理することができます。ご質問がある場合は、コメント欄で意見交換や議論を歓迎します。

おすすめ

転載: blog.csdn.net/qq_43500084/article/details/127794289