...

講義プリント

by user

on
Category: Documents
4

views

Report

Comments

Transcript

講義プリント
ネットワークプログラミング論 平成 28 年 11 月 14 日
第6章.入力パラメータの受け取り
【学習のねらい】
① クライアント(Web ブラウザ)からの入力パラメータ(データ)をサーブレットで受
け取る仕組みを理解する。
② 様々なフォームからの入力パラメータの受け取り方法に習熟する。
<先週の復習>
講義で示された【基礎課題 6-1】に解答して下さい。
6-1.入力パラメータの受け取り方(テキストボックスの利用)
まず、次の様な Web アプリケーションを作ってみましょう。JSP に接続すると、次の入
力フォームを持った画面が現れます。
ここで、次の様に入力欄(テキストボックス内)に自分の名前を入力し、
[送信]ボタンを
クリックします。
すると、次の様に入力した名前を用いたメッセージが表示された画面にジャンプします。
67
ネットワークプログラミング論 平成 28 年 11 月 14 日
次の手順にしたがって、この動作を実現する JSP とサーブレットを(Eclipse を用いて)
作成しましょう。Eclipse を起動してください。
① 先週作成した「WebAppli」内に「input」という
フォルダーを新規作成します。
「WebAppli」を右
ボタンクリックし、
「新規」→「フォルダー」と
選択してください。
② この「input」内に入力パラメータ(今の場合「名
前」)を受け取る JSP ファイルを作成します。今
新規作成
度は「input」を右ボタンクリックして「新規」
この中に JSP
→「ファイル」と選択します。
を作成
③ ファイル名を「input.jsp」として、JSP ファイル
を新規作成します。
④ エディタ画面に戻るので、input.jsp を次の様に記述します。入力フォームを指定して
いますが、その解説は p.70 で行います。
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<input.jsp>
<BODY>
<H2>テキストボックスからの入力</H2>
入力フォームの指定
<FORM ACTION="../InputServlet">
<INPUT TYPE="TEXT" NAME="Shimei">
<INPUT TYPE="SUBMIT" VALUE=”送信”>
</FORM>
</BODY>
</HTML>
⑤ 次にこの入力パラメータ(今の場合“名前”)を受け取るサーブレットを記述します。
先週行った要領(p.61)で「WEB-INF/src」内に「InputServlet.java」を新規作成し
ます(新規クラスの作成です)
。その際パッケージ名を「input」と指定してください。
⑥ サーブレットの内容は次ページのように記述してください。入力パラメータの受け取
りは下線で示した次の部分で行っています。ポイントは以下の通りです。
String Shimei=request.getParameter("Shimei");

ブラウザから入力した入力パラメータは request オブジェクトに記録されている。

その値は、getParameter(“入力パラメータ名”)メソッドにより受け取ることが
できる。なお、入力パラメータは文字列(String)型となる。

入力パラメータ名は、上の JSP 入力フォームで「NAME="Shimei"」と指定され
ているので、
「Shimei」となる。
68
ネットワークプログラミング論 平成 28 年 11 月 14 日
<InputServlet.java>
package input;
import java.io.IOException;
import java.io.PrintWriter;
import
import
import
import
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
public class InputServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String Shimei=request.getParameter("Shimei");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("Welcome! Mr."+Shimei);
}
}
⑦ 最後に、
「web.xml」を記述します。先週すでに「WebAppli」の「WEB-INF」内に「web.xml」
を作成しているはずです(p.63)。その「web.xml」に次の様に「InputServlet」に関
連した部分を書き加えます。
<web.xml>
<web-app>
InputServlet 関連部分のみ
・・・
示している。
<servlet>
<servlet-name>InputServlet</servlet-name>
<servlet-class>input.InputServlet</servlet-class>
</servlet>
・・・
<servlet-mapping>
<servlet-name>InputServlet</servlet-name>
<url-pattern>/InputServlet</url-pattern>
</servlet-mapping>
</web-app>
⑧ これで Tomcat を起動すると p.67 で説明した通り動作するはずです。これを確認して
ください。URL は「http://localhost:8080/WebAppli/input/input.jsp」です。
69
ネットワークプログラミング論 平成 28 年 11 月 14 日
【基礎課題 6-2】
p.67 の通りきちんと動作することを確認したら、
「正常に表示されました。
」と記述して
提出して下さい。なお、次の課題に進む前に以下の【解説】および【補足】を読んでくだ
さい。
【解説】-入力フォームについて
p.68 の JSP の中で次のように入力フォームを指定しています。この書式は HTML 文に関
する事項ですが、重要な事項なので簡単に解説しておきます。
<FORM ACTION="../InputServlet">
①
②
<INPUT TYPE="TEXT" NAME="Shimei">
③
<INPUT TYPE="SUBMIT" VALUE=”送信”> ④
</FORM>
① <FORM>~</FORM>で入力フォームを指定します。
② ACTION="../InputServlet" で指定しているのは、
[送信]ボタンがクリックされ
たときに処理が移るプログラムの場所です。これにより、プログラムによる処理が行
われるようになります。ポイントは次の通りです。
 今の場合、処理内容は「InputServlet.class」に記述されています。
 そして、InputServlet.class は web.xml により、Web アプリケーションのル
ートディレクトリ(今の場合「WebAppli」
)から「/InputServlet」というパス
で到達できるよう指定されています。つまり「WebAppli/InputServlet」がプロ
グラムの場所となります。
 一方 JSP ファイルは「input」内に作成しましたから、Web アプリケーションのル
ートディレクトリ(WebAppli)に戻るためには「../」を指定しなければなりませ
ん(p.10)
。そこで、JSP の置かれている場所を起点とすると、
「../InputServlet」
が、
「WebAppli/InputServlet」に等しくなる訳です。
③ ここでは、入力フォームとしてテキストボックスを指定しています。その際、
「NAME="Shimei"」の形で、テキストボックス内に入力した文字列に「Shimei」と
いう名前を指定しています。Java 言語的に考えると、これは String 型の変数
「Shimei」
を定義したと考えて結構です。これにより、p.68 で説明した通り、サーブレット側で
入力パラメータの値を受け取ることができる訳です。
④ ここでは、入力パラメータを送信するボタンを定義しています。
以上より、④で定義した[送信]ボタンをクリックすると、③で定義した入力フォーム
に指定した値を、②で指定したプログラムに引き渡すことができるようになります。これ
が入力パラメータ受け渡しの仕組みです。
70
ネットワークプログラミング論 平成 28 年 11 月 14 日
【補足】-GET メソッドについて
① これまで学習してきたように、p.69 のサーブレット「InputServlet.java」内には
doGet()メソッドを定義しています。
② そして、p.68 で説明した通り、入力フォームに指定した値を受け取る際には、次のよ
うに記述します。
String Shimei=request.getParameter("Shimei");
③ このとき、入力フォームで[送信]ボタンをクリックしてサーブレットにジャンプし
た際にブラウザの URL を見ると、次の様になっている事に気付いたと思います。
④ サーブレットのアドレスの後ろに「?Shimei=Morita」
(Morita の部分は入力した名前)
がついています。実は、この部分は入力パラメータである「Shimei」の値(今の場合
「Morita」
)を指定しているのです。
⑤ このように、テキストボックスに入力した値は、URL の後ろにくっつけられます。そ
して、doGet()メソッドでは、
「?」マーク以下を読み取って、入力パラメータを受け
取っているのです。
⑥ ですから、③のように直接 URL を打ち込めば、「?Shimei=・・・」の「・・・」に指定
した値をサーブレットが読み取って表示します。各自これを確認してください。
6-2.日本語の入力パラメータの受け取り方
前節で作成した JSP に接続して、入力文字列を日本語にした場合・・・
正しく表示されません。
71
ネットワークプログラミング論 平成 28 年 11 月 14 日
これは、ブラウザからのリクエストで使用されている文字コードがデフォルトで欧米文
字コードになっており、日本語文字に対応していないからです。この事情は 3-1 節で説明し
たことと同じです(3-1 節ではブラウザに返すレスポンスの文字コードの指定でした)。そ
こでサーブレット「InputServlet.java」に次の枠線部を加えてください。このように request
に対しては、setCharacterEndoding()というメソッドがあり、これにより使用する文
字コードを指定します。
<InputServlet.java>
package input;
・・・
public class InputServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
String Shimei=request.getParameter("Shimei");
・・・
}
}
ただ、これだけでは十分ではありません。p.71 の補足で説明したとおり、今の場合(GET
メソッドを用いた場合)
入力文字列は URL アドレスの後にくっつけられます。
一方、
Tomcat
は URL アドレスの文字コードを欧米文字対応の ISO8859-1 に固定しているため、この設
定を変更しない限り日本語文字の受け取りができないのです。その設定は「server.xml」と
いうファイルで変更できます。Tomcat のルートディレクトリ(Tomcat 8.0)から「conf」
→「server.xml」とたどって「server.xml」をエディタで開いてください。そして、70 行
目付近以下にある次の部分に枠線部を加えてください。
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<server.xml>
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI=”true” />
これで、日本文字の受け取りが可能になります。変更後 Tomcat を再起動した上で、もう一
度 JSP から氏名を入力してください。今度は次の様に、日本語名で表示されるはずです。
72
ネットワークプログラミング論 平成 28 年 11 月 14 日
【基礎課題 6-3】
名前を入力すると、表示が次の様になるように、InputServlet.java を修正してください。
修正したら、結果を表示したブラウザ画面のハードコピーをとり、それを「Kiso6_3.gif」
という名称で保管して提出してください。
6-3.GET メソッドと POST メソッド
第 1 章で学習した通り、ブラウザとサーバとのやりとりは、ブラウザからサーバへ処理
を要求するリクエストと、サーバからブラウザへ結果を返すレスポンスからなります。こ
の内、リクエストの代表的なメソッドとして GET メソッドと POST メソッドがあります。
これらは HTTP リクエストメソッドと呼ばれるものの一つで、いずれもブラウザからデー
タをサーバへ送る際に用いられます。前節で学習したのは GET メソッドであり、これを用
いた場合、URL 末尾にデータをくっつけて渡しますが、例えばパスワードを入力した場合
など、URL 欄に明示的に表示されては困る場合もあります。そのような場合、URL を経ず
にデータを直接サーバに渡す POST メソッドを利用します。本節では、これらの使用方法
を確認しておきましょう。
作成するのは、次の様な
入力フォームから GET
メソッドあるいは POST
メソッドのいずれかを用
いてデータをサーバへ送
信するページです。
73
ネットワークプログラミング論 平成 28 年 11 月 14 日
次の手順にしたがって、このページの JSP および、そこからデータを受け取って結果を
表示するサーブレットを作成してください。
① 前節で作成した「input.jsp」を次の様に修正して「input2.jsp」としてください。Eclipse
のエディタで「input.jsp」を開いた状態で「ファイル」→「別名保管」と選択して作
成すると便利です。
<input2.jsp>
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<BODY>
 リンクの場合は GET メソッドとなる
<H2>GET と POST</H2>
 URL に直接入力文字列を指定
<A HREF="../InputServlet2?Message=リンクから GET 送信">
リンクによる GET 送信</A>
GET メソッドを明示的に指定
<FORM ACTION="../InputServlet2" METHOD="GET">
<INPUT TYPE="TEXT" NAME="Message">
<INPUT TYPE="SUBMIT" VALUE="フォームから GET 送信">
</FORM>
POST メソッドを指定
<FORM ACTION="../InputServlet2" METHOD="POST">
<INPUT TYPE="TEXT" NAME="Message">
<INPUT TYPE="SUBMIT" VALUE="フォームから POST 送信">
</FORM>
</BODY>
</HTML>
② 次に、
「InputServlet.java」を次ページの様に修正して「InputServlet2.java」と別名
保管してください。以下の 2 点がポイントです。

ブラウザ側の入力フォームで GET メソッドを指定するとサーブレットでは
doGet()メソッドが呼び出され、POST メソッドを指定した場合は doPost()メ
ソッドが呼び出される。

doGet()でも doPost()でも入力パラメータ(データ)の取得方法は全く同じ。
③ 最後に web.xml を次ページのように記述します。p.69 で書き加えた web.xml に、さら
に「InputServlet2」関連部分を加えてください。
作成したら、p.76 のように表示されることを確認してください。
74
ネットワークプログラミング論 平成 28 年 11 月 14 日
<InputServlet2.java>
package input;
・・・
public class InputServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
String Message=request.getParameter("Message");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("GET 送信受理:"+Message);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
String Message=request.getParameter("Message");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("POST 送信受理:"+Message);
}
}
<web.xml>
<web-app>
InputServlet2 関連部分のみを示している。
・・・
<servlet>
<servlet-name>InputServlet2</servlet-name>
<servlet-class>input.InputServlet2</servlet-class>
</servlet>
・・・
<servlet-mapping>
<servlet-name>InputServlet2</servlet-name>
<url-pattern>/InputServlet2</url-pattern>
</servlet-mapping>
</web-app>
75
ネットワークプログラミング論 平成 28 年 11 月 14 日
<表示結果の確認>
リンクをクリック
URL にデータが表示される
[フォームから GET 送信]をクリック
URL にデータが表示される
URL にデータは表示されない
[フォームから POST 送信]をクリック
【基礎課題 6-4】
上の表示結果を確認して下さい。表示結果を確認したら、「正常に表示されました。」と
記述して提出して下さい。
76
ネットワークプログラミング論 平成 28 年 11 月 14 日
6-4.種々のフォームからの入力
この節では今後使用する可能性がある種々の入力フォームからデータを受け取る方法を
学習しましょう。
【基礎課題 6-5】
テキストエリアからの入力
テキストエリアからデータ入力を行う、次の様な Web アプリケーションを作成します。
JSP にアクセスすると、テキストエリ
アを有するページが表示される。ここ
で、テキストエリア内に今日のスケジ
ュールを記入し[送信]ボタンをクリ
ックする。
すると、右のように入力したスケジ
ュールを表示するページにジャンプ
する。
次の手順にしたがって、JSP およびサーブレットを作成してください。
① 次の JSP を「input」内に作成し、「textarea.jsp」という名前で保管してください。
input.jsp を別名保管すると便利です。ここでは POST メソッドを用います。
<textarea.jsp>
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<BODY>
<H2>テキストエリアからの入力</H2>
表示行数を 5 行に指定
あなたの本日のスケジュールを入力して下さい。<br>
<FORM ACTION="../TextAreaServlet" METHOD="POST">
<TEXTAREA NAME="Message" COLS="50" ROWS="5"></TEXTAREA><br>
<INPUT TYPE="SUBMIT" VALUE="送信">
<INPUT TYPE="RESET">
1 行当たりの 50 文字に指定
</FORM>
</BODY>
</HTML>
77
ネットワークプログラミング論 平成 28 年 11 月 14 日
② 次の「TextAreaServlet.java」を、パッケージ名を「input」として作成してください。
上で作成した「InputServlet.java」を別名保管すると便利です。
<TextAreaServlet.java>
package input;
import java.io.IOException;
import java.io.PrintWriter;
import
import
import
import
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
public class TextAreaServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
String Message=request.getParameter("Message");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("本日のあなたのスケジュールは以下の通りです。");
out.println(Message);
}
}
③ web.xml を、上のサーブレットの URL が「/TextAreaServlet」となるように記述
してください(要領は p.75 の web.xml への追加と同様です)
。
作成したら、結果を表示したブラウザ画面のハードコピーをとり、それを「Kiso6_5.gif」
という名称で保管して提出してください。提出画像は表示結果と共に URL が確認できるよ
うに切り取ってください。
78
ネットワークプログラミング論 平成 28 年 11 月 14 日
【基礎課題 6-6】
ラジオボタンからの入力
ラジオボタンから選択した結果にしたがって表示を切り替える、次の様な Web アプリケ
ーションを作成してください。
「男性」を選択
「女性」を選択
① 上で作った「textarea.jsp」を次のように修正して「radiobutton.jsp」という名前で
別名保管してください。
<radiobutton.jsp>
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<BODY>
<H2>ラジオボタンからの入力</H2>
あなたは男性ですか女性ですか?<br>
<FORM ACTION="../RadioButtonServlet" METHOD="POST">
<INPUT TYPE="RADIO" NAME="Sex" VALUE="Dansei">男性
<INPUT TYPE="RADIO" NAME="Sex" VALUE="Josei">女性<br>
<INPUT TYPE="SUBMIT" VALUE="送信">
<INPUT TYPE="RESET">
 男性ボタンの値を「Dansei」、女性ボタ
</FORM>
ンの値を「Josei」にしている。
</BODY>
 選択された方の値が、ラジオボタンの
</HTML>
値になる
② 次 に 「 TextAreaServlet.java 」 を 次 ペ ー ジ の よ う に 修 正 し て
「RadioButtonServlet.java」という名前で別名保管してください。
③ web.xml を、上のサーブレットの URL が「/RadioButtonServlet」となるよう
に記述してください。
79
ネットワークプログラミング論 平成 28 年 11 月 14 日
<RadioButtonServlet.java>
package input;
・・・
public class RadioButtonServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
String Sex=request.getParameter("Sex");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
if(Sex.equals("Dansei")) {
out.println("ようこそ男性専用ページへ");
}
else {
out.println("ようこそ女性専用ページへ");
}
}
}
作成したら、結果を表示したブラウザ画面のハードコピーをとり、それを「Kiso6_6.gif」
という名称で保管して提出してください(男性、女性どちらを選択しても結構です)
。提出
画像は表示結果と共に URL が確認できるように切り取ってください。
【基礎課題 6-7】
チェックボックスからの入力
チェックボックスから選択した結果にしたがって購入商品を表示する、次の様な Web ア
プリケーションを作成してください。
3 つの商品を選択して[送信]ボタンを
クリックすると・・・
3つの商品が表示される。
80
ネットワークプログラミング論 平成 28 年 11 月 14 日
iPhone 7 のみを選択して[送信]
ボタンをクリックすると・・・
選択した iPhone 7 のみが
表示される。
① 上で作った「radiobutton.jsp」を次のように修正して「checkbox.jsp」という名前で別
名保管してください。
<checkbox.jsp>
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<BODY>
<H2>チェックボックスからの入力</H2>
購入したい商品を選んで下さい。<br>
<FORM ACTION="../CheckBoxServlet" METHOD="POST">
<INPUT TYPE="CHECKBOX" NAME="Shohin" VALUE="ノート PC">ノート PC
<INPUT TYPE="CHECKBOX" NAME="Shohin" VALUE="iPhone 6">iPhone 6
<INPUT TYPE="CHECKBOX" NAME="Shohin" VALUE="任天堂 Wii U">任天堂 Wii U
<br><br>
<INPUT TYPE="SUBMIT" VALUE="送信">
<INPUT TYPE="RESET">
 チェックボックの各項目の値を指定している。
</FORM>
 選択された項目の値が、チェックボックスの値
</BODY>
</HTML>
になる。ただし、値は一般に複数ある。
② 次 に 、 上 で 作 成 し た 「 RadioButtonServlet.java 」 を 次 ペ ー ジ の よ う に 修 正 し て
「CheckBoxServlet.java」という名前で別名保管してください。
③ web.xml を、上のサーブレットの URL が「/CheckBoxServlet」となるように記述
してください。
作成したら、結果を表示したブラウザ画面のハードコピーをとり、それを「Kiso6_7.gif」
という名称で保管して提出してください(商品は何を選択しても結構です)
。提出画像は表
示結果と共に URL が確認できるように切り取ってください。
81
ネットワークプログラミング論 平成 28 年 11 月 14 日
<CheckBoxServlet.java>
package input;
・・・
public class CheckBoxServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("あなたが購入した商品は以下の通りです。");
String[] values=request.getParameterValues("Shohin");
for(int i=0;i<values.length;i++) {
out.println(values[i]);
}
}
}
【解説】
① チェックリストからの入力パラメータを受け取る際のポイントは、値が一つではなく
複数の可能性がある、ということです。
② そのため、
String[] values=request.getParameterValues("Shohin");
の部分で入力パラメータの値を配列として受け取っています。これにより、チェック
リストで選択した項目数分だけ、値(今の場合商品名)を受け取ることができます。
③ 配列名.length により、当該配列の要素数を得ることができます。
【基礎課題 6-8】
セレクトボックスからの入力
セレクトボックスから選択した血液型を表示する、次の様な Web アプリケーションを作
成してください。
所定の JSP にアクセスすると、右の
画面が現れる。
82
ネットワークプログラミング論 平成 28 年 11 月 14 日
ここで、自分の血液型を選択して[送
信]ボタンをクリックする。これは O
型を選択したところ。
すると、左のように選んだ血液型が表
示される。
① 上で作った「checkbox.jsp」を次のように修正して「selectbox.jsp」という名前で別名
保管してください。
<selectbox.jsp>
<%@page contentType="text/html; charset=Windows-31J"%>
<HTML>
<BODY>
<H2>セレクトボックスからの入力</H2>
あなたの血液型は何型ですか?<br>
<FORM ACTION="../SelectBoxServlet" METHOD="POST">
<SELECT NAME="Ketsueki" >
<OPTION VALUE="A 型">A 型</OPTION>
<OPTION VALUE="B 型">B 型</OPTION>
<OPTION VALUE="O 型">O 型</OPTION>
<OPTION VALUE="AB 型">AB 型 </OPTION>
</SELECT><br><br>
<INPUT TYPE="SUBMIT" VALUE="送信">
<INPUT TYPE="RESET">
</FORM>
</BODY>
</HTML>
② 次 に 、 上 で 作 成 し た 「 CheckBoxServlet.java 」 を 次 ペ ー ジ の よ う に 修 正 し て
「SelectBoxServlet.java」という名前で別名保管してください。
83
ネットワークプログラミング論 平成 28 年 11 月 14 日
<SelectBoxServlet.java>
package input;
・・・
public class SelectBoxServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
response.setContentType("text/plain;charset=Windows-31J");
String Ketsueki=request.getParameter("Ketsueki");
PrintWriter out=response.getWriter();
out.println("あなたの血液型は"+Ketsueki+"ですね。");
}
}
③ web.xml を、上のサーブレットの URL が「/SelectBoxServlet」となるように記
述してください。
作成したら、結果を表示したブラウザ画面のハードコピーをとり、それを「Kiso6_8.gif」
という名称で保管して提出してください(どの血液型を選択しても結構です)。提出画像は
表示結果と共に URL が確認できるように切り取ってください。
84
ネットワークプログラミング論 平成 28 年 11 月 14 日
6-5.応用課題
【応用課題 6-A】
-【基礎課題 6-7】の改良。
【基礎課題 6-7】で作成した商品購入用 Web アプリケーションは、実は大きな問題をか
かえています。気付いた人もいるかもしれませんが、最初の JSP で何も商品を選ばずに[送
信]ボタンをクリックすると、次のようなエラー画面が現れてしまいます。
エラーの原因は「NullPointerException」であり、その場所は 21 行目です。エラーの意
味は分かるでしょうか?
原因は、下線部の「values.length」です。何も商品を購入しなかった場合は 20 行目で取
得する配列 values は空っぽ(null)になります。その空っぽの values の要素数を求めよう
としたのでエラーが起きた訳です。”NullPointerException”とは空っぽの配列やオブジェク
トを参照したときに起きるエラーです。
85
ネットワークプログラミング論 平成 28 年 11 月 14 日
そこで、何も商品を選択しなかった場合は、次のように「何も購入されていません。
」と
表示されるようにサーブレットを改良しましょう。
そのために、
「CheckBoxServlet.java」を次のように修正しました。
<CheckBoxServlet.java>
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("Windows-31J");
response.setContentType("text/plain;charset=Windows-31J");
PrintWriter out=response.getWriter();
out.println("あなたが購入した商品は以下の通りです。");
String[] values=request.getParameterValues("Shohin");
if(
) {
out.println("何も購入していません。");
}
else {
for(int i=0;i<values.length;i++) {
out.println(values[i]);
}
}
}
空欄に入る式を記入してください。
<ヒント>
values が null(空っぽ)ならば・・・という条件式になります。
86
Fly UP