JSP: フォームからのデータ送信

ここでは、form要素を使用した単純なデータ送信と受信、および条件分岐による 異なった処理などを演習します。比較的、単純な仕組みですので、習得しやすい と思います。

form要素の基本

CGI (Common Gateway Interface) を使用する場合には、HTMLで使用され るform要素(タグ)は必要不可欠なものです。JSPでも、このform要素を送信側 のWebページ中に使用します。

form要素の基本は下記の通りです。

<form method="送信方法" action="送信先">

</form>

送信方法には、postまたは getが使われます。 また、 送信先には、処理を記述したファイル(JSPファイルや Perlなどで記述したCGIスクリプト)を明記します。

GETとPOSTの違い:

GET POST
データ送信方法 環境変数query_string(URLの引数)に格納※1 HTTPリクエストのボディに格納※2
データ取得方法 query_stringからデータを取得 標準入力からデータを取得
ただし、JSPではともにrequestオブジェクトで取出し可能

※1の例:
URL http://www.hoge.com/sample.jsp?name=Yamada&age=30

※2の例:
URL http://www.hoge.com/sample.jsp
データ部分(標準入力として送られる) name=Yamada&age=30

下記に、form要素の使用例を示します。

form要素の使用例: post形式で、birth.jspにデータを送信する命令
プルダウン形式のコンボボックスで1から12までの数字を選ばせて、送信させる 内容

<form method="post" action="birth.jsp">

<select name="birthMonth">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  <option value="6">6</option>
  <option value="7">7</option>
  <option value="8">8</option>
  <option value="9">9</option>
  <option value="10">10</option>
  <option value="11">11</option>
  <option value="12">12</option>
</select>

<input type="submit" value="送信" />

</form>

上記では、selectという要素を利用してプルダウン形式のコンボボックスを 表示させていましたが、他にもいくつかの形式があり、目的に応じて使い分けら れています。

上記のように種々の要素がありますが、下記ではコンボボックスを使用した 例を中心に演習していきます。

単純なデータ送信

下の例では、誕生月を入力、送信させ、その月を表示させるだけの処理を 行っています。HTMLファイルのbirth1.html、 JSPファイルのbirth1.jspの両者をSun ONE上で作成し、 Sun ONEで指定したフォルダ内に保存しましょう。 保存できたら、JSPファイルのコンパイル、 HTMLファイルの実行を行って、動作確認してみましょう。

birth1.html※formをfromと入力間違いしないように

<html>

<head>
<title>誕生月の送信</title>
</head>

<body>

<p>
あなたの誕生月を入力してください。
</p>

<form method="post" action="birth1.jsp">

<select name="birthMonth">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  <option value="6">6</option>
  <option value="7">7</option>
  <option value="8">8</option>
  <option value="9">9</option>
  <option value="10">10</option>
  <option value="11">11</option>
  <option value="12">12</option>
</select>
<input type="submit" value="送信" />

</form>
</body>
</html>

birth1.jsp

<%@ page contentType="text/html;charset=Shift_JIS" %>
<html>
<head>
<title>誕生月の送信結果</title>
</head>
<body>

<%
  String strAns = request.getParameter("birthMonth");
  out.println("誕生月は" + strAns + "月ですね");
%>

</body>
</html>

birth1.jspでは、送信されてきたデータ名(birthMonth)を利用してデータの値を 取り出すのに、requestクラスのgetParameterメソッド であるrequest.getParameterを利用しています。

またJSPでは、送信されたデータは数字であっても文字列 として取り扱われています。したがって、文字列の変数であるstrAnsを宣言して 利用しています。

JSPで使えるタグ

タグ 名前 内容
<%@ 〜 %> ディレクティブ JSPへの指令を記述する(pageを用いたコンテンツの種類や文字コードの指定など)
<%! 〜 %> 宣言部 変数やメソッドなどの宣言を行う
<% 〜 %> スクリプトレット(Javaプログラム) Javaプログラムとして解釈される
<%-- 〜 --%> JSPのコメント 中の記述はWebブラウザには送信されない

JSPで使える組み込みオブジェクト

特に明示しなくても無条件で使用できるJavaオブジェクトのことで、 下記にはその一部を紹介しています。 組み込みオブジェクトは暗黙オブジェクトともいわれます。

オブジェクト名 内容
out JSPの処理結果をWebブラウザに送信する
request WebクライアントからのWebページリクエスト要求に記述されている 情報にアクセスする
response JSPからの出力のうち、HTTPへッダの処理を行う
session セッション(複数のページにまたがる一連の処理)を管理する
application JSPアプリケーションの操作を行う
exception 例外処理をコントロールする

課題1:

上記の例では、単に誕生月を送信するだけだが、 誕生日も送信して表示させるようなHTML、JSPファイルを、 birth2.html, birth2.jspという名前で作成せよ。

if文による条件分岐

今度は、今日の日付と比較して、送信された誕生月が既に過ぎたか、まだか、 または今月なのかを判定させます。他のプログラミング言語と同様に、 if文を使用します。

今日の日付を取得するために、Calendarというクラスを利用して、インスタンス (オブジェクト)を生成しています。そのために、 「import="java.util.*"」のように、 java.utilパッケージをimportしています。

下記の内容を、birth3.jspという名前で作成してください。 また、birth1.htmlをコピーして birth3.htmlを作成しますが、 「action="birth1.jsp"」の箇所を 「action="birth3.jsp"」のように 修正してください。

birth3.jsp

<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<html>
<head>
<title>誕生月の送信結果</title>
</head>
<body>

<%
  // カレンダークラスのインスタンスの生成
  Calendar cal = Calendar.getInstance();

  // 今日の日付を変数に代入
  int todayYear = cal.get(Calendar.YEAR);
  int todayMonth = cal.get(Calendar.MONTH) + 1;
  int todayDay = cal.get(Calendar.DATE);
  
  // 誕生月を変数に代入
  int birthMonth = Integer.parseInt(request.getParameter("birthMonth"));
%>

今月は<%=todayMonth%>月<br />
誕生月は<%=birthMonth%>月<br />

<%
  // 誕生月が過ぎたかどうかの判定
  if (birthMonth == todayMonth) {
    out.println("今年の誕生月は今月ですね");

  } else if (birthMonth < todayMonth) {
    out.println("今年の誕生月は過ぎましたね");

  } else {
    out.println("今年の誕生月はまだですね");
  }

%>

</body>
</html>

上記の記述の中で、 「int todayMonth = cal.get(Calendar.MONTH) + 1;」 とありましたが、CalendarクラスのMONTHメソッドは、 0〜11の値を取るので+1の処理が必要になります。 下記には、Calendarクラスの他のメソッドを紹介しますので、必要に応じて 使ってみてください。

メソッド 内容
Calendar.YEAR
Calendar.MONTH 月(0〜11)
Calendar.DATE
Calendar.DAY_OF_WEEK 曜日(1〜7)
Calendar.HOUR 時(0〜11)
Calendar.HOUR_OF_DAY 時(0〜23)
Calendar.MINUTE
Calendar.SECOND
Calendar.MILLISECOND ミリ秒

課題2:

上記の例では、単に誕生月を送信するだけだが、 誕生日も送信して判定させるようなHTML、JSPファイルを、 birth4.html, birth4.jspという名前で作成せよ。

複数の条件を列挙するときには、

のように記述する。

課題3:

上記の例では、今年の誕生日を判定していたが、 今年度の誕生日が過ぎたかどうかを判定させるような HTML、JSPファイルを、 birth5.html, birth5.jspという名前で作成せよ。 出力結果も「今年度の誕生日は過ぎましたね」のように、「今年度」の 表示に修正せよ。

注:「今年度」とは4月1日から翌年の3月31日までの期間を指し、例えば2003年 度とは2003年4月1日から2004年3月31日までの期間のことである。


[JSPのページ] [環境情報システム論のページ]
須崎純一 京都大学大学 工学研究科都市環境工学専攻 環境情報学講座