【2025正規MFi認証品】i-Phone 充電ケーブル ライトニングケーブル 純正品質【1M/2M 各2本】充電器 ケーブル 2.4A急速充電 USB 充電コード 高速データ転送 断線防止 高耐久 i-Phone 14/14 Pro/13/13 Pro/12/11/X/8/8plus/7/6/iPad 各種対応
¥898 (2025年4月26日 13:07 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)【Amazon.co.jp限定】 バッファロー WiFi ルーター 無線 LAN Wi-Fi5 11ac ac1200 866+300Mbps IPv6 WPA3 デュアルバンド 日本メーカー 【 iPhone 16e / 16 / 15 / 14 / Nintendo Switch / PS5 動作確認済み 】 エコパッケージ WCR-1166DHPL/N
¥3,380 (2025年4月26日 13:07 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
近年の新人研修では、Javaの基本文法などを学んだ後にいきなりSpring Bootを学ぶため、サーブレットを知らない方も多いと思います。
普段の開発ではサーブレットを意識することはほぼ無いのですが、Spring Bootのカスタマイズなど込み入ったことをするには、サーブレットの知識が必要になります。
この記事では、必要最低限のサーブレットの知識および簡単なアプリケーションの作成方法を解説します。
- JDK 21
- Tomcat 10.1.40
- Jakarta Servlet 6.0
- macOS 15
Webにおける静的コンテンツと動的コンテンツ
Webにおける静的コンテンツとは、いつ誰がアクセスしても常に同じ内容がレスポンスされるもののことです。
対して動的コンテンツとは、アクセスする時間・ユーザー・その他の条件によって、異なる内容がレスポンスされるもののことです。
サーブレットとは
サーブレットとは、Javaで動的コンテンツを生成するための技術の仕様です。正式名称はJakarta Servletです。仕様書はWeb上で公開されています(下記)。
Jakarta EEとは
Jakarta EEは、Java SEを拡張して分散コンピューティングやWebアプリケーションを開発するための仕様の集合です。
Jakarta EEに含まれる仕様は数多くあります。Spring Bootでよく利用されている仕様は次の通りです。
- Jakarta Servlet
- サーブレットの仕様
- Jakarta Validation
-
@NotNull
・@NotBlank
などのアノテーションが仕様で決まっている
-
- Jakarta Annotations
-
@PostConstruct
・@PreDestroy
などのアノテーションが仕様で決まっている
-
他にも数多くの仕様が定められています。興味がある方はJakarta EE公式Webサイトで確認してみてください。
Jakarta EEの歴史
Jakarta EEはもともとJava EEという名前でOracle社が管理していました。しかし2017年に管理をEclipse Foundationに移すことがアナウンスされました。その後、名称がJakarta EEに変更されました。それと併せて商標権の問題から、Java EEに含まれていた javax.*
というパッケージ名が jakarta.*
に変更されました。
Jakarta EEはのバージョンは下記のとおりです。数年に1回バージョンアップします。
年 | バージョン | 説明 |
---|---|---|
2017 | Java EE 8 | Oracle管理による最後のリリース |
2019 | Jakarta EE 8 | Eclipse Foundation管理による最初のリリース(Java EE 8と内容は同じ) |
2020 | Jakarta EE 9 | パッケージ名の変更( javax.* -> jakarta.* ) |
2021 | Jakarta EE 9.1 | JKD 11対応 |
2022 | Jakarta EE 10 | 非推奨機能の削除、新機能の追加 |
2025 (予定) | Jakarta EE 11 | 新機能の追加 |
アプリケーションサーバーとは
Jakarta EEを利用しているアプリケーションを動かすためには、一般的にアプリケーションサーバーと呼ばれるサーバーが必要になります。
世の中には有償・無償のアプリケーションサーバー製品が数多くあります。製品によって対応しているJakarta EE仕様が異なります。すなわち、Jakarta EE仕様に全て対応しているアプリケーションサーバー製品もあれば、Jakarta EE仕様の一部にのみ対応しているものもあります。
各アプリケーションサーバー製品自体もJavaで作られています。
Spring Bootでよく利用されるのは、サーブレットなど一部の仕様にのみ対応したアプリケーションサーバーです。これらはオープンソースかつ無償で利用可能です。
- Tomcat
- Apache Software Foundationが開発しています。
- Spring Bootがデフォルトで利用しています。
- Jetty
- Eclipse Foundationが開発しています。
- Undertow
- JBoss Communityが開発しています。
今回利用するTomcat 10は、Jakarta EE 10で定義されたJakarta Servlet 6.0に対応しています。
上記以外のアプリケーションサーバーでSpring Bootアプリケーションを動かすことも可能です。しかし、あまり多くないと思います。
組み込みサーバーとは
アプリケーションサーバーは基本的にはOSにインストールして使います。そしてアプリケーションはアプリケーションサーバーの内部にデプロイします。
組み込みサーバーは、アプリケーションサーバーと同じ機能をライブラリ(=JARファイル)として実現しています。これによりアプリケーションサーバーのインストールを省略できるので、JDKさえインストール済みであればアプリケーションが動きます。
Spring Bootはデフォルトで組み込みサーバーを使っています。組み込みでないアプリケーションサーバーでもSpring Bootアプリケーションを動かすことは可能ですが、あまり多くはないと思います。
Tomcatのインストール
今回は組み込みでないアプリケーションサーバーを使ってみます。
Tomcat公式Webサイトのダウンロード画面から、ZIPファイルをダウンロードします。そしてこのZIPファイルを適当なフォルダに展開してください。今回はMacのユーザーホームフォルダ直下に展開します。
apache-tomcat-(バージョン番号)フォルダの直下には、下記のようなフォルダ・ファイルがあります。その中のwebappsフォルダに、アプリケーションをビルドしたWARファイルを配置します。
binフォルダには、起動やシャットダウンのためのシェルスクリプトが含まれています。展開したままの状態では実行権限が無いので、以下のコマンドで実行権限を追加します。
chmod u+x ~/apache-tomcat-10.1.40/bin/*.sh
サーブレットの主なクラス・インタフェース
-
jakarta.servlet.http.HttpServlet
クラス- このクラスを継承してサーブレットクラスを作ります。
-
jakarta.servlet.http.HttpServletRequest
インタフェース- HTTPリクエストを表します。
-
jakarta.servlet.http.HttpServletResponse
インタフェース- HTTPレスポンスを表します。
-
jakarta.servlet.http.HttpSession
インタフェース- セッションを表します。
-
jakarta.servlet.Filter
インタフェース- このインタフェースを実装してフィルターを作ります。
サーブレットの仕様で決まっているものは、上記のようにインタフェースが多いです。これらのインタフェースの実装クラスは、アプリケーションサーバー内にあります。例えばTomcatの場合、org.apache.catalina.connector.RequestFacade
クラスが HttpServletRequest
インタフェースの実装クラスです。
各クラス・インタフェースにどのようなメソッドがあるか興味がある方は、Javadocを確認してみてください。
プロジェクトの作成
Mavenプロジェクトを作成し、pom.xmlを下記のように記述します。
pom.xml
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
modelVersion>4.0.0modelVersion>
groupId>com.examplegroupId>
artifactId>servlet-sampleartifactId>
version>1.0-SNAPSHOTversion>
packaging>warpackaging>
properties>
maven.compiler.source>21maven.compiler.source>
maven.compiler.target>21maven.compiler.target>
project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
dependencies>
dependency>
groupId>jakarta.servletgroupId>
artifactId>jakarta.servlet-apiartifactId>
version>6.0.0version>
scope>providedscope>
dependency>
dependencies>
build>
finalName>servlet-samplefinalName>
build>
project>
ポイントはいくつかあります。
-
packaging
はwar
にします。これにより、アプリケーションをビルドするとJARファイルではなくWARファイルという形式になります。 - 依存性には
jakarta.servlet-api
を追加します。このライブラリに、サーブレット関連のクラス・インタフェースが含まれています。サーブレット関連のクラス・インタフェースはTomcat内部にもあるため、このライブラリをWARファイルには含めないようにするために、スコープはprovided
にします。 -
finalName
をservlet-sample
にすることで、ビルドしてできるWARファイルの名前がservlet-sample.war
になります。
サーブレットクラスの作成
サーブレットクラスは jakarta.servlet.http.HttpServlet
クラスを継承して作成します。
HttpServlet
クラスには、HTTPリクエストメソッドのGET・POST・PUT・DELETEメソッドに対応する doGet()
・ doPost()
・ doPut()
・ doDelete()
メソッドが定義されています。これらをオーバーライドして処理を記述します。
HelloServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setStatus(200);
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("""
結果画面
""".formatted(name));
}
}
しかし、このままではサーブレットは動きません。アプリケーションサーバーに対して、どのURLでリクエストされたらこのサーブレットクラスを動かすべきなのかを、設定ファイルで伝える必要があるのです。
その設定ファイルがweb.xmlです。web.xmlはsrc/main/webapp/WEB-INFフォルダに配置します。そして下記のように記述します。
web.xml
web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
servlet>
servlet-name>HelloServletservlet-name>
servlet-class>com.example.HelloServletservlet-class>
servlet>
servlet-mapping>
servlet-name>HelloServletservlet-name>
url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
サーブレットクラスは複数作成できます。その場合
要素および
もサーブレットクラスの数だけ記述することになります。
フィルタークラスの作成
フィルターは、サーブレットの前処理・後処理を実行するものです。複数のサーブレットで共通する処理をフィルターに記述することが多いです。例は以下のとおりです。
- 文字コードの設定
- アクセスログの出力
- 認証・認可などのセキュリティ処理
フィルターは jakarta.servlet.Filter
インタフェースを実装し、 doFilter()
メソッドをオーバーライドすることで作成します。
今回は文字コードを設定するフィルターを作成します。
CharacterEncodingFilter.java
package com.example;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
chain.doFilter(servletRequest, servletResponse);
}
}
ServletRequest
・ServletResponse
はぞれぞれHttpServletRequest
・HttpServletResponse
のスーパーインタフェースです。
chain.doFilter()
は、次のフィルターまたはサーブレットを実行するための処理です。
逆に言うと、例えば認証処理を行うフィルターで認証に失敗した場合は、 chain.doFilter()
を実行しなければいいのです。
認証フィルターの例
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
...
if (認証が失敗したら) {
throw new AuthenticationException();
}
chain.doFilter(servletRequest, servletResponse);
}
}
サーブレットと同様、このままではフィルターは動きません。アプリケーションサーバーに対して、どのURLでリクエストされたらこのフィルタークラスを動かすべきなのかを、web.xmlに記述する必要があります(下記)。
web.xml
web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
servlet>
servlet-name>HelloServletservlet-name>
servlet-class>com.example.HelloServletservlet-class>
servlet>
servlet-mapping>
servlet-name>HelloServletservlet-name>
url-pattern>/hellourl-pattern>
servlet-mapping>
filter>
filter-name>CharacterEncodingFilterfilter-name>
filter-class>com.example.CharacterEncodingFilterfilter-class>
filter>
filter-mapping>
filter-name>CharacterEncodingFilterfilter-name>
url-pattern>/*url-pattern>
filter-mapping>
web-app>
フィルタークラスは複数作成できます。その場合
要素および
もサーブレットクラスの数だけ記述することになります。その場合、
要素が書かれている順番に実行されます。
入力画面の作成
HTML画面はsrc/main/webapp直下に作成します。
index.html
DOCTYPE html>
html lang="ja">
head>
meta charset="UTF-8">
title>入力画面title>
head>
body>
h1>入力画面h1>
form action="/servlet-sample/hello" method="get">
label for="name">名前:label>
input type="text" id="name" name="name">
input type="submit" value="送信">
form>
body>
html>
アプリケーションのビルド
以下のコマンドでアプリケーションをビルドします。
すると、targetフォルダ直下にservlet-sample.warが作成されます。このファイルの正体は、下図のような構成になっているZIPファイルです。
アプリケーションサーバーへのデプロイ
servlet-sample.warをTomcatのwebappsフォルダ直下にコピーすれば、Tomcatへのデプロイは完了です。
cp target/servlet-sample.war ~/apache-tomcat-10.1.40/webapps/
Tomcatの起動
~/apache-tomcat-10.1.40/bin/startup.sh
起動するとWARファイルが展開されます。そして、アプリケーションがHTTPリクエストを受け付けられる状態になります。
ブラウザでのアクセス
ブラウザで http://localhost:8080/servlet-sample/index.html にアクセスしてください。名前に適当な名前を入力後、送信ボタンをクリックしてください。
そうすると http://localhost:8080/servlet-sample/hello に遷移し「こんにちは、◯◯さん!」と表示されます。これは HelloServlet
が動的に生成したHTMLを表示しています。
URL内の /servlet-sample
はコンテキストパスと呼ばれる、アプリケーションを識別するためのパスです(WARファイルを展開されたアプリケーションのフォルダ名で決まります)。実は1つのアプリケーションサーバーで複数のアプリケーションを動かすことができるため、識別のためにこのコンテキストパスが必要なのです。
Spring Bootのように組み込みサーバーを使っている場合、1つのアプリケーションサーバーで複数のアプリケーションを動かすことは無いため、コンテキストパスは不要です。
Tomcatの停止
~/apache-tomcat-10.1.40/bin/shutdown.sh
アプリケーションを削除したい場合は、Tomcatを停止後にwebappsフォルダからWARファイルおよび展開されたフォルダを削除してください。
rm -rf ~/apache-tomcat-10.1.40/webapps/servlet-sample
rm -rf ~/apache-tomcat-10.1.40/webapps/servlet-sample.war
ここまで、サーブレットの概論および基本的なアプリケーションの作り方を解説してきました。もう少しサーブレットを学びたい方は基礎からのサーブレット/JSPを読んでみてください。