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

最終更新日

Schoo Java入門 中級 第4回 Webアプリケーションの動作原理と画面連携

本記事は、Schooの「Java入門 中級【2026年版】」第4回「Webアプリケーションの動作原理と画面連携」に関連する補足記事です。HTMLフォームからServletに値が渡るときの、名前と値の対応を整理します。

フォームに入力したのにJavaで値を取得できないときは、まずHTMLの namegetParameter() に指定した名前を見比べます。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 として返します。数値用の入力欄でも、ここで取得する値は文字列です。

図解:画面の入力は「名前と値」の組で届く
ブラウザ:フォームの受信確認
名前
山田
name="userName" が付いた入力欄
☑ お知らせを受け取る
name="news" value="yes"
「受信結果を確認」を押す
フォームの値を送信
リクエストに入る名前と値
userName = 山田
news = yes

idの「name-field」や、画面の「名前」というラベルは、送信する名前ではありません。

Servletが名前を指定して取り出す
サーバー:Javaの取得結果
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はある・何も入力しない
name="userName"
送信する組:userName = (空)
取得結果:""
名前は届いた。文字数は0。
入力した・でもnameがない
山田
id="name-field" のみ
送信する組:userName自体がない
取得結果:null
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の送信名の不一致は直りません。

値が取れないときは、送信内容から順番に調べる

  1. 入力欄のnameと、getParameterの文字列が完全に一致しているか。userNameusername も別の名前です。
  2. 入力欄が送信するフォームに属しているか。通常はformの内側に置きます。外側の場合はform属性での関連付けが必要です。
  3. 入力欄に disabled が付いていないか。無効化された欄は送信対象になりません。readonly のテキスト欄は通常送信されます。
  4. チェックボックスやラジオボタンが選択されているか。未選択の項目は送信されません。
  5. ブラウザの開発者ツールで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>
  1. getParameter("userName")getParameter("memberName")getParameter("comment")getParameter("news") の戻り値を書いてください。
  2. HTMLを変えずに「佐藤」をJavaの変数 userName に入れる1行を書いてください。
  3. お知らせにチェックを入れて再送信すると、newsは何になりますか。value属性を省略した場合との違いも答えてください。
  4. commentに対し、名前が届いていない場合・空文字の場合・それ以外を分けるif文を書いてください。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

まとめ

  • getParameterに指定するのはidやJavaの変数名ではなく、送信されたパラメータの名前。
  • 通常のテキスト欄では、未入力は空文字。名前が届いていなければnull。
  • 未選択のチェックボックスは、名前と値の組を送信しない。
  • フォームの見た目だけでなく、実際に送信された名前と値を見ると原因を絞り込める。

関連する記事

シェアする