JavaのServlet入門|サーブレットの基本構造

先生

Java Servletの世界へようこそ!Webアプリ開発の基礎をしっかり学んで、動的なWebサイトを作ろう!

Java Servletとは?基本を理解しよう

Java Servletは、Java EE(Jakarta EE)の一部であり、Webサーバ上で動作して動的なWebコンテンツを生成するための技術です。クライアントからのリクエストを受け取り、処理を行い、その結果をレスポンスとして返す役割を担います。従来のCGIに比べて、スレッドベースで動作するため、パフォーマンスが高いのが特徴です。

Servletは、Webアプリケーション開発における重要な要素であり、Webアプリケーションフレームワーク(Spring MVCなど)の基盤としても利用されています。サーブレットを理解することで、Webアプリケーションの動作原理をより深く理解することができます。

Servletの基本構造:Hello World

Servletを作成するには、javax.servlet.http.HttpServletクラスを継承し、doGet()またはdoPost()メソッドをオーバーライドします。doGet()メソッドはGETリクエストを処理し、doPost()メソッドはPOSTリクエストを処理します。

以下に、最も基本的なServletの例を示します。このServletは、クライアントに「Hello, World!」というテキストを返します。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><head><title>Hello, World!</title></head><body>");
        out.println("<h1>Hello, World!</h1>");
        out.println("</body></html>");
    }
}

このコードをコンパイルし、WebアプリケーションのWEB-INF/classesディレクトリに配置します。次に、web.xmlファイル(またはアノテーション)でServletを定義し、URLパターンを割り当てます。例えば、/helloというURLパターンに割り当てると、ブラウザからhttp://localhost:8080/your-app/helloにアクセスすることで、このServletが実行され、「Hello, World!」が表示されます。

Servletのライフサイクル

Servletのライフサイクルは、Webコンテナ(Tomcatなど)によって管理されます。Servletのライフサイクルには、以下の3つの主要な段階があります。

1. 初期化 (Initialization): Servletが最初にロードされる際に、init()メソッドが一度だけ呼び出されます。このメソッドは、Servletの初期化処理(データベース接続の確立など)を行うために使用されます。

public void init() throws ServletException {
    // 初期化処理
}

2. リクエスト処理 (Request Handling): クライアントからリクエストが送信されるたびに、service()メソッドが呼び出されます。service()メソッドは、リクエストの種類(GET、POSTなど)に応じて、doGet()またはdoPost()メソッドを呼び出します。

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // リクエスト処理
}

3. 破棄 (Destruction): ServletがWebコンテナからアンロードされる際に、destroy()メソッドが一度だけ呼び出されます。このメソッドは、Servletが使用していたリソース(データベース接続の切断など)を解放するために使用されます。

public void destroy() {
    // リソース解放処理
}

ServletConfigとServletContext

ServletConfigインターフェースは、Servletの初期化パラメータにアクセスするために使用されます。ServletConfigオブジェクトは、init()メソッドの引数として渡されます。

public void init(ServletConfig config) throws ServletException {
    String paramValue = config.getInitParameter("parameterName");
}

ServletContextインターフェースは、Webアプリケーション全体のコンテキスト情報にアクセスするために使用されます。ServletContextオブジェクトは、ServletConfigオブジェクトから取得できます。

ServletContext context = getServletConfig().getServletContext();
String contextParam = context.getInitParameter("contextParameterName");

ServletContextを使用することで、Webアプリケーション全体で共有される情報をServlet間で共有することができます。

Servletの注意点

Servletはマルチスレッドで動作するため、スレッドセーフな実装を心がける必要があります。特に、インスタンス変数へのアクセスは、排他制御を行うようにしましょう。また、ServletはWebコンテナによって管理されるため、リソースリークが発生しないように、使用後は必ずリソースを解放するようにしましょう。

参考リンク

まとめ

この記事では、Java Servletの基本的な概念、構造、ライフサイクル、および重要なインターフェースについて解説しました。ServletはWebアプリケーション開発の基礎となる技術であり、理解することでより高度なWebアプリケーションを開発することができます。さらに学習を進めて、Servletをマスターしましょう。