サーブレット&JSPの基本|JSPでリクエストパラメータを取得する

JSPでもrequestから値を取り出せる。暗黙オブジェクトを知って、フォーム送信の流れをつかもう

前回は、フォームから送信されたリクエストパラメータを、サーブレットクラスで受け取る方法を学習しました。

フォームの送信先は、サーブレットクラスだけではありません。JSPファイルを送信先にすることもできます。フォームのaction属性にJSPファイルのパスを指定すれば、送信ボタンをクリックしたときに、そのJSPファイルへリクエストを送れます。

JSPファイルでリクエストパラメータを取得する場合も、基本的な考え方はサーブレットクラスと同じです。送られてきた値はHttpServletRequestインスタンスに格納されており、request.getParameterを使って取り出します。

ただし、JSPにはサーブレットクラスと違って、doGetメソッドやdoPostメソッドを自分で書く必要がありません。それでもrequestを使えるのは、JSPには暗黙オブジェクトという特別な仕組みがあるためです。

この記事では、JSPでリクエストパラメータを取得する書き方と、requestを宣言せずに使える理由を、順番に確認していきます。

JSPファイルもフォームの送信先にできる

フォームの送信先には、サーブレットクラスだけでなくJSPファイルも指定できます。

サーブレットクラスに送信する場合は、action属性にサーブレットのURLパターンを指定します。一方、JSPファイルに送信する場合は、action属性にwebappからのパスを指定します。

送信先の指定方法

送信先action属性に指定する内容
サーブレットクラスURLパターン
JSPファイルwebappからのパス

たとえば、studyプロジェクトのsrc/main/webappにseminar-confirm.jspを作成した場合、フォームの送信先としてseminar-confirm.jspを指定できます。

この場合、送信ボタンをクリックすると、フォームに入力された値がリクエストパラメータとしてseminar-confirm.jspへ送られます。

JSPでリクエストパラメータを受け取る流れ

フォームからJSPファイルへ送信されたデータは、サーブレットクラスへ送信したときと同じように、HttpServletRequestインスタンスに格納されます。

JSPファイルでは、requestという名前でHttpServletRequestインスタンスを利用できます。そのため、次のような流れでリクエストパラメータを取得できます。

順番内容
1フォームに値を入力する
2送信ボタンをクリックする
3JSPファイルへリクエストが送られる
4リクエストパラメータがHttpServletRequestに格納される
5JSPファイル内でrequest.getParameterを使って値を取り出す

サーブレットクラスでは、doPostメソッドやdoGetメソッドの引数としてHttpServletRequest requestを受け取りました。

JSPファイルでは、requestを自分で宣言しなくても使えます。これはJSPに最初から用意されている暗黙オブジェクトだからです。

図1:フォームからJSPへリクエストパラメータを送る流れ

この図から分かること

フォームから送信されたデータは、リクエストパラメータとしてアプリケーションサーバへ送られます。

送信先がJSPファイルであっても、リクエストパラメータはHttpServletRequestインスタンスに格納されます。JSPファイルでは、requestという暗黙オブジェクトを使って、その値を取り出せます。

つまり、フォームの送信先がサーブレットクラスでもJSPファイルでも、リクエストパラメータを取得する基本的な考え方は同じです。

JSPでリクエストパラメータを取得する書き方

JSPファイルでは、スクリプトレットの中でrequest.getParameterを使ってリクエストパラメータを取得できます。

日本語を含むデータを正しく扱うために、まずrequest.setCharacterEncodingで文字コードを指定します。そのあと、request.getParameterで必要な値を取り出します。

JSPでリクエストパラメータを取得する基本形

処理役割
request.setCharacterEncoding("UTF-8")リクエストパラメータをUTF-8として扱う
request.getParameter("パラメータ名")指定した名前の値を取得する

大切なのは、getParameterに指定する名前です。

この名前は、フォーム部品のname属性の値と一致させます。フォーム側でname属性にuserNameを指定している場合、JSP側ではrequest.getParameter("userName")と書きます。

JSPで値を取得して表示する例

ここでは、セミナー申込フォームから送られてきた名前と参加コースを、JSPファイルで取得する例を見てみましょう。

送信されるリクエストパラメータは、userNameとcourseという想定にします。

セミナー申込確認JSPの例

ファイル名: seminar-confirm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String course = request.getParameter("course");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>セミナー申込確認</title>
</head>
<body>
<p><%= userName %>さんの申込内容を受け付けました。</p>
<p>参加コース:<%= course %></p>
</body>
</html>

このJSPファイルでは、最初にpageディレクティブで文字コードを指定しています。

次に、スクリプトレットの中でrequest.setCharacterEncoding("UTF-8")を実行し、リクエストパラメータをUTF-8として扱うようにしています。

そのあと、request.getParameter("userName")で名前を取得し、request.getParameter("course")で参加コースを取得しています。

HTMLのbodyタグ内では、スクリプト式を使ってuserNameとcourseの値を表示しています。

サーブレットクラスで取得するときと考え方は同じ

JSPファイルでリクエストパラメータを取得する書き方は、サーブレットクラスで取得するときとよく似ています。

どちらの場合も、HttpServletRequestのgetParameterを使います。

サーブレットとJSPの取得方法の比較

項目サーブレットクラスJSPファイル
値を持っているものHttpServletRequestHttpServletRequest
取得に使うメソッドrequest.getParameterrequest.getParameter
文字コード指定request.setCharacterEncodingrequest.setCharacterEncoding
requestの用意doGetやdoPostの引数で受け取る暗黙オブジェクトとして使える
doGetやdoPost必要JSPファイルには直接書かない

サーブレットクラスでは、doPostメソッドやdoGetメソッドの引数としてrequestを受け取ります。

JSPファイルでは、requestを宣言していないのに使えます。これは、JSPにあらかじめ用意されている暗黙オブジェクトだからです。

図2:サーブレットとJSPでのrequestの使い方の違い

この図から分かること

サーブレットクラスでもJSPファイルでも、リクエストパラメータはHttpServletRequestから取得します。

サーブレットクラスでは、doGetメソッドやdoPostメソッドの引数としてrequestを受け取ります。一方、JSPファイルでは、requestを宣言しなくてもそのまま使えます。

JSPのrequestは、暗黙オブジェクトとしてあらかじめ用意されています。そのため、スクリプトレットやスクリプト式の中で、すぐにrequest.getParameterを使えます。

暗黙オブジェクトとは

JSPには、暗黙オブジェクトという特別なオブジェクトがあります。

暗黙オブジェクトは、JSPファイルの中であらかじめ使えるように用意されているオブジェクトです。開発者が自分で宣言しなくても、スクリプトレットやスクリプト式の中で利用できます。

requestも、この暗黙オブジェクトの1つです。

そのため、JSPファイルの中では、次のようにrequestをそのまま使えます。

request.getParameter("userName")

サーブレットクラスのように、HttpServletRequest requestを自分で宣言しているわけではありません。JSPがサーブレットクラスへ変換される過程で、requestなどのオブジェクトが使えるように準備されている、と考えると分かりやすいです。

主な暗黙オブジェクト

JSPには、request以外にも複数の暗黙オブジェクトがあります。

オブジェクトの名前オブジェクトの型
pageContextjakarta.servlet.jsp.PageContext
requestjakarta.servlet.http.HttpServletRequest
responsejakarta.servlet.http.HttpServletResponse
sessionjakarta.servlet.http.HttpSession
applicationjakarta.servlet.ServletContext
outjakarta.servlet.jsp.JspWriter
configjakarta.servlet.ServletConfig
pagejava.lang.Object
exceptionjava.lang.Exception

たくさんありますが、最初からすべてを覚える必要はありません。

まずは、JSPには宣言しなくても使える特別なオブジェクトがあること、そしてリクエストパラメータを取得するときにはrequestを使うことを押さえておきましょう。

この先の学習では、request、session、applicationのようなオブジェクトを扱う場面が出てきます。現時点では、requestはフォームから送られてきた値を取り出すために使える、と理解しておけば十分です。

図3:JSPの暗黙オブジェクトrequest

この図から分かること

JSPファイルでは、requestなどの暗黙オブジェクトがあらかじめ用意されています。

そのため、スクリプトレットやスクリプト式の中で、requestを宣言せずに使えます。requestの中には、フォームから送られてきたリクエストパラメータが格納されています。

JSPでリクエストパラメータを取得できるのは、この暗黙オブジェクトrequestが利用できるためです。

request.getParameterを使うときの注意点

JSPでrequest.getParameterを使う場合も、サーブレットクラスで使う場合と同じ注意が必要です。

特に、フォーム部品のname属性とgetParameterに指定する名前が一致しているかを確認しましょう。

確認したいポイント

確認項目内容
フォーム側のname属性JSP側で取得したい名前と一致しているか
request.getParameterの引数name属性と同じ名前を指定しているか
文字コード指定getParameterより前にsetCharacterEncodingを実行しているか
大文字小文字userNameとusernameを混同していないか
送信先action属性がJSPファイルを指しているか

たとえば、フォーム側でname属性がuserNameなのに、JSP側でrequest.getParameter("name")と書くと、userNameの値は取得できません。

getParameterで指定した名前のリクエストパラメータが存在しない場合はnullが返されます。

JSPではdoGetやdoPostを書かない

サーブレットクラスでは、GETリクエストを処理する場合はdoGetメソッド、POSTリクエストを処理する場合はdoPostメソッドを作成しました。

一方、JSPファイルでは、通常の書き方としてdoGetメソッドやdoPostメソッドを自分で書くことはありません。

JSPファイルは、リクエストされるとアプリケーションサーバによってサーブレットクラスへ変換されます。その内部処理の中で、リクエストを受け取り、JSPに書かれた内容を実行します。

そのため、JSPファイルでは、スクリプトレットの中でrequestを使ってリクエストパラメータを取得できます。

サーブレットとJSPの書き方の違い

比較項目サーブレットJSP
作成するファイルJavaクラスを作成するJSPファイルを作成する
主な役割リクエストを受け取り、Javaで処理を行うHTMLを中心に画面を表示する
HTMLの書き方out.printlnを使ってHTMLを1行ずつ出力するHTMLをそのまま記述できる
Javaコードの書き方doGetメソッドやdoPostメソッドの中に処理を書くスクリプトレット内にJavaの処理を書く
リクエストパラメータの取得doGetまたはdoPostの引数で受け取ったrequestを使う暗黙オブジェクトのrequestをそのまま使う
requestの用意HttpServletRequest requestをメソッドの引数で受け取る宣言しなくてもrequestを利用できる
実行メソッドGETならdoGet、POSTならdoPostが実行されるJSPファイル内にdoGetやdoPostを直接書かない
URLの指定@WebServletで設定したURLパターンを指定するwebappからのパスとファイル名を指定する
画面作成のしやすさHTMLが多いとコードが長くなりやすいHTML中心なので画面構造を把握しやすい
向いている処理入力値の取得、判定、処理の振り分け処理結果の表示、HTML画面の作成

JSPではdoGetやdoPostを書かないため、フォームの値を取得する処理を短く書けます。

ただし、JSPで直接リクエストパラメータを取得する方法は、あくまで仕組みを理解するために紹介される書き方です。

JSPファイルでリクエストパラメータ値を取得しない考え方

ここまで、JSPファイルでリクエストパラメータを取得する方法を見てきました。

ただし、MVCモデルに沿った設計では、JSPファイルでリクエストパラメータを直接取得することは原則として行いません。

MVCモデルでは、リクエストパラメータの取得や処理はサーブレットなどが担当し、JSPは画面表示を担当する、という役割分担で考えます。

MVCモデルでの役割の考え方

役割担当する内容
サーブレットリクエストを受け取り、パラメータを取得し、処理を行う
JSP処理結果を表示する
request送信データや表示用データを受け渡すために使われる

今回の内容は、JSPでもrequest.getParameterを使えば値を取得できる、という仕組みを理解するためのものです。

実際の設計では、JSPに処理をたくさん書くのではなく、サーブレットとJSPの役割を分ける考え方が大切になります。

現時点では、JSPには暗黙オブジェクトがあり、requestを宣言せずに使えること、そしてJSPでもgetParameterでリクエストパラメータを取得できることを押さえておきましょう。