Top > SAStrutsあれこれ > 2-5 ショッピングカートを追加しよう

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<title>カタログ詳細</title>
</head>
<body>
  <table border="1">
    <thead>
      <tr>
        <th>商品番号</th>
        <th>商品名</th>
        <th>価格</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>${f:h(id)}</td>
        <td>${f:h(name)}&nbsp;${f:h(detail)}</td>
        <td align="right"><fmt:formatNumber value="${price}" pattern="#,##0"/></td>
      </tr>
      <tr>
        <td colspan="3"><html:img page="${f:h(pictureurl)}" /></td>
      </tr>
    </tbody>
  </table>
  
  <%-- カートに入れるボタン(2-5で追加)--%>
  <s:form action="/catalogOrder">
    <%-- <html:hidden>による商品IDの引継ぎ --%>
    <html:hidden property="id" value="${f:h(id)}"/>
    <html:submit property="add" value="この商品をカートに入れる"/>
  </s:form>
</body>
</html>

errors.count={0}に負数を設定することはできません。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
-
|
|
-
-
|
|
|
|
!
|
!
|
!
!
package sample.form;
 
import java.io.Serializable;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
import sample.dto.CatalogDto;
import sample.dto.CatalogListDto;
 
@Component(instance = InstanceType.SESSION)
public class CatalogOrderForm implements Serializable {
 
    //商品詳細画面の「この商品をカートに入れる」ボタンクリック時に使用されます。
    //商品番号
    public String id;
    
    //カート内容一覧画面の表示時、「数量変更」ボタンクリック時に使用されます。
    //カート
    public CatalogListDto catalogList = new CatalogListDto();
 
    //購入個数をチェックするバリデータです。
    public ActionMessages isValidateCount() {
        ActionMessages errors = new ActionMessages();
        int i=0;
        for( CatalogDto c : catalogList.catalogDtos ) {
            if( Integer.parseInt(c.count) < 0 ) {
              //第一パラメータには色つきにするタグ要素のname属性の値を設定
                errors.add("catalogList.catalogDtos[" + i + "].count", 
                        new ActionMessage("errors.count",
                        new Object[] { "Count (" + (i+1) + "行目)" }));
            }
            i++;
        }
        return errors;
    }
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
!
|
|
|
-
|
|
|
!
!
package sample.action;
 
import javax.annotation.Resource;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import sample.dto.CatalogDto;
import sample.form.CatalogForm;
import sample.form.CatalogOrderForm;
 
public class CatalogOrderAction {
    
    //セッションスコープからインジェクション
    @ActionForm
    @Resource
    protected CatalogOrderForm catalogOrderForm;
    
    //セッションスコープからインジェクション
    @Resource
    protected CatalogForm catalogForm;
    
    // 商品詳細画面の「この商品をカートに入れる」ボタンクリック時のアクション
    @Execute(validator = false)
    public String add() {
        //リクエストの商品番号に該当する商品情報をセッションから取得して、
        //カートに格納します。
        CatalogDto dto = catalogForm.catalogList.findById(catalogOrderForm.id);
        catalogOrderForm.catalogList.add(dto);
        return "cart.jsp";
    }
    
    //「数量変更」ボタンクリック時のアクション
    @Execute(validate="isValidateCount", input="cart.jsp")
    public String change() {
        //2) 個数0の商品は、カートから削除します。
        catalogOrderForm.catalogList.compress();
        return "cart.jsp";
    }
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 
 
 
 
 
 
-
|
|
|
|
|
-
|
-
-
|
!
!
|
!
|
|
-
|
-
-
|
|
|
!
!
-
|
|
!
!
|
|
-
|
-
|
!
|
!
|
|
|
-
-
-
|
!
!
!
|
!
package sample.dto;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
public class CatalogListDto implements Serializable {
 
    //商品一覧
    public List<CatalogDto> catalogDtos = new ArrayList<CatalogDto>();
    
    //商品IDをキーにして、商品を取得
    public CatalogDto findById(String id) {
        CatalogDto rtn = null;
        for( CatalogDto dto : catalogDtos ) {
            if( dto.id.equals(id) ) {
                rtn = dto;
            }
        }
        return rtn;
    }
    
    //2) カートに商品を追加します。既にカートに同一商品番号の商品がある場合は購入数に+1する
    public void add(CatalogDto order) {
        boolean exist =false;
        for( CatalogDto d : catalogDtos ) {
            if( d.id.equals(order.id) ) {
                int c = Integer.parseInt(d.count);
                d.count = String.valueOf(c+1);
                exist = true;
            }
        }
        if( !exist ) {
            order.count = "1";
            catalogDtos.add(order);
        }
    }
    
    //3) カート内容の総合計金額を取得します。
    public String getTotalPrice() {
        int total = 0;
        for( CatalogDto dto : catalogDtos ) {
            total += Integer.parseInt(dto.price) * Integer.parseInt(dto.count);
        }
        return String.valueOf(total);
    }
    
    //4) カートから購入個数が0個の商品を削除します。
    //   処理を簡単にするためにリストの後ろから削除していきます。
    public void compress() {
        for( int i=catalogDtos.size()-1; i>=0; i-- ) {
            if( catalogDtos.get(i).count.equals("0") ) {
                catalogDtos.remove(i);
            }
        }
    }
    
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
package sample.dto;
 
import java.io.Serializable;
 
public class CatalogDto implements Serializable {
 
    //商品番号
    public String id;
 
    //商品名
    public String name;
 
    //価格
    public String price;
 
    //詳細
    public String detail;
 
    //画像パス
    public String pictureurl;
    
    //購入個数
    public String count = "0";
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<title>ショッピングカートの内容</title>
<%-- 1) 個数が値エラー(負数)の場合のテキストボックスの色を定義 --%>
<style type="text/css">
  input.err { background-color: yellow; }
</style>
</head>
<body>
購入予定のリストです。ご確認下さい。
<html:errors/>
<s:form>
  <c:forEach var="c" items="${catalogList.catalogDtos}">
  <table border="1">
    <thead>
      <tr>
        <th>商品番号</th>
        <th>商品名</th>
        <th>価格</th>
        <th>数量</th>
        <th>小計</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>${f:h(c.id)}</td>
        <td>${f:h(c.name)}&nbsp;${f:h(c.detail)}</td>
        <td align="right"><fmt:formatNumber value="${c.price}" pattern="#,##0"/></td>
        <%-- 2) セッションに保存してあるカートの各商品の個数だけを書き換えるようにします --%>
        <td><html:text name="catalogList.catalogDtos" property="count" value="${f:h(c.count)}" errorStyleClass="err" indexed="true"/></td>
        <td><fmt:formatNumber value="${c.price * c.count}" pattern="#,##0"/></td>
      </tr>
    </tbody>
  </table>
  <br>
  </c:forEach>
  <table border="1">
    <thead>
    </thead>
    <tbody>
      <tr>
        <td>合計</td>
        <%-- 3) CatalogListDto#getTotalPriceメソッドで総合計金額を取得して表示 --%>
        <td><fmt:formatNumber value="${catalogList.totalPrice}" pattern="#,##0"/></td>
      </tr>
    </tbody>
  </table>
  <%-- 4) 複数商品の個数変更を一括して適用します --%>
  <html:submit property="change" value="数量変更"/>
</s:form>
<br>
<s:link href="/catalog/list">商品一覧へ戻る</s:link>
</body>
</html>


添付ファイル: filesupersample2-5_6.jpg 585件 [詳細] filesupersample2-5_5.jpg 435件 [詳細] filesupersample2-5_4.jpg 436件 [詳細] filesupersample2-5_3.jpg 422件 [詳細] filesupersample2-5_2.jpg 452件 [詳細] filesupersample2-5_1.jpg 489件 [詳細]

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:25:54 (2921d)