ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
サーブレット API とは
サーブレット(Servlet)は、Web サーバ上で動作してHTTP リクエストを処理する Java クラスです。Java EE(現 Jakarta EE)の中核 API のひとつで、Tomcat / Jetty / WildFly などのサーブレットコンテナ上で動作します。Spring MVC や JSP も内部ではこの API を使っています。
サーブレットの基本クラス階層
| クラス / インタフェース | 役割 |
|---|---|
Servlet | サーブレットの最上位インタフェース |
GenericServlet | プロトコル非依存の抽象クラス |
HttpServlet | HTTP 用の抽象クラス(実装で継承するのはこれ) |
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("<h1>Hello, Servlet!</h1>");
}
}
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(
"<form method='post' action='/form'>" +
" 名前: <input name='name'><br>" +
" <button>送信</button>" +
"</form>"
);
}
@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("<p>こんにちは, " + name + " さん</p>");
}
}
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<User> 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 方式(伝統的)
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.example.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/users/*</url-pattern>
</servlet-mapping>
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 — サーブレット上のフレームワーク
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?