┌─────────┐ ┌─────────┐ │░░░░░░░░░│ │O ░░░░░░░│ ├─────────┤ ├─────────┤ │░░░░░░░░░│ │ │ ├─────────┤ │ │ │░░░░░░░░░│ └─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │─────────────────────>│ │ response 1 │ │<─────────────────────│ │ request 3 │ │─────────────────────>│ │ response 3 │ │<─────────────────────│ │ response 2 │ │<─────────────────────│ ▼ ▼
HTTP プロトコルは、常にリクエストを送信してからレスポンスを受信する、リクエスト/レスポンス プロトコルであることがわかりました。一度に複数のリクエストを送信し、複数の応答を受け取ることはできますか? HTTP 2.0
は、ブラウザによる複数のリクエストの同時発行をサポートできますが、各リクエストには一意の識別子が必要です。サーバーはリクエストの順序ではなく複数の応答を返すことができ、ブラウザ自体はリクエストの順序と一致することができます。要求に対する応答を受け取りました。起立してください。 HTTP 2.0
では、ブラウザがリクエストを送信した後、次のリクエストの送信を続ける前に応答を待つ必要がないため、送信効率がさらに向上していることがわかります。
HTTP 3.0
速度をさらに向上させるために、TCP
プロトコルは廃止され、必要のない UDP
プロトコルに置き換えられます。現在 HTTP 3.0
はまだ実験的なプロモーション段階にあります。
JavaEE
プラットフォームでは、TCP
接続の処理と HTTP
の解析という基本的な作業がすべて行われます。プロトコルは破棄されます 既製の Web
サーバーに対してこれを行うには、独自のアプリケーションを Web
サーバー上で実行するだけで済みます。この目的を達成するために、JavaEE
は Servlet
API
を提供します。Servlet API
を使用して独自の Servlet## を作成します。
#HTTP リクエストを処理するために、
Web サーバーは
Servlet API
インターフェイスを実装し、
は基礎となる関数を実装します。
// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do @WebServlet(urlPatterns = "/hello.do") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应类型: resp.setContentType("text/html"); // 获取输出流: PrintWriter pw = resp.getWriter(); // 写入响应: pw.write("<h2>Hello, world!</h2>"); // 最后不要忘记flush强制输出: pw.flush(); } }
Servlet は常に
HttpServlet から継承し、
doGet() または
doPost()## をオーバーライドします。 #方法。 doGet()
メソッドは、HttpServletRequest
と HttpServletResponse
という 2 つのオブジェクトを渡します。これらは、それぞれ HTTP
リクエストとレスポンスを表します。 Servlet API
を使用する場合、基盤となる TCP
と直接対話することはなく、HttpServletRequest# であるため、
HTTP プロトコルを解析する必要もありません。 ## および
HttpServletResponse はリクエストとレスポンスをすでにカプセル化しています。応答の送信を例に挙げると、正しい応答タイプを設定し、
PrintWriter を取得して応答を書き込むだけです。
このようなプロジェクトは、最終的に
*.war
ServletAPI をサポートする Web を使用する必要があります。
コンテナ (Web サーバー)。
したがって、まずサーブレット API をサポートする Web サーバーを見つける必要があります。
一般的に使用されるサーバーは次のとおりです:
Jetty: Eclipse によって開発されたオープンソースの無料サーバー;
サーブレットリクエストを開始するプロセスで、その本質は
Servlet インスタンスを実行する
doXXX() メソッドを呼び出しています。
Servlet インスタンスを作成して使用するプロセスは、サーブレットのライフ サイクルと呼ばれます。ライフサイクル全体には、インスタンス化、初期化、サービス、破棄が含まれます。
Servlet によって要求されたパスに基づいて ## を検索します (例: home.do ) #Servlet
の インスタンス
。インスタンスが存在しない場合は、コンストラクター メソッドを呼び出すことで Servlet
インスタンス の作成が完了します。
の インスタンスを通じて、init() を呼び出します。メソッド、初期化ロジックを実行します。
サービス:
インスタンスを通じて、service() を呼び出します。メソッド、サブクラスがこのメソッドをオーバーライドしない場合、HttpServlet 親クラスの service()
メソッドが呼び出され、親クラスのメソッド内でリクエスト メソッドが判断されます。 #GET リクエスト、次に doGet() メソッドを呼び出します。
POST リクエストの場合は、
doPost() メソッドを呼び出します。
if サブクラスが
doXXX()
メソッドをオーバーライドする場合、書き換えられた doXXX()
メソッドが呼び出されます。
メソッドが呼び出されます。親クラスのメソッド実装では、405 というエラー ページが表示されます。
ステータスコードが返されます。
要求されたメソッドがサーバーでサポートされていないことを示します。 4
. 破棄
: サーバーがシャットダウンまたは再起動されると、すべてのサーブレット インスタンスが破棄され、サーブレット インスタンスの destroy()
メソッドがと呼ばれた。
package com.my.hyz.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/home.do") public class HomeServlet extends HttpServlet { public HomeServlet() { System.out.println("实例化"); } @Override public void init() throws ServletException { System.out.println("初始化"); //super.init(); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("调用Service实例"); } @Override public void destroy() { System.out.println("销毁咯!!!!"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("哎呦get到了"+this.hashCode()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("哎呦post到了"); } }
以上がJavaでサーブレットを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。