1.サーブレットコンテナから始めましょう。誰もが最もよく知っているサーブレットコンテナはTomcatです。サーブレットコンテナはサーブレットをどのように管理していますか?
Tomcatのコンテナモデルを最初に見てみましょう。
上記の図から、Tomcatの容器が4つのレベルに分割されていることがわかります。真にサーブレットを管理するコンテナはコンテキストコンテナであり、コンテキストはWebプロジェクトに対応します
Tomcatのコンテナレベルでは、コンテキストコンテナは、コンテナ内のサーブレットのラッパークラスラッパー(標準ライター)を直接管理するコンテナであるため、コンテキストコンテナの実行方法はサーブレットの仕組みに直接影響します。
ここでは、サーブレットのラッピングクラス:StandardWrapperについて説明します。ここに質問があります。なぜサーブレットをサーブレットオブジェクトにするのではなく、サーブレットをStandardWrapperにラップする必要があります。 StandardWrapperはTomcatコンテナの一部であるため、コンテナの特性があり、サーブレットは独立したWeb開発標準であり、Tomcatには強く結合されるべきではありません。
サーブレットをStandardWrapperに包み、コンテキストにサブコンテナとして追加することを除き、他のすべてのWeb.xmlプロパティがコンテキストに解析されるため、コンテキストコンテナは実際にサーブレットを実行するサーブレットコンテナです。 Webアプリケーションは、コンテキストコンテナに対応します。コンテナの構成プロパティは、アプリケーションのweb.xmlで指定されているため、Web.xmlがどのような役割を果たしているかを理解できます。
2。以下は、サーブレットの作業プロジェクトについて簡単に説明します。
Webサーバーがクライアントと対話する場合、サーブレットの作業プロセスは次のとおりです。
1.クライアントのWebサーバーにリクエストを行う
2。リクエストを受信した後、Webサーバーはそれをサーブレットに送信します
3.サーブレットコンテナは、これのインスタンスオブジェクトを生成し、サーブレットAPIの対応するメソッドを呼び出してクライアントHTTP要求を処理し、処理された応答結果をWebサーバーに返します。
4. Webサーバーは、サーブレットインスタンスオブジェクトから受信した応答構造をクライアントに送信します。
3。サーブレットのライフサイクル:
上の図に示すように、サーブレットのライフサイクルは、荷重クラスと作成段階、初期化段階、サービス段階、インスタンス破壊段階、つまり4つのステージ、つまり4つのステージに分けることができます。以下は、各段階のプログラミングタスクと予防策の詳細な説明です。
1.サーブレットインスタンスを作成します。
デフォルトでは、最初のリクエストが到着したときにサーブレットインスタンスが作成され、後で再利用されます。一部のサーブレットには、ファイルの開く、ネットワーク接続の初期化など、初期化の読み込み時に完了する必要がある複雑な操作が必要な場合は、サーバーに通知して、開始時にサーブレットのインスタンスを作成できます。特定の構成は次のとおりです。
<Servlet> <Servlet-Name> TimeServlet </servlet-name> <servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servet>
サーブレットオブジェクトの関連するクラス構造を作成します。
2。初期化
サーブレットインスタンスが作成されると、Webサーバーは、Servletを初期化するためにinit(servletconfig config)メソッドを自動的に呼び出します。メソッドパラメーター構成には、サーバーによって作成された初期化パラメーターなど、サーブレットの構成情報が含まれています。
I.サーブレットの初期化パラメーターを構成する方法は?
たとえば、Web.xmlのサーブレットの定義タグで:
<Servlet> <Servlet-Name> TimeServlet </servlet-name> <servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <init-param> <par am-name> user </param-name> <param-value> username </param-value> </init-param> <init-param> <param-name> blog </param-name> <param-value> http://。 。 。 </param-value> </init-param> </servlet>
2つの初期化パラメーターユーザーとブログは、usernameとhttp://の値で構成されています。 。 。このようにして、将来のユーザー名とブログアドレスを変更するために、サーブレットコードを変更する必要はなく、構成ファイルを変更する必要があります。
ii。サーブレットの初期化パラメーターを読み取る方法は?
ServletConfigは、初期化パラメーターの情報を読むための次の方法を定義しています。
public string getInitParameter(文字列名)
パラメーター:初期化パラメーターの名前。
返品:設定されていない場合、初期化パラメーターの値はnullを返します。
iii.init(servletconfig)メソッドの実行時間の数
この方法は、サーブレットのライフサイクル中に1回実行されます。
iv.init(servletconfig)メソッドとスレッド
この方法は単一のスレッド環境で実行されるため、開発者はスレッドの安全性の問題を考慮する必要はありません。
v.init(servletconfig)メソッドと例外
実行中、この方法はServletExceptionをスローして、Servletインスタンスが初期化に失敗したことをWebサーバーに通知することができます。 ServletExceptionがスローされると、WebサーバーはクライアントのリクエストをServletインスタンスに処理するために引き渡さず、メモリから破壊される初期化障害例外情報をクライアントに報告します。新しいリクエストが行われた場合、Webサーバーは新しいサーブレットインスタンスを作成し、新しいインスタンスの初期化操作を実行します。
3。サービス
サーブレットインスタンスが正常に作成され、初期化されたら、サーバーがサーバーで使用してクライアントの要求を提供し、応答を生成できます。サービス段階では、Webサーバーはインスタンスのサービス(ServleTRequest Request、ServleTResponse応答)メソッドを呼び出します。リクエストオブジェクトと応答オブジェクトはサーバーによって作成され、サーブレットインスタンスに渡されます。リクエストオブジェクトは、クライアントからサーバーに送信された情報をカプセル化し、応答オブジェクトはサーバーから送信された情報をクライアントにカプセル化します。
I.サービス()メソッドの責任
Service()メソッドは、サーブレットのコアメソッドです。クライアントのビジネスロジックは、このメソッド内で実行する必要があります。典型的なサービス方法の開発プロセスは次のとおりです。
クライアントのリクエストを分析 - > business Business Logic->クライアントへの出力応答ページを実行します
ii.service()メソッドとスレッド
効率を改善するために、サーブレットの仕様では、サーブレットインスタンスが複数のクライアントリクエストを同時に提供できる必要があります。つまり、Service()メソッドはマルチスレッド環境で実行され、サーブレット開発者はメソッドのスレッドの安全性を確保する必要があります。
iii.service()メソッドと例外
Service()メソッドは、実行中にServletExceptionとIOExceptionをスローできます。その中で、ServleTexceptionは、要求されたリソースが利用できず、データベースが利用できないなど、クライアントリクエストの処理プロセス中にスローできます。例外がスローされると、コンテナは要求オブジェクトをリサイクルし、クライアントの例外情報を報告する必要があります。 IOExceptionは、入力エラーと出力エラーを示します。プログラマーは例外を気にする必要はなく、コンテナによってクライアントに直接報告します。
プログラミングの注意事項:
1)サーバースレッドがサーブレットインスタンスのinit()メソッドを実行すると、すべてのクライアントサービススレッドスレッドがインスタンスのサービス()メソッドを実行できず、インスタンスの破壊()メソッドを実行できません。したがって、サーブレットのinit()メソッドは単一のスレッド環境で動作し、開発者はスレッドの安全性の問題を考慮する必要はありません。
2)サーバーがクライアントから複数のリクエストを受信すると、サーバーは各クライアントサービススレッドでサーブレットインスタンスのサービス()メソッドを実行して各クライアントにサービスを提供します。現時点では、複数のスレッドが同じサーブレットインスタンスのサービス()メソッドを同時に実行するため、スレッドの安全性の問題を考慮する必要があります。
3)Service()メソッドはマルチスレッド環境で実行されますが、メソッドを同期する必要はないことに注意してください。代わりに、実行中にこの方法でアクセスされるリソースのタイプと、リソースへのアクセス方法に依存します。分析は次のとおりです。
私。 Service()メソッドが、静的変数、ファイル、データベース接続などのサーブレットメンバー変数やグローバルリソースにアクセスしない場合、グローバルリソースを指すことのない一時変数、要求、応答オブジェクトなど、現在のスレッド独自のリソースのみを使用します。この方法自体はスレッドセーフであり、同期制御は必要ありません。
ii。 Service()メソッドがサーブレットメンバー変数にアクセスしますが、変数の操作は読み取り専用操作である場合、メソッド自体はスレッドセーフであり、同期制御は必要ありません。
iii。 Service()メソッドがサーブレットメンバー変数にアクセスし、変数の操作が読み取りおよび書き込まれる場合、通常、同期制御ステートメントが必要です。
IV。 Service()メソッドがグローバルな静的変数にアクセスする場合、システムに静的変数に同時にアクセスする他のスレッドがある場合、読み取り操作と書き込み操作の両方がある場合、通常、同期制御ステートメントが必要です。
v。サービス()メソッドがファイル、データベース接続などのグローバルリソースにアクセスする場合、通常、同期制御ステートメントを追加する必要があります。
4。破壊
Webサーバーが、アプリケーションのリロードやサーバーのシャットダウンなど、サーブレットインスタンスが必要ないと考えている場合、サーブレットに長い間アクセスされていません。サーバーは、メモリからインスタンスを破壊することができます(アンインストールとも呼ばれます)。 Webサーバーは、サーブレットインスタンスをアンインストールする前に、サーブレットインスタンスをアンインストールする前に、サーブレットインスタンスの破壊()メソッドが呼び出されることを確認する必要があります。
Webサーバーは、Destroy()メソッドを呼び出す前に、インスタンスの出口のサービス()メソッドで実行されているすべてのスレッドを、一定期間待機することを確認する必要があります。 Destroy()メソッドが実行されると、Webサーバーはサーブレットインスタンスのすべての新しいリクエストを拒否します。 Destroy()メソッドが終了し、サーブレットインスタンスはごみ収集できます。
4。クライアントのセルブレット解析のフローチャートhttpリクエスト:
1. Webクライアントは、サーブレットコンテナにHTTP要求を発行します。
2。サーブレットコンテナは、Web HTTP要求を解析します。
3.サーブレットコンテナは、HTTPRequestオブジェクトを作成し、このオブジェクトのHTTP要求情報をカプセル化します。
4.サーブレットコンテナは、HTTPResponseオブジェクトを作成します。
5。サーブレットコンテナ(アクセスしたサーブレットがサーバーの起動時に作成されていない場合、最初にサーブレットインスタンスを作成し、init()メソッドを呼び出してオブジェクトを初期化します)httpservletのservice()メソッドを呼び出し、httpservletオブジェクトにhttprequestおよびhttpresponseオブジェクトのパラメーターを渡します。
6. HTTPSERVLETは、HTTPRequestの関連する方法を呼び出して、HTTP要求情報を取得します。
7。HTTPSERVLETは、HTTPRESPONSEの関連する方法を呼び出して応答データを生成します。
8.サーブレットコンテナは、httpservlet応答結果をWebクライアントに渡します。
上記の記事は、サーブレットの実行原則とライフサイクル(包括的な分析)に基づいています(包括的な分析)は、私が共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。