目次
サーブレット インターフェイスを実装し、URL 経由でアクセスする: 4 つのステップ
IDEA はワンクリックでサーブレット実装クラスを生成します
この記事は、バックエンドの完全なメモ セットの 3 番目の部分に属します。
第 5 章 | 動的リソースとサーブレット
| 各章の概要
この章では、次のことを学びます
-
Tomcat の基本原理を通じて、サーブレットの基本原理 (理論的基礎) を紹介します。
-
IDEA でサーブレットの実装クラスを作成し、実装クラスを Tomcat に登録して構成し、デプロイしてアクセスする一連の手順をマスターします。同時に、IDEA を使用してサーブレット クラスのノックを迅速に生成する方法を学びます。
-
サーブレット オブジェクトのライフ サイクル、作成時、およびロードオンタイム パラメータ
-
HttpServletRequest は HTTP リクエストを解析し、サーバーに送信します。
-
HttpServletResponse は HTTP リクエストに応答します
-
複数のサーブレット間のデータ共有
-
複数のサーブレット間の呼び出しのルール
| Tomcatとサーブレットの原理と関係
Tomcatの基本構成
1. Tomcat の最上位コンテナは、サーバー全体を表すサーバーです。サーバーには、特定のサービスを提供するために使用されるサービスを少なくとも 1 つ含めることができます。
2. サービスは主にコネクタとコンテナの 2 つの部分で構成されます。Tomcat の中心となるのはこれら 2 つのコンポーネントです。これら 2 つのコンポーネントの機能: コネクタは接続関連の処理に使用され、ソケットとリクエストおよびレスポンス関連の変換を提供します。コンテナはサーブレットのカプセル化と管理に使用され、特にリクエストの処理に使用されます。リクエスト。
3. Tomcat にはサーバーが 1 つだけあり、サーバーには複数のサービスを含めることができ、サービスにはコンテナーが 1 つしかありませんが、複数のコネクタを持つことができます。これは、サービスが複数の接続を持つことができるためです。同時に、同じプロトコルの異なるポートへの接続を提供することもできます。
4. 複数のコネクタとコンテナがサービスを形成します。サービスを使用すると、外部の世界にサービスを提供できますが、サービスには生存環境が必要です。誰かが彼女に命を与え、彼女の生と死を制御できる必要があります。サーバーではありません まさか!つまり、Tomcat のライフサイクル全体がサーバーによって制御されます。なお、上記の包含関係や親子関係は、tomcat の conf ディレクトリ配下の server.xml 設定ファイルからも確認できます。
5. Server ラベルに設定されているポート番号は 8005 です(注: Server ラベルのポート番号 8005 は Tomcat の Server インターフェイスの監視に使用され、Tomcat ポート 8080 は外部からの HTTP リクエストの監視に使用されます。は異なる概念です!)、 shutdown="SHUTDOWN" は、ポート 8005 で「SHUTDOWN」コマンドをリッスンし、受信した場合は Tomcat をシャットダウンすることを意味します。サーバーにはサービスがあり、もちろん設定可能です 複数のサービスがあり、サービスの左側のコンテンツがコンテナに属し、サービスの下にコネクタが属します。
サーバーはHTTPリクエストを処理します
1. ユーザーがブラウザに URL を入力すると、リクエストはローカル マシンのポート 8080 に送信され、そこでリッスンしている Coyote HTTP/1.1 コネクタによって取得されます。
2. コネクタは、リクエストを、それが配置されているサービスのエンジン (コンテナ) に渡し、エンジンの応答を待ちます。
3.Engine は、すべての仮想ホスト Host と一致するリクエスト localhost/test/index.jsp を取得します。
4. エンジンは localhost という名前のホストと一致し (一致しない場合でも、ホストはエンジンのデフォルトのホストとして定義されているため、リクエストは処理のためにホストに渡されます)、localhost という名前のホストがリクエストを取得します。 /test/index.jsp 、それが所有するすべてのコンテキストと一致します。ホストは、パスが /test であるコンテキストと一致します (一致が見つからない場合、リクエストはパス名が " " であるコンテキストに渡されます)。
5. path="/test" のコンテキストはリクエスト /index.jsp を取得し、マッピング テーブルで対応するサーブレットを見つけます。コンテキストは、URL パターンが *.jsp であるサーブレットと一致し、JspServlet クラスに対応します。
6. HttpServletRequest オブジェクトと HttpServletResponse オブジェクトを構築し、パラメータとして JspServlet の doGet() または doPost() を呼び出し、ビジネス ロジック、データ ストレージなどを実行します。
7. コンテキストは、実行後に HttpServletResponse オブジェクトをホストに返します。
8. ホストは HttpServletResponse オブジェクトをエンジンに返します。
9. エンジンは HttpServletResponse オブジェクトをコネクタに返します。
10. コネクタは、HttpServletResponse オブジェクトをクライアントのブラウザに返します。
コネクタの内部アーキテクチャの分析
-
コネクタは、リクエストを受け入れ、リクエストをリクエストとレスポンスにカプセル化し、処理のためにコンテナに渡します。コンテナが処理された後、コネクタに渡されてクライアントに戻ります。
-
コネクターは ProtocolHandler を使用してリクエストを処理し、異なる ProtocolHandler は異なる接続タイプを表します。
コンテナ内部アーキテクチャの分析
(1) エンジン: 複数のサイトを管理するために使用されるエンジン。サービスには最大でも 1 つのエンジンしか含めることができません。
(2) ホスト: 仮想ホストとも呼ばれるサイトを表し、ホストを構成することでサイトを追加できます。
(3) コンテキスト: 通常開発される一連のプログラム、または WEB-INF ディレクトリとそれに続く web.xml ファイルに対応するアプリケーション プログラムを表します。
(4) ラッパー: 各ラッパーはサーブレットをカプセル化します。
コンテキストとホストの違いは、コンテキストがアプリケーションを表し、Tomcat のデフォルト設定の webapps の下にある各フォルダー ディレクトリがコンテキストであり、メイン アプリケーションが ROOT ディレクトリに保存され、サブアプリケーションが他のディレクトリに保存されることです。ディレクトリ、および Web アプリ全体がホスト サイトです。
Tomcatの実行プロセスの概要
-
まず、startup コマンドを使用し、Server ラベルのポート番号 8005 がコマンドをリッスンした後、Tomcat サーバーのサービスを開始します
-
クライアントがリクエストを開始し、Tomcat のポート 8080 がリクエストを受信し、一連の処理を開始します。
-
リクエストが Tomcat に送信されると、最初にサービスを通過し、次にコネクタに渡されます。コネクタは、リクエストを受信し、受信したリクエストを特定の処理のためにリクエストとレスポンスにカプセル化するために使用されます。カプセル化されると、コンテナ内のサーブレットに渡され、処理が完了し、コンテナはリクエストを処理した後にコネクタに戻り、最後にコネクタが処理結果をソケット経由でクライアントに返すことで、リクエスト全体が処理されます。
-
コネクタの最下層はソケットを使用して接続し、リクエストとレスポンスは HTTP プロトコルに従ってカプセル化されるため、コネクタは TCP/IP プロトコルと HTTP プロトコルを同時に実装する必要があります。
-
最後に要約すると、次のようになります。
(1) Tomcat にはサーバーが 1 つだけあり、サーバーには複数のサービス (特定のサービスを提供するため)、サービスには複数のコネクタ (サービスは複数の接続を持つことができるため)、およびコンテナを持つことができます。(2) サーバーは(4) サービスは外部サービスを提供するために使用されます; (5) コネクタはリクエストを受け入れ、特定の処理のためにそれらをリクエストとレスポンスにカプセル化するために使用されます; (6) コンテナはサーブレットのカプセル化と管理に使用され、リクエストの特定の処理に使用されますリクエスト;
| サーブレットの概要、インターフェースの実装
サーブレットの基本概要
-
前述したように、サーブレットは Tomcat のコンテナ内のラッパーのインターフェイスです。プログラマにとって、Tomcat の基礎となる実装を深く掘り下げる必要はありません。知っておくべきことは次のとおりです。 Java Web 開発では、大部分が Tomcat でサーブレット インターフェイスを操作します。サーブレット実装クラスのコードを記述し、サーブレット実装クラス オブジェクトと Tomcat Web サイト コア内の URL の間のマッピング関係を構成します。設定ファイル web.xml など お待ちください……
-
狭義のサーブレットはJava言語で実装されたインターフェースを指し、広義のサーブレットはサーブレットインターフェースを実装したクラスを指しますが、一般的にサーブレットは後者として理解されています。サーブレットは、Java をサポートするアプリケーション サーバー上で実行されます。原則として、サーブレットはあらゆる種類のリクエストに応答できますが、ほとんどの場合、サーブレットは HTTP プロトコルに基づいて Web サーバーを拡張するためにのみ使用されます。
-
サーブレットの役割:
-
サーブレット仕様では、[動的リソースファイル]の開発手順を指定します。
-
サーブレット仕様では、動的リソース ファイル ルールを呼び出す HTTP サーバーを指定します。
-
サーブレット仕様で、HTTP サーバー管理の動的リソース ファイル インスタンス オブジェクト ルールを指定します。
-
-
Tomcat サーバー ディレクトリの lib ファイルに servlet-api.jar があります。これはサーブレットインターフェースのjarパッケージです~
-
サーブレット仕様では、HTTPサーバー(Tomcat)から呼び出せる「動的リソースファイル」はサーブレットインターフェース実装クラスである必要があります。
サーブレット インターフェイスを実装し、URL 経由でアクセスする: 4 つのステップ
【事前準備】Webモジュールの作成
ステップ1. 通常のJavaモジュールを作成する
Step2. モジュールを右クリックし、WEB フレームワークのサポートを追加します。「OK」をクリックして Web サイトを作成します
[Step1] HttpServletインターフェースを実装するクラスを作成する
-
一般に、Servlet インターフェースを直接実装するのではなく、既に記述されている Servlet インターフェースの実装クラス HttpServlet を継承します。目的は、書き直す必要があるメソッドの数を簡素化し、開発の難易度を軽減することです。
-
サーブレット クラスの Jar パッケージをインポートしていない場合は、Ctrl+Alt+Shift+S を押して、プロジェクト構造 - モジュール - 対応するモジュールを開くことができます。Tomcat ディレクトリ/lib に Servlet.jar を追加します。
//src/controller/MyServlet.java
public class MyServlet extends HttpServlet {
}
【Step2】必要に応じてHttpServletのdoGet()またはdoPost()メソッドを書き換える
-
IDEA のショートカット キー: Ctrl+O で doGet と doPost を選択
-
ブラウザの URL を通じて送信されるリクエストはすべて GET リクエストですが、ここでは GET のみを書き換えることができます (POST リクエストは通常、フロントエンド メソッドまたはリダイレクト制御によって制御されます)
【ディレクトリ構成はStep1と同じ】
//src/controller/MyServlet.java
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp); 如果你是要彻底覆盖父类的doGet方法,不需要父类提供的功能,就可以删除super.doGet(req,resp);这一句
System.out.println("这是Servlet的doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
}
【手順3】web.xml設定ファイルで、開発したJavaクラスをWebサーバー(Tomcat)に登録します
-
web.xml の役割は主に、サーブレット実装クラスに対応するパス、オブジェクト名、オブジェクト名に対応する URL の名前を指定することです。
-
<servlet> </sevlet>にはサーブレット実装クラスのパスとオブジェクト名が記述されます。
サーブレット実装クラスのオブジェクト名とURLのマッピングは、<servlet-mapping> </servlet-mapping>に記述されます。
エラーが発生しやすい: < url-pattern>/web1 </url-pattern>のエイリアスは/ で始まる必要があります。!!!
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--在Tomcat目录下的【网站核心配置文件 web.xml】,注册Servlet的实现类-->
<servlet>
<servlet-name>MyServletName</servlet-name><!--【Servlet实现类的对象】的名字(动态代理 自动生成)-->
<servlet-class>controller.MyServlet</servlet-class><!--【Servlet实现类】相对于src的路径-->
</servlet>
<!--将刚才注册的Servlet实现类的【对象名】对应网站中【作为url时的别名】-->
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/web1</url-pattern><!--若当URL中有/web1:当Tomcat收到之后,会到web.xml中寻找对应的Servlet实现类对象名,然后动态代理根据其对应的类路径生成对象,执行业务代码-->
</servlet-mapping>
</web-app>
[ステップ 4] Web サイトを Web サーバー (Tomcat) にデプロイします: 実行 – 構成の編集 – デプロイ
導入手順はIDEATomcat 静的リソースの Web サイトへのアクセスと同じです
導入後、ブラウザに入ってアクセスします。
IDEA はワンクリックでサーブレット実装クラスを生成します
-
ワンクリックで生成する前に、現在の Mudule (Ctrl+Alt+Shift+S でプロジェクト構造を開く) がサーブレット パッケージをインポートしていることを確認する必要があります。
右クリックして「サーブレット」を選択します (通常、サーブレット実装クラスのパッケージはコントローラーの下にあることに注意してください)。
-
Servlet オプションが見つからない場合は、素直に作成することをお勧めします...とにかく面倒ではありません。
-
オプションにサーブレットの解決策はありません (ディレクトリ構造が破壊されるため、推奨されません。参照のみ)
| サーブレット オブジェクトのサイクルと起動時のロード
サーブレットオブジェクトのライフサイクル
-
Web サイト内のすべてのサーブレット インターフェイス実装クラスのインスタンス オブジェクトは、 HTTP サーバーによってのみ作成できます。開発者はサーブレット インターフェイス実装クラスのインスタンス オブジェクトを手動で作成できません
-
Http サーバーの実行中、サーブレット インターフェイス実装クラスはインスタンス オブジェクトを 1 つしか作成できませんが、複数回実行できます (つまり、URL によって複数回アクセスできます)。
-
HTTP サーバーが閉じられると、Web サイト内のすべてのサーブレット オブジェクトが自動的に破棄されます。
サーブレットオブジェクトの作成タイミングと起動時のロード設定パラメータ
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>controller.MyServlet</servlet-class>
<load-on-startup>0</load-on-startup><!--填写一个大于0的整数即可。Tomcat会在启动后自动创建Servlet实现类对象。数字代表创建优先级-->
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/web1</url-pattern>
</servlet-mapping>
</web-app>
-
Servletオブジェクトの作成タイミング(つまり初期化のタイミング)
-
web.xml 内の対応するサーブレット オブジェクトに対してload-on-startup パラメーターが構成されていない場合、コンテナーは通常、初めて Web リクエストに応答するときにオブジェクトを作成し、最初にサーブレットが初期化されているかどうかを確認します。サーブレットの init () を呼び出して最初に初期化し、初期化が成功した後にリクエストに応答します。
-
load-on-startup パラメータが設定されている場合、サーブレットは Tomcat が起動を開始した直後に対応する実装クラス オブジェクトを作成しますが、サーブレットに関連するリソースを初期化するためにサーブレットの init() メソッドを呼び出すだけです。初期化が成功すると、サーブレットは Web リクエストに応答できるようになります。
-
-
起動時ロードパラメータの役割
-
コンテナが起動時にこのサーブレットをロードする必要があるかどうかを示すフラグ。
-
中央の値は整数である必要があります。
-
> =0 の場合、コンテナは開始時にサーブレット クラスを初期化することを意味します。値が小さいほど優先度が高く、ロードが早くなります。
< 0 の場合、サーブレット クラスが呼び出されたときにインスタンス化されることを意味します。
-
web.xml で複数のサーブレットを設定する場合、load-on-startup を使用して servlet のロード順序を指定でき、サーバーはload-on-startup のサイズに従って順番にサーブレットを初期化します。ただし、起動時ロードの設定を繰り返しても例外はなく、初期化順序はサーバーが独自に決定します。
-
「サーブレット オブジェクトは 1 回しか作成できないが、複数回呼び出すことができる」ことを確認し、load-on-startup によってサーブレット実装クラスの作成タイミングが実際に変更される可能性があることを確認します。
-
init() メソッドは、サーブレット実装クラスを作成するときの構築メソッドとして理解できます。
//src/controller/MyServlet.java
public class MyServlet extends HttpServlet {
//可以重写 init 方法,这个init方法代表对象被创建时候调用初始化。
@Override
public void init() throws ServletException {
super.init();
System.out.println("MyServlet对象被创建了");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--在Tomcat目录下的【网站核心配置文件 web.xml】,注册Servlet的实现类-->
<servlet>
<servlet-name>MyServletName</servlet-name><!--【Servlet实现类的对象】的名字(动态代理 自动生成)-->
<servlet-class>controller.MyServlet</servlet-class><!--【Servlet实现类】相对于src的路径-->
<load-on-startup>0</load-on-startup><!--填写一个大于0的整数即可。Tomcat会在启动后自动创建Servlet实现类对象。数字代表创建优先级-->
</servlet>
<!--将刚才注册的Servlet实现类的【对象名】对应网站中【作为url时的别名】-->
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/web1</url-pattern><!--若当URL中有/web1:当Tomcat收到之后,会到web.xml中寻找对应的Servlet实现类对象名,然后动态代理根据其对应的类路径生成对象,执行业务代码-->
</servlet-mapping>
</web-app>
検証結果:
-
サーブレットの web.xml 設定で、load-on-startup パラメータが 0 以上の整数として設定されている場合
-
次に、クリックして Tomcat を実行すると、すぐに「MyServlet object is created」というメッセージが出力されることがわかります。
-
WebページのURLに/web1と入力すると「doGetでのコード実行結果」が出力されるのを確認します
-
その後何度もURLの/web1にアクセスしたところ、doGetの実行結果は出力できることが分かりましたが、再度「MyServletオブジェクトが作成されました」という表示は出てきませんでした
-
上記の現象は、サーブレット オブジェクトは 1 回しか作成できないが、複数回アクセスできることを示しています。
また、load-on-startup パラメータ>=0 の場合、Tomcat の起動時にサーブレット実装クラス オブジェクトが即座に作成されることも示しています。
-
-
サーブレットの web.xml 設定でload-on-startupパラメータが設定されていない場合
-
次に、クリックして Tomcat を実行すると、出力がないことがわかります (サーブレット オブジェクトが初期化されていない、つまりオブジェクトが作成されていないことを意味します)。
-
WebページのURLに初めて/web1と入力すると、「MyServletオブジェクトが作成されました」と「doGetでのコード実行結果」が出力されることがわかります
-
上記の現象は、サーブレット オブジェクトがload-on-startup パラメータで構成されている場合、Tomcat の起動時にすぐに作成され、それ以外の場合は初めて使用されるときにのみ作成されることを示しています。
-