サーブレット&JSPの基本|hiddenフィールドとURLパラメータ

画面には見えないデータも送信できる。hiddenフィールドとURLパラメータで、プログラムに必要な値を渡そう

フォームを使うと、利用者が入力した名前や選択した項目をリクエストパラメータとしてサーバへ送信できます。

しかし、Webアプリケーションを作っていると、利用者が画面で直接入力していない値も、サーバ側のプログラムへ送りたい場面があります。

たとえば、どの画面から送信されたのか、どの商品に対する操作なのか、どの処理を実行したいのか、といった情報です。利用者に入力してもらう必要はないけれど、サーバ側では必要になるデータがあります。

このようなときに使える方法が、hiddenフィールドとURLパラメータです。

hiddenフィールドを使うと、フォームの中に画面には表示されない入力部品を置き、その値を送信できます。また、リンクのURLの末尾にリクエストパラメータを付けることで、リンクをクリックしたときに決まった値をサーバへ送ることもできます。

この記事では、開発者があらかじめ指定した値を、リクエストパラメータとしてサーバへ送る2つの方法を解説します。

開発者がプログラムへデータを送る場面

フォームでは、利用者が入力した値を送信するのが基本です。

しかし、実際のWebアプリケーションでは、利用者が入力していない値も一緒に送りたいことがあります。

たとえば、画面上では申し込むボタンしか見えていなくても、内部的には次のような値を送信したい場合があります。

送りたい値目的の例
eventIdどのイベントに申し込むかを識別する
mode新規登録か更新かを区別する
categoryどのカテゴリの一覧を表示するかを指定する
page何ページ目を表示するかを指定する

これらの値は、利用者が毎回入力するものではありません。開発者があらかじめHTMLの中に用意しておき、送信時やリンククリック時にサーバへ渡します。

このような値も、送信されるときはリクエストパラメータとして扱われます。

2つの方法で値を送信できる

開発者があらかじめ指定した値をサーバへ送るには、主に次の2つの方法があります。

方法使い方
hiddenフィールドを使うフォーム内に画面に表示されない入力部品を置く
URLの末尾に指定するリンク先URLにリクエストパラメータを付ける

hiddenフィールドは、フォーム送信と一緒に値を送りたいときに使います。

URLの末尾に指定する方法は、リンクをクリックしたときに値を送りたいときに使います。

どちらも、送られた先ではrequest.getParameterを使って値を取得できます。

図1:開発者が指定した値をリクエストパラメータとして送る

この図から分かること

利用者が画面で入力していない値でも、開発者があらかじめHTMLの中に用意しておけば、サーバへ送信できます。

hiddenフィールドはフォームの中に配置し、送信ボタンをクリックしたときに他の入力値と一緒に送られます。URLパラメータはリンク先のURLに付けておき、リンクをクリックしたときに送られます。

どちらの方法でも、サーバ側ではリクエストパラメータとして扱えます。

方法① hiddenフィールドを使用する

hiddenフィールドは、フォームの中に配置する入力部品の1つです。

名前のとおり、画面には表示されません。利用者からは見えませんが、フォームを送信すると、その値は他のフォーム部品と一緒にサーバへ送られます。

hiddenフィールドの基本形

<input type="hidden" name="名前" value="値">

type属性にhiddenを指定すると、画面には表示されない入力部品になります。

name属性には、リクエストパラメータの名前を指定します。value属性には、送信したい値を指定します。

hiddenフィールドの属性

属性役割
type属性hiddenを指定して画面に表示しない部品にする
name属性送信するリクエストパラメータの名前を指定する
value属性送信する値を指定する

たとえば、name属性にeventId、value属性にE100を指定すると、送信時にはeventId=E100というリクエストパラメータが送られます。

サーバ側では、request.getParameter("eventId")を使ってE100を取得できます。

hiddenフィールドを使ったフォームの例

ここでは、研修イベントへの申し込みフォームを例にします。

利用者が画面で入力するのは名前だけです。しかし、サーバ側では、どのイベントへの申し込みなのかも知る必要があります。

そこで、画面には表示されないhiddenフィールドとしてeventIdを用意します。

hiddenフィールドを持つ申し込みフォームの例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>研修イベント申し込み</title>
</head>
<body>
<form action="EntryServlet" method="get">
<input type="hidden" name="eventId" value="E100">
名前:<input type="text" name="userName"><br>
<input type="submit" value="申し込む">
</form>
</body>
</html>

このフォームでは、画面に表示されるのは名前の入力欄と申し込むボタンです。

しかし、フォームの中には次のhiddenフィールドが入っています。

<input type="hidden" name="eventId" value="E100">

このため、申し込むボタンをクリックすると、userNameの値だけでなく、eventId=E100も一緒に送信されます。

たとえば、名前に青山直人と入力して送信した場合、次のようなリクエストパラメータが送られます。

eventId=E100&userName=青山直人

サーバ側では、次のように値を取得できます。

String eventId = request.getParameter("eventId");
String userName = request.getParameter("userName");

hiddenフィールドは画面に表示されませんが、フォーム送信時にはリクエストパラメータとして送られることがポイントです。

hiddenフィールドはformタグの中に書く

hiddenフィールドはフォーム部品の1つなので、送信したい場合はformタグの中に書きます。

formタグの外に書いてしまうと、そのフォームの送信対象になりません。

hiddenフィールドの配置

配置場所送信されるか
formタグの中送信される
formタグの外そのフォームでは送信されない

hiddenフィールドは画面に見えないため、配置場所の間違いに気づきにくいことがあります。

値がサーバ側で取得できない場合は、name属性やvalue属性だけでなく、hiddenフィールドがformタグの中に入っているかも確認しましょう。

図2:hiddenフィールドは画面に見えないが送信される

この図から分かること

hiddenフィールドは、ブラウザ画面には表示されないフォーム部品です。

利用者には見えませんが、formタグの中に置かれていれば、送信ボタンをクリックしたときに他の入力値と一緒に送られます。

たとえば、eventId=E100のような値をhiddenフィールドとして用意しておくと、サーバ側ではrequest.getParameter("eventId")で取得できます。

方法② リクエスト先URLの末尾に指定する

もう1つの方法は、リンク先URLの末尾にリクエストパラメータを付ける方法です。

aタグのhref属性に指定するURLの後ろに?を付け、その後ろに名前=値の形でリクエストパラメータを書きます。

URLの末尾に指定する基本形

<a href="リクエスト先?名前=値">リンク文字</a>

たとえば、ItemServletへitemId=I200という値を送信したい場合は、次のように書きます。

<a href="ItemServlet?itemId=I200">詳細を見る</a>

このリンクをクリックすると、ItemServletへGETリクエストが送られます。そのとき、itemId=I200というリクエストパラメータも一緒に送信されます。

サーバ側では、次のように取得できます。

String itemId = request.getParameter("itemId");

この方法では、フォームを使わなくても、リンクをクリックしただけで決まった値をサーバへ送れます。

複数のリクエストパラメータを付ける

URLの末尾に複数のリクエストパラメータを付けたい場合は、&でつなぎます。

複数指定の基本形

<a href="リクエスト先?名前1=値1&名前2=値2">リンク文字</a>

たとえば、itemId=I200とcategory=bookを同時に送りたい場合は、次のように書きます。

<a href="ItemServlet?itemId=I200&category=book">書籍の詳細を見る</a>

このリンクをクリックすると、次の2つのリクエストパラメータが送られます。

名前
itemIdI200
categorybook

サーバ側では、request.getParameter("itemId")とrequest.getParameter("category")で、それぞれの値を取得できます。

URLパラメータを使ったリンクの例

ここでは、商品一覧から詳細ページへ移動するリンクを例にします。

利用者が詳細を見るをクリックすると、ItemServletへ商品IDとカテゴリを送信します。

URLパラメータを持つリンクの例

ファイル名: item-list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品一覧</title>
</head>
<body>
<p>Java入門テキスト</p>
<a href="ItemServlet?itemId=I200&category=book">詳細を見る</a>
</body>
</html>

このHTMLでは、詳細を見るリンクのhref属性に次のURLを指定しています。

ItemServlet?itemId=I200&category=book

リンクをクリックすると、ItemServletへGETリクエストが送られます。

そのとき、itemId=I200とcategory=bookという2つのリクエストパラメータも一緒に送信されます。

サーバ側では、次のように値を取得できます。

String itemId = request.getParameter("itemId");
String category = request.getParameter("category");

この方法は、一覧画面から詳細画面へ移動するときのように、リンク先へ何らかの識別情報を渡したい場合に使えます。

URLパラメータではdoGetが実行される

リンクをクリックしてリクエストする場合、リクエストメソッドはGETになります。

そのため、URLの末尾にリクエストパラメータを付けてサーブレットへ送信した場合、リンク先のサーブレットクラスではdoGetメソッドが実行されます。

URLパラメータと実行メソッド

操作リクエストメソッドサーブレット側で実行されるメソッド
リンクをクリックするGETdoGet
ブラウザのアドレスバーにURLを入力するGETdoGet

リンク先のサーブレットにdoGetメソッドがない場合、正しく処理できないことがあります。

URLパラメータを使う場合は、リンク先のサーブレットでdoGetメソッドを用意することを意識しましょう。

図3:URLの末尾にリクエストパラメータを付ける

この図から分かること

リンクのURLの末尾に?を付け、その後ろに名前=値の形でリクエストパラメータを書けば、リンクをクリックしたときに値をサーバへ送れます。

複数の値を送る場合は、&でつなぎます。

リンククリックによるリクエストはGETリクエストになるため、リンク先のサーブレットではdoGetメソッドが実行されます。サーバ側では、hiddenフィールドの場合と同じようにrequest.getParameterで値を取得できます。

hiddenフィールドとURLパラメータの使い分け

hiddenフィールドとURLパラメータは、どちらも開発者があらかじめ指定した値をリクエストパラメータとして送る方法です。

ただし、使う場面が少し異なります。

2つの方法の違い

方法使う場面値が送られるタイミング
hiddenフィールドフォーム送信と一緒に値を送りたいとき送信ボタンをクリックしたとき
URLパラメータリンククリックで値を送りたいときリンクをクリックしたとき

hiddenフィールドは、フォームの送信データに値を追加したいときに向いています。

URLパラメータは、リンク先へ識別情報などを渡したいときに向いています。

どちらの場合も、サーバ側ではリクエストパラメータとして受け取ります。つまり、取得方法はrequest.getParameterです。

送信される形はリクエストパラメータ

hiddenフィールドで送っても、URLの末尾に指定しても、サーバ側に届くとリクエストパラメータとして扱われます。

サーバ側での取得方法

送信方法送られる例取得方法
hiddenフィールドeventId=E100request.getParameter("eventId")
URLパラメータitemId=I200request.getParameter("itemId")
URLパラメータを複数指定itemId=I200&category=bookrequest.getParameter("itemId")、request.getParameter("category")

フォームから送られた値も、hiddenフィールドの値も、URLの末尾に付けた値も、名前=値の形式で送られる点は同じです。

この考え方が分かると、フォーム送信とリンククリックのどちらでも、同じようにサーバ側で値を取得できることが理解しやすくなります。

hiddenフィールドで確認したいポイント

hiddenフィールドを使うときは、次の点を確認しましょう。

確認項目内容
type属性hiddenになっているか
name属性取得時に使う名前を指定しているか
value属性送信したい値を指定しているか
formタグhiddenフィールドがformタグの中にあるか
送信先formタグのaction属性が正しいか

hiddenフィールドは画面に表示されないため、入力画面だけを見ても存在を確認できません。

コード上で、name属性とvalue属性が正しく指定されているか、formタグの中に置かれているかを確認することが大切です。

URLパラメータで確認したいポイント

URLの末尾にリクエストパラメータを指定するときは、?と&の使い方を確認します。

確認項目内容
?URLとリクエストパラメータの区切りに使う
名前=値1つのリクエストパラメータを表す
&複数のリクエストパラメータをつなぐ
doGetリンク先のサーブレットで実行される
getParameterサーバ側で値を取得する

1つ目のリクエストパラメータの前には?を付けます。

2つ目以降のリクエストパラメータは&でつなぎます。

たとえば、ItemServletにitemIdとcategoryを送る場合は、次のように指定します。

<a href="ItemServlet?itemId=I200&category=book">詳細を見る</a>

このリンクをクリックすると、ItemServletへGETリクエストが送られ、itemIdとcategoryを取得できるようになります。

開発者が指定した値を送るときの考え方

hiddenフィールドとURLパラメータは、利用者が直接入力していない値をサーバ側へ渡したいときに役立ちます。

フォーム送信に含めたい値はhiddenフィールドで送ります。リンククリック時に渡したい値はURLの末尾に指定します。

目的適した方法
フォーム送信と一緒にイベントIDを送りたいhiddenフィールド
申し込みボタンと一緒に処理モードを送りたいhiddenフィールド
商品一覧のリンクから商品IDを送りたいURLパラメータ
カテゴリ別リンクからカテゴリIDを送りたいURLパラメータ

どちらの方法でも、送信先のサーブレットやJSPではrequest.getParameterを使って値を取得できます。

画面には見えない値や、リンクに含めた値も、サーバ側では通常のリクエストパラメータとして扱われます。これを理解しておくと、より本格的なWebアプリケーションを作るための準備が整っていきます。