サーブレット&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アプリケーションサーバが受け取る
5HttpServletRequestインスタンスに格納される
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属性送信される例サーブレット側の取得
userNameuserName=青山直人request.getParameter("userName")
userAgeuserAge=23request.getParameter("userAge")
entryTypeentryType=studentrequest.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またはdoPostmethod属性に対応する実行メソッドがあるか
name属性フォーム部品に識別名が付いているか
getParametername属性と同じ名前を指定しているか
文字コードgetParameterより前にsetCharacterEncodingを指定しているか
大文字小文字userNameとusernameを混同していないか
null指定した名前のパラメータが存在するか

フォーム送信は、HTML側とサーブレット側が連携してはじめて正しく動きます。

フォーム側では、action属性、method属性、name属性を正しく指定します。サーブレット側では、対応するURLパターン、doGetまたはdoPost、setCharacterEncoding、getParameterを正しく書きます。

この対応関係を確認できるようになると、フォームから送られてきた値をサーブレットで扱う流れがぐっと分かりやすくなります。