Javaでフォームの値が取得できない?name属性とgetParameterの関係

本記事は、Schooの「Java入門 中級【2026年版】」第4回「Webアプリケーションの動作原理と画面連携」に関連する補足記事です。HTMLフォームからServletに値が渡るときの、名前と値の対応を整理します。
フォームに入力したのにJavaで値を取得できないときは、まずHTMLの name と getParameter() に指定した名前を見比べます。Javaが探すのは、入力欄の見た目やidではなく、送信された値に付いている名前です。
もう1つ大切なのは、「値が空」と「その名前の値が届いていない」は別の状態だということです。受信結果が "" なのか null なのかで、確認する場所が変わります。
Schoo コースページ:Java入門 中級【2026年版】
name属性とgetParameter()の名前を合わせる
<input type="text" id="name-field" name="userName">
String userName = request.getParameter("userName");
入力欄に「山田」と入力して送信すると、userName という名前に「山田」という値が対応します。getParameter("userName") は、その名前の値を取り出して String として返します。数値用の入力欄でも、ここで取得する値は文字列です。
userName = 山田news = yesidの「name-field」や、画面の「名前」というラベルは、送信する名前ではありません。
getParameter("userName")Stringの「山田」
getParameter("news")Stringの「yes」
通信内容は読みやすく復号したイメージです。実際のPOST本文では、日本語などがURLエンコードされます。
Javaの変数名まで合わせる必要はありません。次のコードも同じ値を取得できます。ダブルクォートの内側にある "userName" が、送信された名前を指定する部分です。
String personName = request.getParameter("userName");
id・name・valueは、それぞれ何を表すのか
| 書き方 | 役割 | 今回の例 |
|---|---|---|
id | ページ内で要素を識別する。labelやCSS、JavaScriptなどから使う | id="name-field" |
name | フォームで送信する値の名前 | name="userName" |
value | 値を指定する。テキスト入力欄のHTMLでは初期値、チェックボックスでは選択時に送る値 | value="yes" |
<label for="name-field"> の for はidに対応します。一方、getParameter("userName") の引数はnameに対応します。labelと入力欄を結ぶ名前と、サーバーへ送信する名前を分けて読んでください。
<label for="name-field">名前</label>
<input type="text" id="name-field" name="userName" value="山田">
このテキスト入力欄を「佐藤」に書き換えてから送信すると、届くのは userName=佐藤 です。HTMLに書かれた初期値「山田」が必ず送られるわけではありません。
nullと空文字は、同じ「空」ではない
name="userName"""名前は届いた。文字数は0。
id="name-field" のみuserNameという名前が届いていない。
どちらも getParameter("userName") で取得した場合です。この例の入力欄にはrequiredやdisabledを付けていません。
| フォームの状態 | getParameter("userName") |
|---|---|
name="userName" のテキスト欄に山田を入力 | "山田" |
| 同じテキスト欄を空にして送信 | ""(文字数0のString) |
| nameがなく、idだけの入力欄に山田を入力 | null |
入力欄のnameを user_name に変え、Java側は変更しない | null |
ここでは、同名のパラメータがURLなどに別途なく、通常のテキスト入力欄をフォームから送信する場合を扱っています。null は「nullという4文字の文字列」ではなく、その名前のパラメータが存在しないことを示す値です。
受信した値に対して、いきなり userName.isEmpty() を呼ぶと、null の場合に NullPointerException になります。原因を分けて確認するなら、次の順で判定します。
if (userName == null) {
// 名前の不一致、nameの付け忘れ、送信対象外などを確認
} else if (userName.isEmpty()) {
// 名前は届いているが、値が空文字
} else {
// 文字列が届いている
}
半角スペースだけの " " は空文字ではないので、isEmpty() はfalseです。空白だけの入力も未入力として扱う要件なら、nullを確認したうえで isBlank() などを使います。
チェックボックスは、未選択なら名前ごと送信されない
<input type="checkbox" name="news" value="yes">
| 画面の状態 | 送信する名前と値 | getParameter("news") |
|---|---|---|
| チェックあり | news=yes | "yes" |
| チェックなし | news の組を送信しない | null |
未選択だから "false" や "" が自動で届くわけではありません。また、この例で届くのは表示ラベルの「お知らせを受け取る」ではなく、valueで指定した "yes" です。valueを省略したチェックボックスは、選択時に "on" を送ります。
String news = request.getParameter("news");
boolean receiveNews = "yes".equals(news);
この書き方ならnewsがnullでも例外にならず、文字列が "yes" のときだけtrueになります。複数のチェックボックスに同じnameを付け、選択した値をすべて読む場合は getParameterValues() を使います。
動かして確認:フォームとServletのコード
入力欄のnameや入力内容を変えて、受信結果を比べるサンプルです。データの登録やメール送信は行いません。今回はJSPを使わず、Servletが受信結果をプレーンテキストで返します。
入力画面:src/main/webapp/parameter-form.html に配置します。空文字を試せるよう、requiredは付けていません。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォームの受信確認</title>
</head>
<body>
<h1>フォームの受信確認</h1>
<form action="parameter-check" method="post">
<p>
<label for="name-field">名前</label>
<input type="text" id="name-field" name="userName">
</p>
<p>
<label>
<input type="checkbox" name="news" value="yes">
お知らせを受け取る
</label>
</p>
<button type="submit">受信結果を確認</button>
</form>
</body>
</html>
受信処理:src/main/java/example/ParameterCheckServlet.java に配置します。POST本文の文字コードは、最初の getParameter() より前に指定しています。
package example;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/parameter-check")
public class ParameterCheckServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String news = request.getParameter("news");
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("userName: " + describe(userName));
out.println("news: " + describe(news));
}
private String describe(String value) {
if (value == null) {
return "null(この名前の値は届いていません)";
}
if (value.isEmpty()) {
return "\"\"(値は空文字です)";
}
return "\"" + value + "\"";
}
}
describe() はnullや空文字を区別して表示するためのメソッドです。結果を text/plain で返すので、入力内容をHTMLとして解釈させません。HTMLへ入力値を埋め込む場合は、別途HTML用のエスケープが必要です。
アプリのコンテキストパスが /lesson04 の場合、http://localhost:8080/lesson04/parameter-form.html から開きます。フォームの action="parameter-check" は、この配置では /lesson04/parameter-check を送信先にします。ServletのURLをアドレス欄から直接開くGETでは、このサンプルのdoPostは実行されません。
同じコードで、次の4パターンを試す
| 操作 | userNameの表示 | newsの表示 |
|---|---|---|
| 山田を入力・チェックあり | "山田" | "yes" |
| 名前を空にする・チェックなし | ""(値は空文字です) | null(この名前の値は届いていません) |
nameを user_name に変え、山田を入力 | null(Java側はuserNameを探す) | チェックの状態に応じた値 |
| 名前欄のnameを削除し、idだけ残して山田を入力 | null | チェックの状態に応じた値 |
HTMLを変更したら変更を反映し、フォーム画面を再読み込みしてから送信します。3・4の後は name="userName" に戻してください。Javaの変数名を変更しても、HTMLの送信名の不一致は直りません。
値が取れないときは、送信内容から順番に調べる
- 入力欄のnameと、getParameterの文字列が完全に一致しているか。
userNameとusernameも別の名前です。 - 入力欄が送信するフォームに属しているか。通常はformの内側に置きます。外側の場合はform属性での関連付けが必要です。
- 入力欄に
disabledが付いていないか。無効化された欄は送信対象になりません。readonlyのテキスト欄は通常送信されます。 - チェックボックスやラジオボタンが選択されているか。未選択の項目は送信されません。
- ブラウザの開発者ツールでNetworkを開き、送信先のリクエストに該当の名前と値があるか。POSTならPayloadのForm Data、GETならQuery String Parametersなどを確認します。
送信内容に名前がなければHTML側、名前があるのに取得できなければJava側の取得名や、実際に処理しているServletを確認します。JSONを本文に送るAPIなどは通常のフォーム送信とは扱いが異なり、JSONの項目をgetParameterで読めるわけではありません。
受信結果を表示する今回のコードは学習用です。実際のアプリでは、パスワードなどを確認画面やログにそのまま出さないようにしてください。
確認問題
以下のフォームで、表示された「佐藤」をそのままにし、お知らせのチェックは外したまま送信したとします。同じ名前のパラメータがURLなどに追加されていないものとします。
<form action="parameter-check" method="post">
<input type="text" id="userName" name="memberName" value="佐藤">
<input type="text" name="comment" value="">
<input type="checkbox" name="news" value="yes">
<button type="submit">送信</button>
</form>
getParameter("userName")、getParameter("memberName")、getParameter("comment")、getParameter("news")の戻り値を書いてください。- HTMLを変えずに「佐藤」をJavaの変数
userNameに入れる1行を書いてください。 - お知らせにチェックを入れて再送信すると、newsは何になりますか。value属性を省略した場合との違いも答えてください。
- commentに対し、名前が届いていない場合・空文字の場合・それ以外を分けるif文を書いてください。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
まとめ
- getParameterに指定するのはidやJavaの変数名ではなく、送信されたパラメータの名前。
- 通常のテキスト欄では、未入力は空文字。名前が届いていなければnull。
- 未選択のチェックボックスは、名前と値の組を送信しない。
- フォームの見た目だけでなく、実際に送信された名前と値を見ると原因を絞り込める。