Top > SAStrutsあれこれ > 2-1 電子カタログを作ろう
  0
  1
  2
  3
  4
  5
2008.10.04 ・新規作成
2008.10.06 ・「2-5 ショッピングカートを追加しよう」の追加に伴いCatalogFormの設計を見直した。
             ↓
             CatalogFormに直接、CatalogDtoのリストを持たずに、CatalogListDtoを介して
             持つように変更して、すっきりした設計にした。
             変更:CatalogAction.java, CatalogForm.java, catalog.jsp, catalogDetail.jsp
             追加:CatalogListDto.java

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
 
 
-
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
SET NAMES utf8;
 
CREATE TABLE `sastruts`.`catalog` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `price` INTEGER UNSIGNED NOT NULL,
  `detail` TEXT NOT NULL,
  `pictureurl` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
 
INSERT INTO catalog VALUES(1,'牛肉',1500,'国産牛ロース100g','/image/previewimage.jpg');
INSERT INTO catalog VALUES(2,'牛肉',2850,'国産牛ロース200g','/image/previewimage.jpg');
INSERT INTO catalog VALUES(3,'牛肉',4050,'国産牛ロース300g','/image/previewimage.jpg');
INSERT INTO catalog VALUES(4,'牛肉',6375,'国産牛ロース500g','/image/previewimage.jpg');
INSERT INTO catalog VALUES(5,'牛肉',12000,'国産牛ロース1kg','/image/previewimage.jpg');
INSERT INTO catalog VALUES(6,'牛肉',1000,'外国産牛ロース100g','/image/previewimage2.jpg');
INSERT INTO catalog VALUES(7,'牛肉',1800,'外国産牛ロース200g','/image/previewimage2.jpg');
INSERT INTO catalog VALUES(8,'牛肉',2700,'外国産牛ロース300g','/image/previewimage2.jpg');
INSERT INTO catalog VALUES(9,'牛肉',4500,'外国産牛ロース500g','/image/previewimage2.jpg');
INSERT INTO catalog VALUES(10,'牛肉',9000,'外国産牛ロース1kg','/image/previewimage2.jpg');

  0
  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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
    <include path="jta.dicon"/>
 
    <component name="xaDataSource"
        class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
        <property name="driverClassName">
            "com.mysql.jdbc.Driver"
        </property>
        <property name="URL">
            "jdbc:mysql://localhost:3306/sastruts"
        </property>
        <property name="user">"sastruts"</property>
        <property name="password">"sastruts"</property>
    </component>
 
    <component name="connectionPool"
        class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
        <property name="timeout">600</property>
        <property name="maxPoolSize">10</property>
        <property name="allowLocalTx">true</property>
        <destroyMethod name="close"/>
    </component>
 
    <component name="DataSource"
        class="org.seasar.extension.dbcp.impl.DataSourceImpl"
    />
 
    <!-- from JNDI -->
    <!--
    <component name="DataSource"
        class="javax.sql.DataSource">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/DataSource")
    </component>
    -->
 
    <!--
    <component name="dataSource"
        class="org.seasar.extension.datasource.impl.SelectableDataSourceProxy"/>
    -->
</components>
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="jdbc.dicon"/>
    <include path="s2jdbc-internal.dicon"/>
    <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
        <property name="maxRows">0</property>
        <property name="fetchSize">0</property>
        <property name="queryTimeout">0</property>
        <property name="dialect">mysqlDialect</property>
    </component>
</components>
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
!
package sample.form;
 
import java.io.Serializable;
import java.util.List;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
import sample.dto.CatalogDto;
 
@Component(instance = InstanceType.SESSION)
public class CatalogForm implements Serializable {
 
    //商品一覧
    public CatalogListDto catalogList;
    
    //ページ制御用オフセット値
    public int offset;
}
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
!
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;
}
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
 
 
 
 
 
 
-
|
|
|
|
|
-
|
-
-
|
!
!
|
!
!
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;
    }
}
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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
!
|
|
|
-
|
|
!
|
|
|
-
|
|
!
|
|
-
|
-
|
|
!
|
!
!
package sample.action;
 
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import sample.dto.CatalogDto;
import sample.dto.CatalogListDto;
import sample.entity.Catalog;
import sample.form.CatalogForm;
import sample.service.CatalogService;
 
public class CatalogAction {
    
    @Resource
    protected CatalogService catalogService;
 
    //セッションスコープに格納されています。
    @ActionForm
    @Resource
    protected CatalogForm catalogForm;
    
    //初期一覧の表示
    @Execute(validator = false)
    public String list() {
        catalogForm.catalogList = new CatalogListDto();
        catalogForm.catalogList.catalogDtos = entity2dto(catalogService.findAll());
        catalogForm.offset = 0;
        return "catalog.jsp";
    }
    
    //次ページの表示
    @Execute(validator = false)
    public String next() {
        catalogForm.offset += 5 ;
        return "catalog.jsp";
    }
    
    //前ページの表示
    @Execute(validator = false)
    public String prev() {
        catalogForm.offset -= 5 ;
        return "catalog.jsp";
    }
    
    //Entity→DTOに変換
    private List<CatalogDto> entity2dto(List<Catalog> catalogEntities) {
        List<CatalogDto> catalogDtos = new ArrayList<CatalogDto>();
        for( Catalog c : catalogEntities) {
            CatalogDto d = Beans.createAndCopy(CatalogDto.class, c).execute();
            catalogDtos.add(d);
        }
        return catalogDtos;
    }
}

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
-------------
  <target name="gen-entity">
    <gen-entity
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      javafiledestdir="${javafiledestdir}"
      javafileencoding="${javafileencoding}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
      tableNamePattern="catalog"
    />
-------------
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
 
-
|
|
|
|
|
|
|
-
|
!
!
package sample.service;
import sample.entity.Catalog;
 
public class CatalogService extends AbstractService<Catalog> {
    /**
     * 識別子でエンティティを検索します。
     * 
     * @param id
     *            識別子
     * @return エンティティ
     */
    public Catalog findById(Long id) {
        return select().id(id).getSingleResult();
    }
}
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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
package sample.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
 
/**
 * Catalogエンティティクラスです。
 * 
 * @author S2JDBC-Gen
 */
@Entity
public class Catalog {
 
    /** idプロパティ */
    @Id
    @GeneratedValue
    @Column(precision = 10, nullable = false, unique = true)
    public Long id;
 
    /** nameプロパティ */
    @Column(length = 255, nullable = false, unique = false)
    public String name;
 
    /** priceプロパティ */
    @Column(precision = 10, nullable = false, unique = false)
    public Long price;
 
    /** detailプロパティ */
    @Lob
    @Column(length = 65535, nullable = false, unique = false)
    public String detail;
 
    /** pictureurlプロパティ */
    @Column(length = 255, nullable = false, unique = false)
    public String pictureurl;
}
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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<title>カタログ</title>
</head>
<body>
詳細を見たい商品の商品番号をクリックして下さい。
  <table border="1">
    <thead>
      <tr>
        <th>商品番号</th>
        <th>商品名</th>
        <th>価格</th>
      </tr>
    </thead>
    <tbody>
      <%-- 1) begin, end属性によるページ制御 offsetから5件を表示 --%>
      <c:forEach var="catalog" begin="${offset}" end="${offset + 4}" items="${catalogList.catalogDtos}">
      <tr>
        <td><s:link href="/catalogDetail/show/${f:u(catalog.id)}">${f:u(catalog.id)}</s:link></td>
        <td>${f:h(catalog.name)}</td>
        <td align="right"><fmt:formatNumber value="${catalog.price}" pattern="#,##0"/></td>
      </tr>
      </c:forEach>
    </tbody>
  </table>
  
  <s:form>
    <%-- 2) prevボタンの表示制御 --%>
    <c:if test="${offset>0}" >
      <input type="submit" name="prev" value="prev" />
    </c:if>
    <%-- 3) nextボタンの表示制御 --%>
    <c:if test="${fn:length(catalogList.catalogDtos)-5 > offset}" >
      <input type="submit" name="next" value="next" />
    </c:if>
  </s:form>
</body>
</html>

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 
 
-
|
|
|
|
|
|
|
|
|
|
!
package sample.form;
 
public class CatalogDetailForm {
    //商品番号
    public String id;
    //商品名
    public String name;
    //価格
    public String price;
    //詳細
    public String detail;
    //画像パス
    public String pictureurl;
}
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
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
!
!
package sample.action;
 
import javax.annotation.Resource;
import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
 
import sample.dto.CatalogDto;
import sample.form.CatalogDetailForm;
import sample.form.CatalogForm;
import sample.service.CatalogService;
 
public class CatalogDetailAction {
    
    @Resource
    protected CatalogService catalogService;
    
    @ActionForm
    @Resource
    protected CatalogDetailForm catalogDetailForm;
    
    //セッションスコープにあるCatalogFormインスタンスをインジェクションします。
    @Resource
    protected CatalogForm catalogForm;
    
    // 1)商品詳細の表示
    @Execute(validator = false, urlPattern = "show/{id}")
    public String show() {
        
        // 2)セッションから商品番号に該当するレコードを取得して、フォームにコピーします。
        Beans.copy(catalogForm.catalogList.findById(catalogDetailForm.id), catalogDetailForm).execute();
        
        return "catalogDetail.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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<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>
</body>
</html>

添付ファイル: filesupersample2-1_5.jpg 479件 [詳細] filesupersample2-1_4.jpg 398件 [詳細] filesupersample2-1_3.jpg 435件 [詳細] filesupersample2-1_2.jpg 500件 [詳細] filesupersample2-1_1.jpg 447件 [詳細]

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