■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年03月16日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.095

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.Tomcatのアプリケーション開発
========================================================


さて、ここでプログラムの通常の流れを再度、確認してみましょう。

--------------------------------------------------------
(0) 最初のページ(商品検索のページ)を呼び出す。
[WebブラウザーにURL(http://localhost:8080/JStudy2/itemSelect.html)を入力する]
 → itemSelect.html

(1) キーワード(商品名の一部)やカテゴリーを入力して商品を検索する。
「送信」ボタンをクリックする
 → ItemServlet.java → itemList.jsp

(2) 商品のリストが表示されるので、買いたい商品を選択する(= ショッ
ピング・カートに入れる)。(ショッピング・カートは以後ときどき
カートと略します。)
「選択した商品をカートに入れる」ボタンをクリックする
 → OrderItemServlet.java → cart.jsp

(3) カートの中身が表示されるので、必要に応じて購入個数を変更する。
「選択した商品を購入する」ボタンをクリックする
 → OrderProcessServlet.java → order.jsp
[例外:<<カートのオブジェクトが消失していた場合>>
 → OrderProcessServlet.java → cartmissing.html]

(4) 購入(注文)する内容が表示され、ユーザーIDとパスワードが要求される
ので入力する。
「最終購入確認画面に進む」ボタンをクリックする
 → ConfirmOrderServlet.java → confirmOrder.jsp

(5) 商品の発送先(= ユーザーの住所・氏名)が表示され、購入(注文)を
確定するかどうか聞いてくる。
「購入(注文確定)する」ボタンをクリックする
 → CompleteOrderServlet.java → completeOrder.jsp

(6) 「注文を受け付けました。」のメッセージが表示される。
(これで終わり。)
--------------------------------------------------------

これまで、上記の流れに従ってプログラミングしてきましたが、以前にもお話
したように、実際のユーザーは、必ずしも上記の順番通りに操作してくれる
わけではありません。

たとえば、(1)から(3)あるいは(4)まで進んだあとで、Webブラウザーの「戻る」
ボタンを使って(1)まで戻り、他の商品を検索してから再度(3)まで進むかも知れ
ません。
特に、購入したい商品が何種類もあるときは、商品の検索→ショッピング・カー
トへの追加→商品の検索→ショッピング・カートへの追加→商品の検索→ショッ
ピング・カートへの追加・・・・を何度も繰り返してから(3)→(4)→(5)→(6)
と進む可能性があり、むしろこのような操作順序のほうが自然かもしれません。

また、いったんショッピングの途中でページをブックマーク(Webブラウザーに
よっては「お気に入り」と呼ぶ)に登録しておいてから、(他にもっと安いお店
はないか?などと考えながら)どこか別のお店のページを開いて探索してから、
ブックマークを使って以前のページを開いてショッピングの続きに戻ろうとする
かも知れません。

インターネット・ショッピングのWebアプリケーションは、このようないかなる
操作順序に対しても対処する必要があります。

対処するといっても、場合によっては操作の実行が不可能な場合もある(たとえ
ば、ユーザーの住所・氏名が不明な状態では注文を確定するわけにはいかない)
ので、各操作段階における実行可否の前提条件を明確にし、実行前には前提条件が
満たされているかどうかをチェックする必要があります。
そして満たされていない場合は、操作を実行せずにエラーのメッセージを返します。

というわけで、各操作の前提条件を明確にしておきましょう。
合わせて、条件が満たされないときのエラー・メッセージ(Webページ)の
ファイル名や、操作への入力となるWebページや操作の結果を返すWebページ
も明確にしておきましょう。
また、操作の後、セッション・オブジェクトに何らかの変化が生じる場合には
それを事後条件として整理しておくことにします。
以下が、これらをまとめたものです。

なお、「戻る」ボタン(あるいは「進む」ボタン)などで、表示されるページは
JSPのファイルそのものではなく、JSPから生成されたWebページがキャッシュ
(Webブラウザーの記憶域に一時保管)されたものなのでJSPとは区別し、
たとえばitemList.jspが生成したWebページは[itemListページ]というように表記
することにします。

--------------------------------------------------------
(操作1) 商品の検索および検索結果の表示
----------------------------------
■入力ページ:
・[itemSelectページ]
■前提条件:
・[itemSelectページ]においてキーワードが入力されていること(オプション)
・[itemSelectページ]においてカテゴリーが入力されていること(オプション)
・[itemSelectページ]において「送信」ボタンをクリックすること。
■事後条件:
■結果ページ:
・[itemListページ]
----------------------------------
 [itemSelectページ]→ ItemServlet.java → itemList.jsp
----------------------------------

(操作2) 商品をショッピング・カートに入れる
----------------------------------
■入力ページ:
・[itemListページ]
■前提条件:
・[itemListページ]において商品が選択されていること(オプション)
・[itemListページ]において「選択した商品をカートに入れる」ボタンを
クリックすること。
・セッション・オブジェクトの中にカートのオブジェクト
が入っていること(オプション)
■事後条件:
・セッション・オブジェクトの中にカートのオブジェクト
が入っていること。
■結果ページ:
・[cartページ]
----------------------------------
 [itemListページ]→ OrderItemServlet.java → cart.jsp
----------------------------------

(操作3) 購入個数の変更
----------------------------------
■入力ページ:
・[cartページ]
■前提条件:
・[cartページ]において商品の購入個数が変更されていること(オプション)
・[cartページ]において「選択した商品を購入する」ボタンをクリック
すること。
・セッション・オブジェクトの中にカートのオブジェクト
が入っていること。
<<条件が満たされていない場合→エラー・メッセージ:cartmissing.html>>
・購入対象の商品 = 購入個数の変更対象になる商品(OrderItem)オブジェクトが
既にカートのオブジェクトの中に入っていること。
<<条件が満たされていない場合→エラー・メッセージ:orderiteminvalid.html>>
■事後条件:
・セッション・オブジェクトの中にカートのオブジェクト
が入っていること。
■結果ページ:
・[orderページ]
----------------------------------
 [cartページ]→ OrderProcessServlet.java → order.jsp
----------------------------------

(操作4) ユーザーIDに対応した住所・氏名の取り出し
----------------------------------
■入力ページ:
・[orderページ]
■前提条件:
・[orderページ]において正しいユーザーIDが入力されていること
<<条件が満たされていない場合→エラー・メッセージ:wrongUser.jsp>>
・[orderページ]において正しいパスワードが入力されていること
 (本来は必須だが、今のところオプションとしておく)
・[orderページ]において「最終購入確認画面に進む」ボタンをクリック
すること。
・セッション・オブジェクトの中にカートのオブジェクト
が入っていること。
<<条件が満たされていない場合→エラー・メッセージ:ordermissing.html>>
・カートのオブジェクトの中に商品(OrderItem)オブジェクトが
が入っていること。
<<条件が満たされていない場合→エラー・メッセージ:invalidorder.html>>
■事後条件:
・Customerオブジェクトがセッション・オブジェクトの中にはいっていること。
■結果ページ:
・[confirmOrderページ]:商品の発送先(= ユーザーの住所・氏名)が表示され、
購入(注文)を確定するかどうか聞いてくる。
----------------------------------
 [orderページ]→ ConfirmOrderServlet.java → confirmOrder.jsp
----------------------------------

(操作5) 購入の確定(注文をデータベースへ登録)
----------------------------------
■入力ページ:
・[confirmOrderページ]
■前提条件:
・[confirmOrderページ]において、「購入(注文確定)する」ボタンをクリック
すること。
・セッション・オブジェクトの中にカートのオブジェクトが入っていること。
<<条件が満たされていない場合→エラー・メッセージ:ordermissing.html>>
・カートのオブジェクトの中に商品(OrderItem)オブジェクトが
が入っていること。
<<条件が満たされていない場合→エラー・メッセージ:invalidorder.html>>
・セッション・オブジェクトの中にCustomerオブジェクト
が入っていること。
<<条件が満たされていない場合→エラー・メッセージ:customermissing.html>>
■事後条件:
・セッション・オブジェクトが無効化されること。
■結果ページ:
・[completeOrderページ]
----------------------------------
 [confirmOrderページ]→ CompleteOrderServlet.java → completeOrder.jsp
--------------------------------------------------------


上記のうち、オプション(option)というのは必須ではないという意味で
あり、指定しても指定しなくてもどちらでもいいものを意味します。



ところで、ブックマーク(「お気に入り」)からWebページを開こうとした場合は
Webブラウザーは記憶されたURLに対し、GET方式で呼び出し(vol.073参照)を行い
ます。
したがって、サーブレットの場合はdoGet()メソッドが呼び出されることになります。

ところが、これまでに作成したサーブレットは基本的にはdoPost()メソッドを
実装しており、doGet()メソッドは実装しておりません。

というわけで、ブックマークに対処するためには、doGet()メソッドを実装しな
ければならないのですが、残念ながらこれまでdoPost()メソッドにやらせてきた
のと同じ仕事をdoGet()メソッドにやらせることはできません。

なぜかというと、これまで、FORMでmethod="POST"を指定することによって、
doPost()メソッドを呼び出して、FORMで入力したデータを渡す、ということを
行ってきたのですが、doGet()メソッドではこのFORMに入力されたデータを受け取る
ことができないし、そもそもFORMに入力されたデータはブックマークでは記憶されない
からです。

そこで、doGet()メソッドでは単純に「ブックマークからのページ表示は無効です。」
というメッセージのWebページを開かせるだけの操作を行うようにしましょう。

各サーブレットに下記のようなdoGet()メソッドを追加してみましょう。
--------------------------------------------------------
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
   getServletContext().getRequestDispatcher("/bookmarkinvalid.html").forward(req,res);
}
--------------------------------------------------------


そして、下記のようなbookmarkinvalid.htmlファイルをitemSelect.htmlと同じ場所に
作成してください。
--------------------------------------------------------
<HTML>
<HEAD>
<TITLE>無効操作</TITLE>
</HEAD>
<BODY bgcolor="#77ffff" text="#fa5a00">
<H1>無効操作</H1>
ブックマークからのページ表示は無効です。
<BR>
まことに申し訳ありませんが、商品の検索から再度やり直してください。
<BR>
<BR>
<A href="http://localhost:8080/JStudy2/itemSelect.html">
商品の検索に戻るには、ここをクリック
</A>
<BR>
</BODY>
</HTML>
--------------------------------------------------------


(次回に続く)


では、今日はここまでにします。

何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2008 Future Lifestyle Inc. 不許無断複製