サーバーサイド編(基本編)
サーバーサイド(バックエンド)を Java の Servlet で構築します。
資料に掲載しているソースコード、設定とコマンドは AI を使って生成しています。
概要
Java を使って Web アプリケーションを作成します。
開発環境 (IDE) は Visual Stdio Code (VS Code)、JDK 21、サーブレットコンテナーは Apache Tomcat 10 、プロジェクト管理に Apache Maven を使います。
JDK と Tomcat は、Windows が提供している Windows Subsystem for Linux Version 2 (WSL2) にインストールします。 Visual Studio Code の Remote Development 拡張機能で接続して開発します。
WSL2 は軽量 Virtual Machine (VM) 上で動作し、Windows と別の仮想ネットワークを持っています。そのため、WSL2 内で起動したサーバーはデフォルトで外部(他端末)から直接アクセスできません。ポートフォワーディングを設定すれば可能ですが、WSL2 で動作するゲスト OS の IP アドレスは再起動で変更されます。恒久的にアクセスしたいときは、WSL ではなく、Hyper-V の利用を検討します。 Hyper-V はMicrosoft純正の仮想化基盤(ハイパーバイザー)で、VirtualBox や VMware Workstation と同じような機能を提供します。Windows Professional や Enterprise 版で利用できます。
WSL2 のインストール
Windows Terminal を起動します。 PowerShell をインストールします。Windows のパッケージマネージャの winget コマンドを使います。
winget install Microsoft.PowerShell
PowerShell を管理者として実行します。 WSL2 を有効にします。Linux ディストリビューションの1つの Ubuntu がインストールされます。
wsl --install # Ubuntuが自動でインストール
インストール中にユーザー名とパスワードを入力します。ユーザー名はubuntu、パスワードはubuntuにします。
利用するUbuntuのバージョンは、実行する日時で異なることがあります。
インストール中: Ubuntu
Ubuntu がインストールされました。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ubuntu 👈 ユーザー名
New password: 👈 パスワード (表示されません)
Retype new password: 👈 パスワード (表示されません)
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Sun Nov 9 11:25:18 JST 2025
System load: 1.33 Processes: 32
Usage of /: 0.1% of 1006.85GB Users logged in: 0
Memory usage: 5% IPv4 address for eth0: 172.21.60.57
Swap usage: 0%
This message is shown once a day. To disable it please create the
/home/ubuntu/.hushlogin file.
Windows を再起動します。 Windows Terminal を起動します。 インストールされている Linux の一覧を表示します。
wsl -list -verbose
Ubuntu の状態が表示されます。
NAME STATE VERSION
* Ubuntu Stopped 2
利用可能なディストリビューションの一覧を表示することができます。
wsl --list --online # 利用可能なディストリビューションの表示
一覧が表示されます。
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
Ubuntu-24.04 Ubuntu 24.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_10 Oracle Linux 8.10
OracleLinux_9_5 Oracle Linux 9.5
openSUSE-Leap-15.6 openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise SP6
openSUSE-Tumbleweed openSUSE Tumbleweed
別のディストリビューションをインストールするときは、次のコマンドを入力します。
wsl.exe --install <Distro>
Windows Terminal (wt) で Ubuntu を起動します。

Ubuntu のプロンプトが表示されます。
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@<hostname>:~$
Ubuntuのアップデート(任意)
次のコマンドで Ubuntu をアップデートします。
sudo apt update
[sudo] password for ubuntu:
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
:
Fetched 38.6 MB in 14s (2845 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
193 packages can be upgraded. Run 'apt list --upgradable' to see them.
Java 開発環境の構築
Java の開発に必要な Java Development Kit (JDK)、プロジェクト管理ツールの Apache Maven と、Java の Web アプリの実行で必要なサーブレット・コンテナの Apache Tomcat 10 をインストールします。
JDK のインストール
LTS (Long Term Support) の JDK21 をインストールします。
sudo apt install openjdk-21-jdk
次のメッセージが表示されてインストールが完了します。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
:
Setting up openjdk-21-jdk:amd64 (21.0.16+8~us1-0ubuntu1~24.04.1) ...
update-alternatives: using /usr/lib/jvm/java-21-openjdk-amd64/bin/jconsole to provide /usr/bin/jconsole (jconsole) in auto mode
インストールされた Java のバージョンを確認します。
java -version
openjdk version "21.0.16" 2025-07-15
OpenJDK Runtime Environment (build 21.0.16+8-Ubuntu-0ubuntu124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.16+8-Ubuntu-0ubuntu124.04.1, mixed mode, sharing)
Mavenのインストール
プロジェクト管理ツールの Maven をインストールします。pom.xml ファイルにライブラリの依存関係記述すると、自動でインストールを行います。ビルドなども簡単なコマンドで行うことができます。
sudo apt install -y maven
次のメッセージが表示されてインストールが完了します。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
:
Setting up maven (3.8.7-2) ...
update-alternatives: using /usr/share/maven/bin/mvn to provide /usr/bin/mvn (mvn) in auto mode
インストールされた Maven のバージョンを確認します。
mvn -version
バージョンは異なることがあります。バージョン3以上を使用してください。
Apache Maven 3.8.7
Maven home: /usr/share/maven
Java version: 17.0.16, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.167.4-microsoft-standard-wsl2", arch: "amd64", family: "unix"
Tomcat 10 のインストール
Java のサーブレットを動作するためにサーブレット・コンテナの Tomcat 10 をインストールします。
sudo apt install -y tomcat10
次のメッセージが表示されてインストールが完了します。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
:
Processing triggers for rsyslog (8.2312.0-3ubuntu9) ...
Processing triggers for libc-bin (2.39-0ubuntu8.3) ...
/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link
インストールされた Tomcat を起動します。
sudo systemctl start tomcat10 # 起動
sudo systemctl enable tomcat10 # 自動起動
sudo systemctl status tomcat10 # 状態確認
正常に起動すると、次のメッセージが表示されます。
● tomcat10.service - Apache Tomcat 10 Web Application Server
Loaded: loaded (/usr/lib/systemd/system/tomcat10.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-11-09 11:51:54 JST; 51s ago
Docs: https://tomcat.apache.org/tomcat-10.0-doc/index.html
Main PID: 2901 (java)
Tasks: 44 (limit: 9411)
Memory: 174.4M ()
CGroup: /system.slice/tomcat10.service
└─2901 /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Djava.util.logging.config.>
Nov 09 11:51:54 hostname tomcat10[2901]: OpenSSL successfully initialized [OpenSSL 3>
Nov 09 11:51:54 hostname tomcat10[2901]: Initializing ProtocolHandler ["http-nio-808>
Nov 09 11:51:54 hostname tomcat10[2901]: Server initialization in [418] milliseconds
Nov 09 11:51:54 hostname tomcat10[2901]: Starting service [Catalina]
Nov 09 11:51:54 hostname tomcat10[2901]: Starting Servlet engine: [Apache Tomcat/10.>
Nov 09 11:51:54 hostname tomcat10[2901]: Deploying web application directory [/var/l>
Nov 09 11:51:55 hostname tomcat10[2901]: At least one JAR was scanned for TLDs yet c>
Nov 09 11:51:55 hostname tomcat10[2901]: Deployment of web application directory [/v>
Nov 09 11:51:55 hostname tomcat10[2901]: Starting ProtocolHandler ["http-nio-8080"]
Nov 09 11:51:55 hostname tomcat10[2901]: Server startup in [861] milliseconds
Tomcat が動作していることを確認します。ブラウザーを起動してhttp://localhost:8080に接続します。
次のメッセージが表示されます。
It works !
If you're seeing this page via a web browser, it means you've setup Tomcat successfully. Congratulations!
This is the default Tomcat home page. It can be found on the local filesystem at: /var/lib/tomcat10/webapps/ROOT/index.html
Tomcat veterans might be pleased to learn that this system instance of Tomcat is installed with CATALINA_HOME in /usr/share/tomcat10 and CATALINA_BASE in /var/lib/tomcat10, following the rules from /usr/share/doc/tomcat10-common/RUNNING.txt.gz.
You might consider installing the following packages, if you haven't already done so:
tomcat10-docs: This package installs a web application that allows to browse the Tomcat 10 documentation locally. Once installed, you can access it by clicking here.
tomcat10-examples: This package installs a web application that allows to access the Tomcat 10 Servlet and JSP examples. Once installed, you can access it by clicking here.
tomcat10-admin: This package installs two web applications that can help managing this Tomcat instance. Once installed, you can access the manager webapp and the host-manager webapp.
NOTE: For security reasons, using the manager webapp is restricted to users with role "manager-gui". The host-manager webapp is restricted to users with role "admin-gui". Users are defined in /etc/tomcat10/tomcat-users.xml.
Java Web アプリ開発プロジェクトの作成
ホームディレクトリのjavaフォルダで作業を行います。
mkdir java
cd java
Mavenを使ってプロジェクトを作成します。
mvn archetype:generate -DgroupId=com.example -DartifactId=Servlet-demo
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
| パラメータ | 意味・説明 |
|---|---|
archetype:generate | Mavenのアーキタイプ(テンプレート)を使ってプロジェクトを生成 |
-DgroupId=com.example | プロジェクトのグループIDで、パッケージ名のベースとなる識別子 |
-DartifactId=Servlet-demo | プロジェクトのアーティファクトIDで、プロジェクト名や成果物名に相当 |
-DarchetypeArtifactId=maven-archetype-webapp | 使用するアーキタイプのIDで、Webアプリのテンプレートを指定 |
-DinteractiveMode=false | 対話モードを無効にして、質問をせずに自動的にプロジェクトを作成 |
正常に生成されると、次のメッセージが表示されます。
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom (3.9 kB at 10 kB/s)
:
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/ubuntu/java
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: Servlet-demo
[INFO] Parameter: packageName, Value: com.example
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/ubuntu/java/Servlet-demo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.577 s
[INFO] Finished at: 2025-11-09T12:02:43+09:00
[INFO] ------------------------------------------------------------------------
Visual Studio Codeで接続
Visual Studio Code の Remote Development 拡張機能を使用して、WSL の Ubuntu に接続して開発を行います。
プロファイルの作成(任意)
VS Code を起動して、プロファイルのテンプレート「Java General」を元に、新しいプロファイル「Java Web App in WSL2」を追加します。

Remote Development 拡張機能のインストールと接続
Remote Development 拡張機能をインストールします。

コマンドパレットを起動 (Ctrl+Shift+P) して、wsl:と入力します。
表示された一覧からConnect to WSL in New Windowを選択します。

「ようこそ」画面で「フォルダーを開く」を選択します。
/home/ubuntu/java/servlet-demoフォルダーを選択します。
ローカル(Windows)にインストールされている拡張機能を、リモート(Ubuntu)にインストールします。
VS Codeの「拡張機能」アイコンを選択し、「Extension Pack for Java」の「WSL: Ubuntuにインストール」を選択します。
VS CodeにMavenのビューを表示します。画面右側にJava プロジェクトと Maven の情報が表示されます。
ビルド
JDK21 使うことを宣言し、依存関係にServletを追加します。 pom.xml を修正します。
dependenciesタグ以下を、次のpropertiesタグ以降に置き換えます。
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Servlet-demo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Servlet-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- JDK21 -->
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Servletの依存関係 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 成果物(artifact)の名前を変更するときは、filenameタグを変更してください。 -->
<finalName>Servlet-demo</finalName>
<plugins>
<!-- コンパイラプラグイン(JDK21指定) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<!-- WARプラグイン -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>
</plugins>
</build>
</project>
プロジェクトを作るときに指定したmaven-archetype-webappは古い内容です。プラグインのバージョンは、プロジェクトで使用したいバージョンに合わせます。
Maven は、ソースコードの場所がsrc/main/java/<package name>に決まっています。
src/main/java/com/exampleにソースファイルを追加します。
HelloServlet.javaを新規に作成します。
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello World!</h1>");
}
}
Java の Web アプリは WAR パッケージファイルを使用します。 Maven で WAR ファイルを生成します。
ターミナルが起動し、mvn コマンドが実行されます。
mvn package -f "/home/ubuntu/java/Servlet-demo/pom.xml"
WARファイルが正常に作成されると、次のメッセージが表示されます。設定ファイルやソースファイルに間違があるとエラーになります。
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.example:Servlet-demo >----------------------
[INFO] Building Servlet-demo Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
:
[INFO] Packaging webapp
[INFO] Assembling webapp [Servlet-demo] in [/home/ubuntu/java/Servlet-demo/target/Servlet-demo]
[INFO] Processing war project
[INFO] Copying webapp resources [/home/ubuntu/java/Servlet-demo/src/main/webapp]
[INFO] Building war: /home/ubuntu/java/Servlet-demo/target/Servlet-demo.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.169 s
[INFO] Finished at: 2025-11-09T13:01:21+09:00
[INFO] -----------------------------------------------------------------------
デプロイ
成果物をサーバーに展開することをデプロイと言います。 作成された WAR ファイルを Tomcat にデプロイします。 WAR ファイルを指定された場所(標準で`/var/lib/tomcat10/webapps/)にコピーすると、Tomcat が WAR ファイルを自動で展開します。
cd ~/java/Servlet-demo/
sudo cp target/Servlet-demo.war /var/lib/tomcat10/webapps/
Tomcatの管理コンソールの導入 (オプション)
Tomcat の管理コンソールを利用すると、ブラウザー経由でアプリの管理を行えます。
Ubuntu のtomcat10パッケージは管理コンソールのアプリが含まれていないので、追加でインストールします。
sudo apt install -y tomcat10-admin
インストール直後は管理コンソールにアクセスできないようになっています。 アクセスできるように設定を変更します。
sudo vi /etc/tomcat10/tomcat-users.xml
次の行を有効化します。パスワードはadmin(任意)にします。
<user username="admin" password="admin" roles="manager-gui"/>
Tomcat を再起動します。
sudo systemctl restart tomcat10
ブラウザーで、管理画面http://localhost:8080/manager/htmlにアクセスします。

/servlet-demoの「実行中」がtrueになっていることが確認できます。
デプロイした Web アプリにアクセスします。http://localhost:8080/Servlet-demo/hello

ブラウザからのクエリパラメータを表示 (オプション)
HTTP の GET でクエリパラメータ (クエリストリング) を送信します。 クエリパラメータはURLの後に「?」に続けてキー&バリューのペアを「&」で区切って並べます。
例: http://localhost:8080/servlet-demo/hello?name=山田太郎&age=30
サーブレットは、受信したパラメータを「パラメータ名 = 値」で表示します。応答は JSON (JavaScript Object Notification) を返します。
JSON の処理
JSON の処理に OSS (Open Source Software) の jackson を使います。pom.xml に依存関係を追加します。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
HelloServlet.javaを修正します。受信したクエリパラメータを標準出力に出力します。JSON で応答を返します。
HelloServlet.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("application/json"); // 応答はJSON
Map<String, String> resMap = new HashMap<>();
try {
Map<String, String[]> params = req.getParameterMap();
if (params.isEmpty()) {
throw new IllegalArgumentException("No query parameters");
}
// クエリパラメータをTomcatのログに出力
for (String key : params.keySet()) {
for (String value : params.get(key)) {
System.out.println(key + " = " + value);
}
}
resMap.put("RET", "0000");
resp.setStatus(HttpServletResponse.SC_OK);
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
System.out.println("Raw query string: " + req.getQueryString());
resMap.put("RET", "9999");
resMap.put("ERROR", e.getMessage());
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(respMap);
PrintWriter out = resp.getWriter();
out.println(json);
out.flush();
out.close();
}
}
Tomcat は、標準出力のデータを/var/log/tomcat10/catalina.outに出力します。このファイルを監視します。
sudo tail -f /var/log/tomcat10/catalina.out`
ブラウザからクエリパラーメータを受信すると、パラメータを表示します。
[2025-11-09 16:15:35] [info] name = 山田太郎
[2025-11-09 16:15:35] [info] age = 30
ブラウザは返信された JSON データをそのまま表示します。
{
"RET": "0000"
}
Windows Terminal で、Windows 標準の curl コマンドで日本語を含むクエリパラメータを送信するときは注意が必要です。日本語などはURL エンコードを行う必要があります。ブラウザのアドレスバーに入力すると、自動的に URLエンコード されたデータが送信されます。curl コマンドは、事前に日本語をURLエンコードに変換する必要があります。
http://localhost:8080/servlet-demo/hello?name=山田太郎はエラーです。次のコマンドは正常に動作します。
$name=[System.Web.HttpUtility]::UrlEncode("山田太郎")
$age=30
curl "http://localhost:8080/servlet-demo/hello?name=$name&age=$age"