
サーブレット&JSPの基本|リクエストパラメータの取得方法
送信されたデータはrequestの中にある。getParameterでフォームの入力値を取り出そう
フォームを作成してデータを送信できるようになったら、次に必要になるのは、送信先のサーブレットやJSPでそのデータを受け取る方法です。
フォームの送信ボタンをクリックすると、入力された値はリクエストパラメータとしてアプリケーションサーバへ送られます。アプリケーションサーバは、そのリクエストパラメータをHttpServletRequestインスタンスの中に格納し、リクエスト先のサーブレットクラスやJSPファイルへ渡します。
サーブレットでは、doGetメソッドやdoPostメソッドの引数としてHttpServletRequest requestを受け取ります。このrequestの中に、フォームから送られてきたデータが入っています。
この記事では、フォームから送信されたリクエストパラメータを、サーブレットクラスでどのように取り出すのかを解説します。文字コードの指定、getParameterの使い方、URLパターンとaction属性の対応、method属性と実行メソッドの対応まで、順番に確認していきましょう。
リクエストパラメータはHttpServletRequestに入る
フォームから送信されたデータは、サーバ側に届くとHttpServletRequestインスタンスに格納されます。
たとえば、フォームから次のようなデータが送信されたとします。
userName=青山直人&userAge=23
このとき、アプリケーションサーバはリクエストパラメータを受け取り、HttpServletRequestの中に保存します。サーブレットクラスは、そのHttpServletRequestから必要な値を取り出して処理に使います。
リクエストパラメータの流れ
| 順番 | 内容 |
|---|---|
| 1 | フォームに値を入力する |
| 2 | 送信ボタンをクリックする |
| 3 | 入力値がリクエストパラメータとして送信される |
| 4 | アプリケーションサーバが受け取る |
| 5 | HttpServletRequestインスタンスに格納される |
| 6 | サーブレットやJSPが値を取り出す |
ここで大切なのは、サーブレットが直接ブラウザから値を拾いに行くのではない、という点です。
ブラウザから届いたリクエストをアプリケーションサーバが受け取り、その中に含まれるパラメータをHttpServletRequestへまとめてくれます。サーブレットは、そのrequestを使って値を取得します。
図1:リクエストパラメータがHttpServletRequestに入る流れ

この図から分かること
フォームに入力された値は、送信ボタンをクリックするとリクエストパラメータとしてサーバへ送られます。
サーバに届いたリクエストパラメータは、HttpServletRequestインスタンスに格納されます。サーブレットクラスやJSPファイルは、このHttpServletRequestを通して送信データを取得します。
つまり、フォームから送られたデータを扱うときは、requestが入口になります。サーブレットのdoGetメソッドやdoPostメソッドに渡されるrequestを使うことで、入力値をプログラム内で利用できます。
サーブレットでリクエストパラメータを取得する
サーブレットクラスでは、HttpServletRequestのgetParameterメソッドを使って、リクエストパラメータの値を取得します。
getParameterには、取得したいリクエストパラメータの名前を指定します。この名前は、フォーム部品のname属性に指定した値です。
たとえば、フォームのテキストボックスにname属性としてuserNameを指定していた場合、サーブレット側では次のように取得します。
String userName = request.getParameter("userName");
この処理によって、userNameという名前で送られてきた値をString型の変数userNameに代入できます。
getParameterの基本
| 書き方 | 内容 |
|---|---|
| request.getParameter("パラメータ名") | 指定した名前のリクエストパラメータを取得する |
| 戻り値 | String型 |
| 指定した名前がない場合 | nullが返される |
| 名前の扱い | 大文字と小文字を区別する |
リクエストパラメータは、フォームのname属性とサーブレット側のgetParameterで指定する名前が一致していないと取得できません。
userNameとusernameは別の名前として扱われます。大文字と小文字の違いにも注意しましょう。
文字コードを指定してから取得する
フォームから送られてきた日本語を正しく扱うために、サーブレット側ではリクエストパラメータの文字コードを指定します。
そのために使うのがsetCharacterEncodingメソッドです。
基本的には、getParameterで値を取得する前に、次のように記述します。
request.setCharacterEncoding("UTF-8");
この処理は、URLエンコードされたリクエストパラメータを元の文字列に戻すときに、どの文字コードを使うかを指定するためのものです。
文字コード指定で大切なこと
| 項目 | 内容 |
|---|---|
| 指定する場所 | getParameterより前 |
| よく使う文字コード | UTF-8 |
| 目的 | 日本語などを正しく復元する |
| 指定しない場合 | 文字化けの原因になることがある |
フォーム側のHTMLやJSPがUTF-8で作られている場合、サーブレット側でもUTF-8として扱うのが基本です。
学習中は、リクエストパラメータを取得する前にrequest.setCharacterEncoding("UTF-8");を書く、という流れをお約束として覚えておくとよいでしょう。
リクエストパラメータを取得するサーブレットの例
ここでは、イベント参加フォームから送信された名前と参加区分を取得するサーブレットを例にします。
フォーム側では、名前の入力欄にuserName、参加区分のラジオボタンにentryTypeというname属性が付いている想定です。送信方法はPOSTリクエストです。
リクエストパラメータを取得するサーブレットクラスの例
package servlet;
import java.io.IOException;
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("/EntryServlet")
public class EntryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// リクエストパラメータの文字コードを指定
request.setCharacterEncoding("UTF-8");
// リクエストパラメータの取得
String userName = request.getParameter("userName");
String entryType = request.getParameter("entryType");
// ここから先で取得した値を使って処理を行う
}
}この例では、EntryServletのURLパターンを/EntryServletにしています。
フォームのaction属性にEntryServletを指定してPOST送信すると、EntryServletのdoPostメソッドが実行されます。そして、request.getParameterを使ってuserNameとentryTypeの値を取得します。
EntryServlet.javaのポイント
EntryServlet.javaでは、リクエストパラメータを取得するために大切な処理が2つあります。
1つ目は、文字コードを指定する処理です。
request.setCharacterEncoding("UTF-8");
2つ目は、getParameterで値を取得する処理です。
String userName = request.getParameter("userName");
String entryType = request.getParameter("entryType");
処理の役割
| 処理 | 役割 |
|---|---|
| request.setCharacterEncoding("UTF-8") | リクエストパラメータをUTF-8として扱う |
| request.getParameter("userName") | userNameという名前の値を取得する |
| request.getParameter("entryType") | entryTypeという名前の値を取得する |
リクエストパラメータを取得するときは、フォーム側のname属性と、getParameterに指定する名前を一致させる必要があります。
たとえば、フォーム側でname属性をuserNameにしているなら、サーブレット側でもgetParameter("userName")と指定します。
図2:getParameterでフォームの値を取り出す

この図から分かること
フォームから送られたリクエストパラメータは、HttpServletRequestの中に格納されます。
サーブレット側では、request.getParameterを使って、指定した名前の値を取り出します。たとえば、userNameという名前で送られた値は、request.getParameter("userName")で取得できます。
また、日本語を含む値を正しく扱うために、getParameterより前にrequest.setCharacterEncoding("UTF-8")を書くことが大切です。
getParameterで指定する名前はname属性と一致させる
フォームの入力部品には、name属性で識別名を付けます。
サーブレット側でgetParameterに指定する名前は、このname属性の値と一致している必要があります。
フォーム側とサーブレット側の対応
| フォーム側のname属性 | 送信される例 | サーブレット側の取得 |
|---|---|---|
| userName | userName=青山直人 | request.getParameter("userName") |
| userAge | userAge=23 | request.getParameter("userAge") |
| entryType | entryType=student | request.getParameter("entryType") |
フォーム側ではuserNameなのに、サーブレット側でgetParameter("name")と書くと、別の名前を探すことになります。
指定した名前のリクエストパラメータが存在しない場合、getParameterはnullを返します。
nullが返される場合
getParameterで指定した名前のリクエストパラメータが存在しない場合、戻り値はnullになります。
たとえば、フォーム側のname属性がuserNameなのに、サーブレット側で次のように書いた場合を考えます。
String userName = request.getParameter("name");
この場合、nameというリクエストパラメータが送信されていなければ、userNameにはnullが入ります。
nullになりやすい原因
| 原因 | 内容 |
|---|---|
| name属性の指定ミス | フォーム側とサーブレット側の名前が一致していない |
| name属性の付け忘れ | 入力部品に識別名がない |
| formタグの外に部品がある | 送信対象になっていない |
| 未選択のラジオボタン | 何も選ばれていないため送信されない |
| 大文字小文字の違い | userNameとusernameは別名として扱われる |
nullが返された場合は、まずフォーム部品のname属性とgetParameterに指定した名前を見比べましょう。
URLパターンの一致に注意する
フォームからサーブレットへデータを送信する場合、フォームのaction属性とサーブレットのURLパターンを一致させる必要があります。
たとえば、EntryServlet.javaに次のように書かれているとします。
@WebServlet("/EntryServlet")
この場合、フォーム側のaction属性にはEntryServletを指定します。
action属性とURLパターンの対応
| サーブレット側 | フォーム側 |
|---|---|
| @WebServlet("/EntryServlet") | action="EntryServlet" |
action属性とURLパターンが一致していないと、送信ボタンを押しても目的のサーブレットへリクエストが届きません。
その結果、404ページが表示されたり、別のプログラムへ送信されたりする原因になります。
サーブレットでフォームデータを受け取れないときは、まずURLパターンとaction属性を確認しましょう。
method属性と実行メソッドを一致させる
フォームから送られるリクエストメソッドに合わせて、サーブレット側には対応する実行メソッドを用意する必要があります。
フォームのmethod属性がpostの場合、送信時にはPOSTリクエストが送られます。そのため、サーブレット側ではdoPostメソッドが実行されます。
フォームのmethod属性がgetの場合は、GETリクエストが送られ、doGetメソッドが実行されます。
method属性と実行メソッドの対応
| フォーム側のmethod属性 | リクエストメソッド | サーブレット側で必要なメソッド |
|---|---|---|
| method="get" | GETリクエスト | doGet |
| method="post" | POSTリクエスト | doPost |
今回のEntryServlet.javaではdoPostメソッドを作成しています。そのため、フォーム側ではmethod属性にpostを指定する必要があります。
method属性がpostなのに、サーブレット側にdoPostメソッドがない場合、正しく処理できません。
リクエストメソッドは操作によって決まる
GETリクエストになるかPOSTリクエストになるかは、どのような操作でリクエストしたかによって決まります。
ブラウザのアドレスバーにURLを入力した場合や、リンクをクリックした場合はGETリクエストになります。
一方、フォームのmethod属性がpostである送信ボタンをクリックした場合はPOSTリクエストになります。
操作とリクエストメソッドの関係
| 操作 | 送信されるリクエストメソッド |
|---|---|
| アドレスバーにURLを入力する | GET |
| リンクをクリックする | GET |
| ブックマークを選択する | GET |
| method属性がgetのフォームを送信する | GET |
| method属性がpostのフォームを送信する | POST |
POSTリクエストは、基本的にmethod属性がpostのフォームを送信したときに使われます。
そのため、doPostメソッドの動作を確認したい場合は、ブラウザのアドレスバーにURLを直接入力するのではなく、POST送信用のフォームからリクエストする必要があります。
図3:リクエストメソッドと実行メソッドの関係

この図から分かること
サーブレットでどのメソッドが実行されるかは、リクエストメソッドによって決まります。
アドレスバーへのURL入力、リンククリック、ブックマークの選択、method属性がgetのフォーム送信ではGETリクエストが送られます。そのため、サーブレット側ではdoGetメソッドが実行されます。
method属性がpostのフォーム送信ではPOSTリクエストが送られます。そのため、サーブレット側ではdoPostメソッドが実行されます。
フォームから送信されたデータを受け取るサーブレットを作成するときは、フォーム側のmethod属性と、サーブレット側の実行メソッドを必ず対応させましょう。
対応する実行メソッドがないと405ページになる
リクエストされたサーブレットクラスに、リクエストメソッドに対応する実行メソッドがない場合、405ページが表示されます。
405ページは、そのリクエスト方法に対応していないことを示すエラーです。
たとえば、フォーム側でmethod属性にpostを指定しているのに、サーブレット側にdoPostメソッドがない場合、POSTリクエストを処理できません。
405ページが起こりやすい例
| 状況 | 起こること |
|---|---|
| method属性がpostなのにdoPostがない | POSTを処理できず405ページになる |
| method属性がgetなのにdoGetがない | GETを処理できず405ページになる |
| URLを直接入力したのにdoGetがない | GETを処理できず405ページになる |
405ページが表示された場合は、URLパターンだけでなく、リクエストメソッドと実行メソッドの対応を確認しましょう。
404ページは送信先が見つからない場合、405ページは送信先は見つかったが、そのリクエストメソッドに対応していない場合に表示される、と考えると整理しやすいです。
リクエストパラメータ取得で確認したいポイント
フォームから送られたデータをサーブレットで取得するときは、次の点を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| action属性 | サーブレットのURLパターンと一致しているか |
| method属性 | getまたはpostが正しく指定されているか |
| doGetまたはdoPost | method属性に対応する実行メソッドがあるか |
| name属性 | フォーム部品に識別名が付いているか |
| getParameter | name属性と同じ名前を指定しているか |
| 文字コード | getParameterより前にsetCharacterEncodingを指定しているか |
| 大文字小文字 | userNameとusernameを混同していないか |
| null | 指定した名前のパラメータが存在するか |
フォーム送信は、HTML側とサーブレット側が連携してはじめて正しく動きます。
フォーム側では、action属性、method属性、name属性を正しく指定します。サーブレット側では、対応するURLパターン、doGetまたはdoPost、setCharacterEncoding、getParameterを正しく書きます。
この対応関係を確認できるようになると、フォームから送られてきた値をサーブレットで扱う流れがぐっと分かりやすくなります。
