【初心者向け】Java Servlet(サーブレット)を優しく解説

公開日: 2017.08.27
更新日: 2024.01.11
Java Servletを優しく解説

みなさんは、Javaの学習を進めてはいませんか?

今回の記事では、Javaのプログラムの一つである「Java Servlet(サーブレット)」について解説していきます。

はじめに

パソコン  Javaサーブレットとは、Webブラウザなどからの要求に基づいて起動され、サーバ上で何らかの処理を行ったり、
動的にWebページを生成してクライアントに送信したりするサーバ側Javaプログラムのことです。

Webページの閲覧者の操作や入力に基いてサーバ側で処理を行い、結果を反映したページを送り返すことができ
アプリケーションソフトのように利用できるWebサイトを構築することができます。
このようなWebサイトを「Webアプリケーション」(Web application)といいます。

ここでは、サーブレットの作成を行う上で、用意されているクラスやメソッドの使い方、サーブレットの
ライフサイクルなどサーブレットの基本的な事項について確認をしていきます。


「独学でのプログラミング学習に苦戦していませんか?」

独学でのプログラミング学習の挫折率は9割以上と言われています。

プログラミングを身につけて、年収をUPさせたい
ITエンジニアになって、働き方を変えたい
✔生活を変えたいけど、何からやればよいか分からない

と思っているあなたへ向けて、
挫折率9割に負けない「プログラミング学習必勝法」を無料でプレゼントします!

完全無料なので、悩む前に今すぐ下のバナーをクリックして資料を読んでみてください!

\簡単30秒/

下のバナーからLINE友だち追加をして、無料で限定資料をGET!

サーブレットの基本

パソコンと本

サーブレットを作成する上で必要となるクラスが含まれているパッケージについて簡単に見ていきます。
大きくわけて2つのパッケージが用意されており、「javax.servlet」パッケージと「javax.servlet.http」パッケージがあります。

全てのサーブレットは「javax.servlet」パッケージに含まれる「Servlet」インターフェースを実装する必要があります。
このインターフェースを実装しているのが「GenericServlet」クラスと「HttpServlet」クラスです。
その為、通常はこのどちらかのクラスを継承してクラスを作成します。

「GenericServlet」クラスはプロトコルに依存しないサーブレットを作成する場合に利用します。
「HttpServlet」クラス自体も「GenericServlet」クラスのサブクラスですがHTTP通信を行うサーブレットを作成するのみ便利なように拡張されたクラスとなっています。
今回はHTTP通信を行うサーブレットを中心に利用方法を確認していきますので、基本的には「HttpServlet」クラスを継承して作成するようにします。

サーブレットを作成する上で継承して利用するクラスが「HttpServlet」クラスとなります。
「HttpServlet」クラスで用意されている様々なメソッドを定義していくことでサーブレットを作成していきます。

またサーブレットがクライアントであるブラウザなどから呼ばれた時にパラメータなどの情報が含まれているのが「HttpServletRequest」インターフェースのオブジェクトです。
そしてサーブレットからクライアントに出力を行う場合に利用するのが「HttpServletResponse」インターフェースのオブジェクトです。
これらは「HttpServlet」クラスの中で定義されているメソッドの引数として渡されてきます。

他にクッキーを扱う「Cookie」クラス、セッションを扱う「HttpSession」インターフェースなどがあります。

HttpServletクラスとメソッド

サーブレットの基本となる「HttpServlet」クラスを見てみます。

クラス定義

クラス定義は下記のようになっています。
サーブレットは「Servlet」インターフェースを実装する必要がありますが「GenericServlet」クラス で実装が行われているため
「GenericServlet」クラスのサブクラスとして「HttpServlet」クラスは定義されています。

java.lang.Object
javax.servlet.GenericServlet
javax.servlet.http.HttpServlet

public abstract class HttpServlet extends GenericServlet implements java.io.Serializable

java.lang.Object
javax.servlet.GenericServlet
javax.servlet.http.HttpServletpublic abstract class HttpServlet extends GenericServlet implements java.io.Serializable

メソッド

「HttpServlet」クラスでは多くのメソッドが定義されています。
リクエストのHTTPメソッドの種類毎に対応するメソッドがそれぞれ用意されています。

[GET] : protected void doGet(HttpServletRequest req, HttpServletResponse resp)
[POST] : protected void doPost(HttpServletRequest req, HttpServletResponse resp)
[PUT] : protected void doPut(HttpServletRequest req, HttpServletResponse resp)
[DELETE] : protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
[HEAD] : protected void doHead(HttpServletRequest req, HttpServletResponse resp)
[TRACE] : protected void doTrace(HttpServletRequest req, HttpServletResponse resp)
[OPTIONS] : protected void doOptions(HttpServletRequest req, HttpServletResponse resp)

「HttpServlet」クラスを継承したクラスは、このどれかのメソッドを最低1つは実装する必要があります。
もし複数のHTTPメソッドで呼び出される可能性がある場合は複数のメソッドを実装することも可能です。

「GET」と「POST」

HTTPメソッドの中でも主に使われるのは「GET」と「POST」です。

「GET」メソッドはクライアントからページの要求を行う場合に使われます。
直接サーブレット名をURLに指定して表示したりリンクに設定されたサーブレットをクリックした場合には「GET」を使ってリクエストが来ます。
またフォームにおいて送信方法に「GET」を使った場合にも「GET」メソッドが使われます。

「POST」メソッドはクライアントからデータを送る場合に使われます。
主にフォームにおいて送信方法に「POST」を指定した場合に使われます。

サーブレット作成

プログラム画面

ここではサーブレットの基本となるものを順に作っていきたいと思います。

HttpServletクラスの継承

HTTP通信を行うサーブレットは「HttpServlet」クラスを継承して作成します。

public class HelloWorld extends HttpServlet{
/* … */
}

HTTPメソッドに対応したメソッドの実装

「HttpServlet」クラスを継承した場合は、「doGet」メソッド又は「doPost」メソッドを実装します。
例えばGETメソッドで呼ばれる可能性があるサーブレットであれば次のようになります。

public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* …  */
}
}

POSTメソッドで呼ばれる可能性があるサーブレットであれば次のようになります。

public class HelloWorld extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* …  */
}
}

GETメソッドとPOSTメソッドの両方で呼ばれる可能性があるサーブレットであれば次のようになります。

public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* … */
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* … */
}
}

作成したサーブレットをブラウザなどから呼び出した時にGETメソッドで呼び出せば「doGet」メソッドの中に記述した処理が実行され
フォームなどから「POST」メソッドを使ってデータを送信した場合は「doPost」メソッドの中に記述した処理が実行されます。

doGetメソッドやdoPostメソッド内の処理の実装

「doGet」メソッドはクライアントからデータの要求がある場合に呼び出されます。
そこで「doGet」メソッド内にはクライアントに対して要求された内容を出力するような処理を記述します。
出力する場合にはメソッドの引数の1つである「HttpServletResponse」インターフェースのオブジェクトを利用します。

「doPost」メソッドはクライアントからデータが送られてくる場合に呼び出されます。
「doPost」メソッド内にはクライアントから送られてきた情報などを取得するような処理を記述します。
リクエストの内容を取得するにはメソッドの引数の1つである「HttpServletRequest」インターフェースのオブジェクトを利用します。

「doGet」メソッドでもフォームからデータを送信されてくることがありますし「doPost」メソッドでも結果をブラウザに返す
必要がありますので結果的にはこの2つのメソッドで大きな使い方の違いはありません。
あくまでリクエストのHTTPメソッドの種類に応じて分けられていると考えてもいいかと思います。

結果的にサーブレットは次のようになります。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{

response.setContentType(“text/html”);
PrintWriter out = response.getWriter();

out.println(“<html>”);
out.println(“<head>”);
out.println(“<title>Hello World!</title>”);
out.println(“</head>”);
out.println(“<body>”);
out.println(“<h1>Hello World!</h1>”);
out.println(“</body>”);
out.println(“</html>”);
out.close();
}
}


「プログラミング学習に苦戦しているあなたへ」

独学でのプログラミング学習の挫折率は9割以上と言われています。

プログラミングを身につけて、年収をUPさせたい
ITエンジニアになって、働き方を変えたい
✔生活を変えたいけど、何からやればよいか分からない

と思っているあなたへ向けて、
挫折率9割に負けない「プログラミング学習必勝法」を無料でプレゼントします!

完全無料なので、悩む前に今すぐ下のバナーをクリックして資料をGETしましょう!

\簡単30秒/

下のバナーからLINE友だち追加をして、無料で限定資料をGET!

画像に alt 属性が指定されていません。ファイル名: d77f61a7bf823616a12faf1f70fa44e6-735x300.png

サーブレットのライフサイクル

パソコンを抱えるクマ

サーブレットはTomcatなどのサーブレットが動作するコンテナが起動してから最初にサーブレットが呼ばれたときにコンテナにロードされインスタンスが作成されます。

サーブレットはリクエストに対してスレッドを作成し、そのスレッドが実際の処理を行います。
複数のリクエストが同時にあればそれぞれ別のスレッドが用意されマルチスレッドで動作することになります。

スレッドはリクエストに対する処理が終われば終了しますがインスタンスはそのまま残っており新しいリクエストが来れば新しいスレッドを作成して実行します。
そのため2回目以降はインスタンスを作成する時間がかかりません。

コンテナが終了したり一定時間サーブレットに対してアクセスが無かった場合にインスタンスは破棄されます。

サーブレットの作成から破棄までの流れは以上のようになっており、初回と最後以外はインスタンスがある状態で実行され、同じインスタンスが共有して利用されるようになっています。

インスタンス変数

ビル街

サーブレットはリクエストがあるたびにスレッドが用意されて実行されますが、インスタンスに含まれるスレッドで共有される変数を作成することが出来ます。
これをインスタンス変数といいます。

インスタンス変数はクラス内に記述され、特定のメソッドの外側に記述されている変数です。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {

int count = 0;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{

int l_count = 0;
}
}

上記の中で「count」がインスタンス変数です。
この変数は全てのスレッドで共有して利用される変数ですので、同じ変数に対して別々のスレッドがそれぞれ参照
したり値を変更したりする事が出来ます。

それに対して「doGet」などのメソッド内に記述されたローカル変数(ここでは「l_count」)はスレッド毎に独立していますのであるスレッドのローカル変数に別のスレッドがアクセスすることは出来ません。

例えばカウンターの値などスレッド全体で共有できる値を持つことが出来る反面、何か処理をしている途中で別のスレッドから値を書き換えられるようなケースも考えられるためインスタンス変数を使う場合には注意が必要です。
またインスタンス変数は、インスタンスが終了すれば破棄されてしまいます。

インスタンス変数の初期化は、頻繁に実行されるdoGetメソッド内などで実行すると、スレッドが新しく作られるたびに行われてしまいますので問題が起きてしまいます。そこで上記のように変数宣言時に行うか、インスタンスが作成される時に一度だけ実行される「init」メソッド内で行います。

initメソッドとdestoryメソッド

initメソッドとdestoryメソッド

サーブレットのライフサイクルについて説明しましたが、サーブレットのインスタンスが作成された後、そして破棄される前にそれぞれ
特定のメソッドを呼びだすことが出来ます。

initメソッド

インスタンスが作成された後で実際の処理が行われる前に呼び出されるのが「init」メソッドです。
最初のリクエストに対してスレッドが作成され実際の処理が行われる前に呼び出されることが保証されています。
その為、インスタンス自体に対して初期化するような処理を記述するのに利用されます。

「init」メソッドは「HttpServlet」クラスの親クラスである「GenericServlet」クラスで定義されています。

public void init() throws ServletException

実際の使い方としては次のような感じとなります。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
public void init() throws ServletException{
/* 初期化処理 */
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* … */
}
}

destroyメソッド

サーブレットが破棄される前に呼び出されるのが「destroy」メソッドです。インスタンス変数の値をファイルに書き出したり、
インスタンスで共有していたデータベース接続の切断処理を行ったりといった処理を行うのに使います。

「destroy」メソッドは「HttpServlet」クラスの親クラスである「GenericServlet」クラスで定義されています。

public void destroy()

実際に使う場合には「destroy」メソッドをオーバーライドして処理したい内容を記述します。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
public void init() throws ServletException{
/* 初期化処理 */
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
/* … */
}

public void destroy(){
/* 終了処理 */

}
}

さいごに

いかがだったでしょうか。
Javaをローカルで動作させているのとは違い、サーバ側での動作を主とするサーブレットは
少々とっつきにくいかもしれませんが、JavaとWEBアプリケーションを語る上で外せない内容ですので
今回の内容を基本としてサーブレットに触れてみてくださいね。

DMM WEBCAMPについて

DMM WEBCAMPは3ヶ月間で未経験から即戦力エンジニアを育成する転職保障付きのプログラミングスクールです。1ヶ月でプログラミング・Webデザインを学ぶ通い放題の「ビジネス教養コース」も展開しています。

DMM WEBCAMPを運営する株式会社インフラトップ では、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

関連記事

資料請求

  • 短期集中で最速エンジニア転職を実現-転職成功者インタビュー一覧

    DMM WEBCAMPでは転職成功率98%を実現しています。本資料では、元警察官や元ラーメン屋など様々なバックグラウンドを持つ卒業生の声をお届けします。

    資料をダウンロードする
  • IT技術がもたらす3つの変化と身につけるべきスキル

    IT技術の発展により、今後10~20年程度で47%の仕事がなくなると言われています。どのような変化が訪れ、私達はどのようなスキルを身につけるべきかを解説します。

    資料をダウンロードする
  • 未経験がフリーランスエンジニアになる方法-年収アップで自由な働き方を手に入れる

    働き方改革やリモートワークの影響でフリーランスという働き方の人気は高まりつつあります。フリーランスエンジニアとして活躍するために必要な情報をお届けします。

    資料をダウンロードする

© 2024 WEBCAMP MEDIA Powered by AFFINGER5