ここでは、form要素を使用した単純なデータ送信と受信、および条件分岐による 異なった処理などを演習します。比較的、単純な仕組みですので、習得しやすい と思います。
CGI (Common Gateway Interface) を使用する場合には、HTMLで使用され るform要素(タグ)は必要不可欠なものです。JSPでも、このform要素を送信側 のWebページ中に使用します。
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という要素を利用してプルダウン形式のコンボボックスを 表示させていましたが、他にもいくつかの形式があり、目的に応じて使い分けら れています。
使用例:
<select name="birthMonth"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select>
Webブラウザ上での表示:
使用例:あらかじめ「3年生」にチェックをつけるように設定
Webブラウザ上での表示:
使用例:あらかじめ「自然環境コース」にチェックをつけるように設定
<input type="checkbox" name="soft" value="1" />ソフトウェアコース <input type="checkbox" name="natural" value="1" checked="checked"/> 自然環境コース <input type="checkbox" name="business" value="1" />ビジネス環境コース
Webブラウザ上での表示:
使用例:最大入力長を示すmaxlength属性はなくても支障はない
Webブラウザ上での表示:
使用例:
Webブラウザ上での表示:
使用例:
Webブラウザ上での表示:
上記のように種々の要素がありますが、下記ではコンボボックスを使用した 例を中心に演習していきます。
下の例では、誕生月を入力、送信させ、その月を表示させるだけの処理を 行っています。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文を使用します。
今日の日付を取得するために、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日までの期間のことである。