- PR -

ArrayListでショッピングカートをつくるには

投稿者投稿内容
しろくま
常連さん
会議室デビュー日: 2004/10/15
投稿数: 35
投稿日時: 2004-12-13 09:02
第1画面で商品リストを表示してチェックボックスで購入する商品を選択させ、
第2画面で選択された商品のみを表示し個々に数量を設定するような流れで考えているのですが、行き詰ってしまいました。
第1画面で選択された商品をArrayList型のCartに追加してサーブレットからJSPへ渡して選択された商品のみを第2画面で表示するまでは出来たのですが、第2画面で入力された数量をCartの中に入っている商品に渡す?にはどのよにすれば良いのでしょうか。
1.ArrayListの該当品番の入っている行を取り出す。
2.数量を設定する。
3.ArrayListへ戻す。
の手順で考えているのですが3の戻すがどうやってよいのかわかりません。
ご助言お願いいたします。

商品ごとの内容、ここに商品品番と数量を設定します。
public class OrderItem {
String GOODCD;
String GOODNM;
int GOODPRI;
int GOODQNT;

public OrderItem() {
}

     public void setGOODCD(String s){
GOODCD = s;
}
public String getGOODCD(){
return GOODCD;
}
public void setGOODNM(String s){
GOODNM = s;
}
public String getGOODNM(){
return GOODNM;
}
public void setGOODPRI(int i){
GOODPRI = i;
}
public int getGOODPRI(){
return GOODPRI;
}
public void setGOODQNT(int i){
GOODQNT = i;
}
public int getGOODQNT(){
return GOODQNT;
}
}

こちらがカートです。
import java.util.*;
public class CartBeans {
     private ArrayList OrderList;
public CartBeans() {
OrderList = new ArrayList();
}
// 参照
public OrderItem getOrderItem(int i){
return (OrderItem)OrderList.get(i);
}
// 追加
public void addOrderItem(OrderItem order){
OrderList.add(order);
}
// 削除
public void removeOrderItem(int i){
OrderList.remove(i);
}
// 数量
public int getSize(){
return OrderList.size();
}
}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-13 10:20
「第2画面で入力された数量をCartの中に入っている商品に渡す?」ってどういうことでしょう?
何がわからないのか理解できませんでした。
HttpSession とかの概念は理解されていますか?
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-13 10:21
ArrayListからOrderItemを取得して、数を設定した時点で
ArrayListに戻す必要はないかと思います。

取り出してるのはOrderItemの参照なので。
しろくま
常連さん
会議室デビュー日: 2004/10/15
投稿数: 35
投稿日時: 2004-12-13 10:50
内容が伝わりにくいなかレスありがとう御座います。

引用:

「第2画面で入力された数量をCartの中に入っている商品に渡す?」ってどういうことでしょう?


私の考え方が悪いのかもしれませんが、OrderItemを注文の1明細としたいのです。
ですので、先に商品番号をいれ、後から(ここが変なのですかね)数量を設定して明細の出来上がりと...

引用:

ArrayListからOrderItemを取得して、数を設定した時点で
ArrayListに戻す必要はないかと思います


戻したい理由として第3画面で購入内容の確認を行うのみ表示するためです。
確認画面でOKとなってDBへ書き込みをする、といった流れです。

そんなやり方ではダメというのであれば、別を考えたいと思います。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-13 11:50
ぽちさんの仰っている「取り出してるのはOrderItemの参照なので。」という意味はわかりますか?
特に気にしなくても第三画面で情報は取り出せると思いますよ。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-13 16:30
試しにローカルでやってみるといいですよ。

コード:

// 格納
ArrayList list = new ArrayList();
list.add( new OrderItem() );

// 取り出し
OrderItem item = (OrderItem) list.get(0);
item.setHoge( "hoge" );

// ここで戻さずにもう一回OrderItemを取り出して
// 中身を確認をすると変更が反映されてます




こんな感じで取り出しした後わざわざ戻す必要はないです。
ちゃんとリストの中のOrderItemに変更が反映されてます。

[ メッセージ編集済み 編集者: (株)ぽち 編集日時 2004-12-13 16:32 ]
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-12-13 18:38

「戻す」という事は、どの場所に戻すのかを特定する必要があると思いますが、
そのような場合はListよりMapのほうが扱いやすいと思います。
商品番号をキーにしてOrderItemのインスタンスを保持してはどうでしょうか?

あと、「戻す」必要はないですが、インスタンスの状態を更新したことを明示する
ために再セットすることは価値があるのかなぁと思います。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-13 19:05
>あと、「戻す」必要はないですが、インスタンスの状態を更新したことを明示する
>ために再セットすることは価値があるのかなぁと思います。
たしかにそうですね。コンテナによってはレプリケートコストを最適化するためにオブジェクトに変更があったら明示的に setAttribute() してやる必要ある場合があります。
・クラスタのフェイルオーバとレプリケーション > setAttribute を使用してセッション ステートを変更する
http://edocs.beasys.co.jp/e-docs/wls/docs81/cluster/failover.html#1022133

List に set してやる必要はあまりないと思いますが。

スキルアップ/キャリアアップ(JOB@IT)