■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |