【Java Web入門 #3】パラメーターの利用|送信された値をサーブレットで利用する
2024.12.20
Webアプリケーションが求められる動作を行うためには、検索キーワードや入力フォームなど、利用したい機能に応じた情報が必要です。
今回の記事では、Javaのサーブレット上でWebブラウザーから送られる情報(パラメーター)を利用する方法について解説します。
目次
リクエストパラメーターとは
Webブラウザ上でWebアプリケーションにアクセスする際には、サーバーにあるWebアプリケーションに対してパラメーターを送信することができます。
検索キーワードや、会員登録のための情報など、Webアプリケーションに何らかの要求(リクエスト)を行う際に送るこのパラメーターは「リクエストパラメーター」と呼ばれます。
Javaのサーブレットでも、Webブラウザーから送信されたリクエストパラメーターを受け取りプログラム内で利用することで、要求に応じた様々な動作を行うことが可能となります。
GETメソッドとPOSTメソッド
HTTPメソッドとは
WebブラウザーなどのソフトからWebアプリケーションに要求(リクエスト)を送信する場合、「何をしたいのか」を伝えるための「HTTPメソッド」と呼ばれる仕組みがあります。
ここでは、Webブラウザー上でWebアプリケーションを利用するために用いる主なHTTPメソッドである「GETメソッド」と「POSTメソッド」について簡単に説明します。
GETメソッド
GETメソッドは、Webページやデータを『取得する』ための最も基本的なHTTPメソッドです。ブックマークからアクセスする場合や、URLをWebブラウザのアドレスバーに直接入力してアクセスする場合などでは、このGETメソッドによってサーバーへリクエストが送信されます。
英単語の「GET」にはいろいろな意味がありますが、GETメソッドについては「(許可・返事などを)もらう」「得る」という意味がイメージとして一番近いと思います。
GETメソッドでリクエストを送信した場合は、受け取ったサーブレットクラスでは「doGet」メソッドが呼び出されます。
GETメソッドでのパラメーター送信(クエリストリング・クエリ文字列)
GETメソッドでパラメーターを送信する基本的な方法は、URLの後ろにパラメーターを指定する文字列(クエリストリング、またはクエリ文字列)を利用する方法です。
クエリストリングはURLに続けて以下の記法で記述します。
- URLの直後に1回だけ「?」を記述する
- 「?」以降に、「パラメーター名=パラメーター値」の形式で記述する
- 複数個のパラメーターを送信する場合は「&」を挟み、再度「パラメーター名=パラメーター値」の形式で記述する
例) http://localhost:8080/WebPractice/TaxCalculator?price=1000&taxRate=8
クエリストリングで送信するパラメーターは、検索キーワードや、ショッピングサイトの商品コードなどが挙げられます。パラメーターをURLの文字列と一緒に送信するため、ブックマークやリンクの共有などからWebブラウザからアクセスした際でも、同じ結果を取得することができます。
例えば以下のURLでは、誰がアクセスしてもGoogleで「Java」を検索した結果が表示されます。
(”q=Java”の部分がクエリストリングです)
https://www.google.co.jp/search?q=Java
POSTメソッド
GETメソッドがデータを『取得する』ための要求なのに対し、POSTメソッドは情報をサーバーに『送信する』ために使用されるHTTPメソッドです。ユーザー登録のための情報を画面で入力して送信する場合や、SNSへの投稿、ファイルをアップロードする場合などに利用されます。
GETメソッドとの違いとして、送信されるパラメーターはサーバーへ送信するリクエストの本体(リクエストボディ)に格納されます。
「得る」のがGETメソッドの意味であるのに対し、英単語の「POST」の訳としては、「投函する」「知らせる」という意味がありますので、大まかなイメージとしてGETメソッドでは宛先に情報が含まれ、POSTメソッドでは封書の中に情報が入っている、と考えるとわかりやすいかもしれません。
POSTメソッドでリクエストを送信した場合は、受け取ったサーブレットクラスでは「doPost」メソッドが呼び出されます。
HTMLフォーム
POSTメソッドでパラメーターを送信する一般的な方法は、HTMLフォーム(form)を用いてリクエストを送信することです。
以下のHTMLでは、form内に定義された「price」と「taxRate」について、Webブラウザーの画面上で入力した値をPOSTメソッドで送信することができます。(formや各入力項目などの詳細については次回以降の記事で説明しますので、ここでは割愛します)
<html>
<head>
<title>税額計算</title>
<meta http-equiv="Content-Type" Content="text/html;charset=UTF-8"/>
</head>
<body>
<form action="../TaxCalculator" method="post">
<div>
税抜価格:<input type="text" name="price" style="width: 100px; text-align: right;"/> 円
</div>
<div>
消費税率:<input type="text" name="taxRate" style="width: 100px; text-align: right;"/> %
</div>
<input type="submit" value="計算する">
</form>
</body>
</html>
静的HTMLを配備する
実際のWebシステムでは、上記のような静的なHTMLファイルはWebアプリケーションの外に配備することが多いと思われますが、今回のような学習時などは、Webアプリケーションの中に配備してWebブラウザからアクセスすることも可能です。
Webアプリケーション内に静的なファイルを配備する場合は、「webapp」フォルダに配備します。今回は「webapp」フォルダ内に「html」フォルダを作成して、「taxform.html」という名前で保存しました。
Webブラウザでこのファイルにアクセスするには「/アプリケーション名/html/taxform.html」にアクセスします。
当記事で作成しているWebアプリケーション(WebPractice)の場合、以下のURLにアクセスします。
http://localhost:8080/WebPractice/html/taxform.html
サーブレットでのパラメーターの利用
HttpServletRequestインターフェイス
Javaのサーブレットでは、GETメソッドのリクエスト時に実行される「doGet」メソッド、POSTメソッドのリクエスト時に実行される「doPost」メソッドなどの引数に「HttpServletRequest」の引数が準備されています。
Jakarta EE Platform v10.0.0 - APIドキュメント(HttpServletRequest)
サーブレットコンテナはクエストパラメーターの情報をこの引数のインスタンス内に格納した上で、サーブレットの処理を呼び出します。各サーブレットのプログラム上では、この引数からリクエストパラメーターを取得して、処理に利用することが可能です。
getParameterメソッド
サーブレット内でリクエストパラメーターを取得するには、HttpServletRequestの「getParameter」メソッドを利用します。GETメソッド、POSTメソッドのどちらで送信した場合でも、このメソッドでパラメーターの値を取得することができます。
以下のサンプルコードは、Web入門 #1の記事でサンプルとして提示した税込価格の計算サーブレットに、チェック処理など少し手を加えたものです。
(アノテーションでURLを指定(/TaxCalculator)していますので、web.xmlでサーブレットマッピングが記述されている場合はアノテーションを削除するか、web.xml側の定義をコメントアウトしてください)
import java.io.IOException;
import java.io.PrintWriter;
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(urlPatterns = {"/TaxCalculator"})
public class TaxCalculatorServlet extends HttpServlet {
// GETメソッドでのリクエスト時処理
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// リクエストパラメータを取得
String priceStr = request.getParameter("price");
String taxRateStr = request.getParameter("taxRate");
// 文字列を数値に変換
int price = 0;
double taxRate = 0;
String errMsg = null;
try {
price = Integer.parseInt(priceStr);
taxRate = Double.parseDouble(taxRateStr);
} catch(Exception e) {
// 数値に変換失敗した場合はエラーメッセージを設定
price = 0;
taxRate = 0;
errMsg = "価格(price)と消費税率(taxRate)を数値で指定してください。";
}
// 税込金額を計算(小数点以下切り捨て)
int taxIncludedPrice = (int) Math.floor(price * (1 + taxRate / 100));
// 結果をHTMLで表示
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>税込価格計算</title></head>");
out.println("<body>");
// パラメーターエラーの場合は先頭にエラーメッセージを表示
if( errMsg != null ) {
out.println("<p style=\"color: red;\">" + errMsg + "</p>");
}
out.println("<p>税抜価格:" + price + "円</p>");
out.println("<p>消費税率:" + taxRate + "%</p>");
out.println("<h2>税込価格は" + taxIncludedPrice + "円です。</h2>");
out.println("</body>");
out.println("</html>");
}
// POSTメソッドでのリクエスト時処理
protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// doGetと同じ処理を行う
doGet(request, response);
}
}
上記のコードでは、28行目、29行目のコードで受信したパラメーターの値を変数に格納しています。
リクエストパラメーターは、パラメーターにつけられた名前(文字列)を指定して取得することができます。
// リクエストパラメータを取得
String priceStr = request.getParameter("price");
String taxRateStr = request.getParameter("taxRate");
このとき、指定した名前のパラメーターが送信されていなかった(リクエストに含まれていなかった)場合は、取得される値はnullとなります。また、パラメーターで数値を送信した場合も、getParameterメソッドで取得する際は文字列として取得されることに注意してください。
以下のURLにアクセスして上記のサーブレットを実行してみると、パラメーターの値で計算が行われていることがわかります。
http://localhost:8080/WebPractice/TaxCalculator?price=1000&taxRate=8
(priceの値「1000」とtaxRateの値「8」は任意の数値に置き換えることが可能です)
パラメーターと型の変換
getParameterメソッドで取得したパラメーターの値を数値型として利用したい場合などは、Integer.parseIntメソッドなどを利用して、値をサーブレットのプログラム側で変換する必要があります。
Integer.parseIntなどのメソッドを利用する場合は、対象のパラメーターがnullや数値に変換できない文字列だった際には外が発生しますので注意が必要です。
// 文字列を数値に変換
price = Integer.parseInt(priceStr);
taxRate = Double.parseDouble(taxRateStr) / 100;
実際のウェブサイトや業務システムなどの開発時には、このようなパラメーターに対しての入力チェックや、入力エラー時の動作(例えば、エラー表示をして再入力を促したり、値が送信されなかった場合はアプリケーションのデフォルト値として扱うなど)を決めて実装されることになります。
このサンプルコードでは、パラメーターを数値に変換する際にエラーが発生した場合、エラーメッセージを表示して0円として表示するようにしています。業務システムなどでは、さらに数値が0以上かのチェックを行ったり、もっと細かくエラーメッセージを設定するなどの実装が想定されます。
} catch(Exception e) {
// 数値に変換失敗した場合はエラーメッセージを設定
price = 0;
taxRate = 0;
errMsg = "価格(price)と消費税率(taxRate)を数値で指定してください。";
}
...(中略)...
// パラメーターエラーの場合は先頭にエラーメッセージを表示
if( errMsg != null ) {
out.println("<p style=\"color: red;\">" + errMsg + "</p>");
}
下図の例では、税率(taxRate)のパラメーター値を「abc」としたため、エラーメッセージが画面上に表示されています。
日本語パラメーターは文字コードに注意
パラメーターとして送る文字列が日本語の場合、ブラウザ上に表示するHTMLの文字コードと、サーブレットを実行するJava環境の文字コードに注意が必要です。
特に設定を変更しない場合、Javaのデフォルトエンコーディング(文字コード)は「utf-8」ですので、Webブラウザとの日本語の入出力についても「utf-8」で行う必要があり、この文字コードが異なると、いわゆる「文字化け」が発生します。
HTML上では、metaタグと呼ばれるタグを利用して、Webブラウザ上に表示する際の文字コードを指定することができます。
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html;charset=UTF-8"/>
...
また、Javaサーブレットから返すレスポンスをWebブラウザ上に表示する場合は、HttpServletResponseのsetContentTypeメソッドを利用して指定することができます。
上記のサンプルコードでは以下の部分(41行目)で指定しています。
// 結果をHTMLで表示
response.setContentType("text/html;charset=UTF-8");
Windowsではデフォルトの文字コードが「Windows-31J(※)」のため、この行を削除した場合は下図のように文字化けしてしまう場合があります。
(※「Shift_JIS」を拡張した文字コード。Javaでは「ms932」とも呼ばれます)
いかがでしたでしょうか。今回の記事ではサーブレットでのリクエストパラメーターの利用について、駆け足で説明しました。
今後、フレームワークと呼ばれるWebアプリケーションを作成するためのライブラリなどについても解説する予定ですが、サーブレットの根本を理解しているほうがフレームワークの便利さや安全性などが良くわかりますので、基本的なサーブレットの動作として覚えておいてくださいね。