【Java】サーブレットを使ったクエリパラメータの取得

クエリパラメータの取得方法_アイキャッチ画像 Java

(2020年8月8日に更新した記事です。)

「クエリ文字列ってどうやって使うの?」

「クエリパラメータって何?クエリ文字列とは違うの?」

「サーブレットの使い道は?」

という方のために、サーブレットを使ったクエリパラメータの取得方法を解説します。

ちなみに、サーブレットを使わなくてもクエリパラメータから情報を取得することができます。

そちらの方法も知りたい方は以下の記事を参考にしてください。

クエリパラメータとは?

クエリパラメータとは、URLに付加された「?」以降の文字列のことです。

つまり、クエリ文字列と意味は同じです。

他にも様々な呼び方があるので、私が知っている限りで、同じ意味で使われている用語をリストアップしておきます。

  • クエリパラメータ
  • クエリストリング
  • URLパラメータ
  • URLクエリパラメータ

これらの用語が出てきたら、URLの「?」以降の「文字列」のことだと思ってください。

今回の記事では「クエリパラメータ」と書きます。

クエリパラメータの取得方法

サーブレットでURLに付加されたクエリパラメータを取得する方法を解説します。

実際のプログラムを元に解説していきます。

プログラムの流れは以下の通りです。

1.(htmlファイル)「名前」と「年齢」を入力

2.(htmlファイル)入力情報をURLに付加

3.(サーブレット)クエリパラメータを元に情報を取得

4.(サーブレット)入力された「名前」と「年齢」を出力


以下が、実際の実行結果です。

実行結果

入力画面(Sample.html)


出力画面(SampleServlet.java)


それでは実際にコードを見ていきましょう。

まず初めに、入力画面を作っているhtmlファイルの中身です。

htmlファイル(Sample.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sample</title>
</head>
<body>
<!-- action属性にサーブレット名、method属性にgetを指定 -->
<form action="SampleServlet" method="get"> 
<p>名前:
<input type="text" name="Name"></p> <!-- name属性にクエリパラメータの変数名を指定 -->
<p>年齢:
<input type="number" name="Age"></p> <!-- name属性にクエリパラメータの変数名を指定 -->
<input type="submit" value="送信">
</form>
</body>
</html>


注目するべきは、9行目のformタブ11、13行目のinputタブです。

9行目のformタブ

action属性に自分が使用するサーブレット名を指定することで、送信ボタン(14行目)が押されたら指定したサーブレットが呼び出されます。

また、method属性getpostの2種類あります。

今回は解説の都合上getにしていますが、基本的にはpostが使われることが多いです。

getとpostの違いはサーブレット後ほど解説します。

11、13行目のinputタブ

name属性クエリパラメータの変数名を指定しています。

クエリパラメータの変数名というのは、「?〇〇 = ××」の「○○」の部分です。

「××」の部分には入力された値が入ります。

この例では「?Name = 入力された名前」のようになります。

変数名はなんでも良いですが、どんな値を入れているか分かる変数名にしましょう。



続いて、サーブレットの中身です。

先ほどのhtmlのformタブで、method属性を「get」にしたため、サーブレットの処理はdoGetメソッドの中に書いていきます。(postの場合はdoPostメソッド)

サーブレット(SampleServlet.java)
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/SampleServlet")
public class SampleServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

     //入力情報の文字コード指定
		request.setCharacterEncoding("UTF-8");

     //ブラウザへ渡す文字コード指定
		response.setContentType("text/html; charset=UTF-8"); 

        //クエリパラメータから情報を取得
		String name = request.getParameter("Name");
		String age = request.getParameter("Age");

		PrintWriter out = response.getWriter();

        //htmlを出力
		out.println("<html>");
		out.println("<head>");
		out.println("</head>");
		out.println("<body>");
		out.println("<p>名前は");
		out.println(name);
		out.println("</p>");
		out.println("<p>年齢は");
		out.println(age);
		out.println("歳</p>");

	}

}

ここでは、18行目24、25行目に注目してください。

18行目:request.setCharacterEncoding(“UTF-8”);

この行では、クエリパラメータから値を取得する時の文字コードを指定しています。

と言っても、なんのことやらよく分からないと思うので実行結果を見てみましょう。

ここでURLのクエリパラメータの部分(?以降の部分)に注目してください。

本来であれば、「?Name = 山田太郎」と表示されるはずが、「山田太郎」の部分が何やら謎の文字列になっていますね。

これは、「山田太郎」という文字列を文字コードそのままで表記したものです。

文字コードというのは、コンピュータが理解できるように、仮名文字や漢字を英数字や記号で表したものです。
(例えば「あ」の文字コードはUTF-8では「A4A2」と表される)

文字コードには様々な種類があり、「UTF-8」も文字コードの1つです。

クエリパラメータから値を取得するには、この謎の文字列を「山田太郎」に変換しなければなりません。

そこで、この謎の文字列はどの文字コードを使って変換するか指定しているのがこの行で行っていることです。

この1文を記述しないと、文字化けを起こすので、必ず書きましょう。

24、25行目:request.getParameter(“変数名”);

この行で、クエリパラメータから値を取得しています。

request.getParameter(“変数名”)とすることで、クエリパラメータの指定された変数の値を返してくれます。

今回の例では、「名前」の変数名は「Name」、「年齢」の変数名は「Age」です。
(これは、先ほどのhtmlファイルのinputタブで設定)

そのため、引数に「Name」を指定すると、「Name」の値「山田太郎」が返されます。

GETとPOSTの違い

GETとPOSTは通信における決まり事(ルール)の一部です。

実際に使った時の違いを見てみましょう。

GET
POST


URLに注目してください。

GETメソッドではクエリパラメータ(入力情報)がそのまま表示されていますが、

POSTメソッドではサーブレット名しか表示されていません

これが、GETとPOSTの違いです。

パスワードや住所などの個人情報をやり取りする時に、URLにそれらの情報が表示されるのはまずいですよね?

なので、そのような時には、POSTメソッドを使い、URLにクエリパラメータを表示しないようにするのです。

まとめ

クエリパラメータとは?
 ・URLの「?」以降の文字列
 ・クエリ文字列、クエリストリングなどいろいろな呼び方がある

クエリパラメータの取得方法
 <html>
  ・formタブのaction属性はサーブレット名、method属性はgetかpost
  ・inputタブのname属性にクエリパラメータの変数名を指定
 <サーブレット>
  ・request.setCharacterEncoding(“文字コード”)で入力情報の文字コードを指定
  ・request.getParameter(“変数名”)でクエリパラメータの値を取得

GETとPOSTの違い
 ・GETはクエリパラメータをURLに表示する
 ・POSTはクエリパラメータをURLに表示しない

コメント

タイトルとURLをコピーしました