この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: サーブレットAPI
SEOタイトル: Java サーブレット API 完全ガイド(HttpServlet / doGet / doPost / Request / Response / ライフサイクル / セッション)

この記事の要点
  • サーブレット(Servlet)は Java EE / Jakarta EE でHTTP リクエストを処理する Java クラス
  • HttpServlet を継承し、doGet() / doPost() をオーバーライドして処理を記述する
  • リクエスト情報は HttpServletRequest、レスポンスは HttpServletResponse で扱う
  • ライフサイクルは init() → service()(doGet/doPost)→ destroy()。インスタンスは1 つを再利用
  • HttpSession でセッション管理、RequestDispatcher でフォワード/インクルード、Cookie でクライアント側保存

サーブレット API とは

サーブレット(Servlet)は、Web サーバ上で動作してHTTP リクエストを処理する Java クラスです。Java EE(現 Jakarta EE)の中核 API のひとつで、Tomcat / Jetty / WildFly などのサーブレットコンテナ上で動作します。Spring MVC や JSP も内部ではこの API を使っています。

サーブレットの基本クラス階層

クラス / インタフェース役割
Servletサーブレットの最上位インタフェース
GenericServletプロトコル非依存の抽象クラス
HttpServletHTTP 用の抽象クラス(実装で継承するのはこれ)
HttpServletRequestリクエスト情報
HttpServletResponseレスポンス情報
HttpSessionセッション管理

最小のサーブレット

import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException {
        res.setContentType("text/html; charset=UTF-8");
        res.getWriter().println("

Hello, Servlet!

"); } }

Jakarta EE 9 以降は javax.servlet から jakarta.servlet パッケージ名に変わっています。古い環境では javax.servlet.* を使います。

ライフサイクル

メソッドタイミング
init()サーブレットがロードされた直後に1 回だけ呼ばれる
service()リクエストごとに呼ばれる。内部で doGet / doPost に分岐
doGet() / doPost() / doPut() / doDelete()HTTP メソッド別の処理
destroy()アンロード時に1 回だけ呼ばれる

サーブレットインスタンスは1 つだけ生成され、複数のリクエストで共有されます。そのためインスタンス変数は thread-safe ではない点に注意。

HttpServletRequest

メソッド用途
getParameter(name)クエリ文字列 / フォームのパラメータ
getParameterValues(name)同名のパラメータが複数あるとき
getHeader(name)HTTP ヘッダ
getMethod()HTTP メソッド(GET / POST / ...)
getRequestURI()リクエスト URI
getRemoteAddr()クライアントの IP
getSession()HttpSession の取得(なければ作成)
setAttribute(name, val)リクエスト属性に値をセット(フォワード時に使う)

HttpServletResponse

メソッド用途
setStatus(code)HTTP ステータスコード
setContentType("...")Content-Type ヘッダ
setHeader(name, val)任意のヘッダ
getWriter()文字ストリーム(PrintWriter)
getOutputStream()バイナリストリーム
sendRedirect(url)302 リダイレクト
addCookie(cookie)Cookie の送信

doGet と doPost

@WebServlet("/form")
public class FormServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException {
        res.setContentType("text/html; charset=UTF-8");
        res.getWriter().println(
            "
" + " 名前:
" + " " + "
" ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { req.setCharacterEncoding("UTF-8"); String name = req.getParameter("name"); res.setContentType("text/html; charset=UTF-8"); res.getWriter().println("

こんにちは, " + name + " さん

"); } }

HttpSession でセッション管理

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws IOException {
        String user = req.getParameter("user");

        // セッション開始(なければ生成)
        HttpSession session = req.getSession();
        session.setAttribute("user", user);
        session.setMaxInactiveInterval(30 * 60); // 30 分

        res.sendRedirect("/mypage");
    }
}

@WebServlet("/logout")
class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException {
        HttpSession session = req.getSession(false);
        if (session != null) session.invalidate();
        res.sendRedirect("/");
    }
}

RequestDispatcher(フォワードとインクルード)

メソッド意味
forward()処理を別リソース(JSP 等)に引き継ぐ。URL は変わらない
include()別リソースの出力を取り込む
res.sendRedirect()302 リダイレクト。URL が変わる
@WebServlet("/list")
public class ListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        // 業務ロジック
        List users = userService.findAll();
        req.setAttribute("users", users);

        // JSP にフォワード
        RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/jsp/list.jsp");
        rd.forward(req, res);
    }
}

Cookie

// 設定
Cookie c = new Cookie("theme", "dark");
c.setMaxAge(60 * 60 * 24 * 30); // 30 日
c.setHttpOnly(true);
c.setSecure(true);
res.addCookie(c);

// 取得
Cookie[] cookies = req.getCookies();
if (cookies != null) {
    for (Cookie ck : cookies) {
        if ("theme".equals(ck.getName())) {
            String theme = ck.getValue();
        }
    }
}

URL マッピング

アノテーション方式(推奨)

@WebServlet(urlPatterns = {"/users/*", "/api/users"})
public class UserServlet extends HttpServlet { /* ... */ }

web.xml 方式(伝統的)


    UserServlet
    com.example.UserServlet


    UserServlet
    /users/*

Filter(共通処理)

認証チェック、ロギング、文字コード設定など、複数サーブレットに共通する処理はFilter で書きます。

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        chain.doFilter(req, res); // 次のフィルタ/サーブレットへ
    }
}

スレッドセーフ性の注意

  • サーブレットはシングルトンのため、インスタンス変数を使うと共有される
  • リクエスト固有の状態はローカル変数request 属性で持つ
  • 長期保存はセッション、永続化は DB

FAQ

Q: Spring Boot との関係は?
A: Spring Boot の @RestController も内部的にはサーブレットコンテナ上で動作します。サーブレット API を直接使うことはほぼなくなりましたが、根本の仕組みは同じです。

Q: javax と jakarta どちらを使う?
A: Tomcat 10+ / WildFly 27+ など最新環境は jakarta.servlet。Tomcat 9 以下や古い Java EE 環境は javax.servlet です。

関連

  • HttpServlet — HTTP 処理の基底クラス
  • JSP — テンプレートエンジン(内部でサーブレットにコンパイル)
  • Filter — リクエスト/レスポンスの共通処理
  • Listener — コンテキスト/セッションのイベント処理
  • Spring MVC — サーブレット上のフレームワーク