1.1 インターフェースサーブレット
今日は、新しくて興味深いトピックであるサーブレットを始めます。Java にサーブレットが追加されたことで、Java が大規模サーバー アプリケーションの事実上の標準になりました。世界中のエンタープライズ ソフトウェアの 80% は Java で書かれています。そして中国ではすべてが100%です。では、サーブレットとは何でしょうか?
サーブレットはまさに Java プログラムを Web サービスに変換し、クライアントからのリクエストを処理できるようにするものです。で、こんな感じでした・・・
World Wide Web の出現直後の 90 年代に、Web クライアント (ブラウザ) と Web サーバーが登場しました。Web サーバーは通常、保存したファイル (HTML ページ、スクリプト、画像など) をインターネット上に単純に配布します。
ある時点で、誰もが双方をより賢くする必要があるという結論に達しました。JavaScript が HTML ページに追加され、プラグインがサーバーに追加されました。プラグインは、特定のリクエストに応答して呼び出され、サーバーの動作をより柔軟でスマートにする特別なスクリプトです。
つまり、サーブレットとは、特定のページで要求されたときに Java コードを実行できるように組み込まれたJava プラグインのことです。Java web-server
そしてすでに、この Java コードは、Servlet クラスから継承されたクラスによって表され、開発者の意図どおりの動作を行っています。
すでにご存知のとおり、最も人気のある Java Web サーバーはTomcatです。ちなみに、漫画「トムとジェリー」に登場する猫のトムにちなんで名付けられました。
Tomcat はどのようにサーブレットと対話するのでしょうか? 実際、このプロセスは標準化されており、サーブレットのライフサイクルと呼ばれます。この中で、サーブレットはロード可能なオブジェクトであり、Web サーバーはサーブレットコンテナです。
サーブレットがまだロードされていない場合は、次のようになります。
- サーブレット クラスはコンテナによってロードされます。
- コンテナはサーブレットのクラス(オブジェクト)のインスタンスを作成します。
init()
コンテナはサーブレット オブジェクトのメソッドを呼び出します。このメソッドは 1 回だけ呼び出されます。
標準的な作業サイクル -クライアントのリクエストに対応する:
- 各リクエストは別のスレッドで処理されます。
service()
コンテナはサーブレット上のメソッドを呼び出し、そこに ServletRequest オブジェクトと ServletResponse オブジェクトを渡します。- サーブレットを終了するには、
destroy()
サーブレット オブジェクトでメソッドを呼び出します。呼び出されるのは 1 回だけです。
サーブレットが終了する理由はさまざまです。
- プログラマは Web サーバーを再起動します。すべてのサーブレットを正常にシャットダウンする必要があります。
- プログラマは新しいバージョンのサーブレットをロードしますが、古いバージョンは正しくアンロードする必要があります。
- 等々。
重要なことを忘れないでください。Web サーバーとそのサーブレットは、何ヶ月もの間、障害や再起動が発生することなく動作し、毎分数千のリクエストを処理できる必要があります。したがって、サーブレットのロード、作業、およびアンロードの両方のコードは、常に非常に高品質に作成する必要があります。
1.2 HttpServlet クラス
Servlet クラスは、サーブレットとコンテナの動作方法を標準化するために存在します。プログラマはこのクラスを直接操作しません。まあ、それらが機能することはほとんどありません。最も一般的に使用されるクラスは、HttpServlet
サーブレットから継承されます。
このクラスには、便利なメソッドがいくつかあります。よく使用します:
方法 | 説明 | |
---|---|---|
1 | init() |
サーブレットのロード時に 1 回呼び出されます |
2 | destroy() |
サーブレットがアンロードされるときに 1 回呼び出されます |
3 | service(HttpRequest, HttpResponse) |
サーブレットへの新しいリクエストごとに呼び出されます |
4 | doGet(HttpRequest, HttpResponse) |
サーブレットへの新しい GET リクエストごとに呼び出されます |
5 | doPost(HttpRequest, HttpResponse) |
サーブレットへの新しい POST リクエストごとに呼び出されます |
6 | doHead(HttpRequest, HttpResponse) |
サーブレットに対する新しい HEAD リクエストごとに呼び出されます |
7 | doDelete(HttpRequest, HttpResponse) |
サーブレットに対する新しい DELETE リクエストごとに呼び出されます |
8 | doPut(HttpRequest, HttpResponse) |
サーブレットへの新しい PUT リクエストごとに呼び出されます |
init()
およびメソッドはdestroy()
Servlet クラスから継承されます。したがって、サーブレットでそれらをオーバーライドする場合は、基本クラスからその実装を呼び出す必要もあります。これにはコマンドが使用されますsuper.method name()
。
サーブレットの例:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 サービス(HttpServletRequest、HttpServletResponse)メソッド
クライアントリクエストの処理をサーブレットの観点から見ると、次のようになります。
クライアント要求ごとに、コンテナ (Web サーバー) はHttpServletRequest
とオブジェクトを作成しHttpServletResponse
、service(HttpServletRequest request, HttpServletResponse response)
対応するサーブレットのメソッドを呼び出します。これらのオブジェクトは、メソッドが から必要なデータを取得しrequest
、作業の結果を に入れることができるように、それに渡されますresponse
。
このメソッドにservice()
はデフォルトの実装があります。再定義されていない場合は実行されます。それが彼がやっている事なのです。
このメソッドはservice()
リクエストから HTTP メソッドの種類 (GET、POST、...) を判断し、リクエストに対応するメソッドを呼び出します。
方法 | 説明 | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
サーブレットへの新しいリクエストごとに呼び出されます |
2 | doGet(HttpRequest, HttpResponse) |
サーブレットへの新しい GET リクエストごとに呼び出されます |
3 | doPost(HttpRequest, HttpResponse) |
サーブレットへの新しい POST リクエストごとに呼び出されます |
4 | doHead(HttpRequest, HttpResponse) |
サーブレットに対する新しい HEAD リクエストごとに呼び出されます |
5 | doDelete(HttpRequest, HttpResponse) |
サーブレットに対する新しい DELETE リクエストごとに呼び出されます |
6 | doPut(HttpRequest, HttpResponse) |
サーブレットへの新しい PUT リクエストごとに呼び出されます |
クラスでは、1 つのメソッド を再定義することservice()
も、それをそのままにして、必要に応じてメソッドdoGet()
、 、 ... を再定義することもできます。doPost()
GO TO FULL VERSION