Top > SAStrutsあれこれ > 2-4 Webで日記をつけよう

  • Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
    
     
     
     
     
     
     
     
    
    CREATE TABLE `sastruts`.`diary` (
      `date` DATE NOT NULL,
      `content` TEXT NOT NULL,
      `imgFileUrl` VARCHAR(255),
      PRIMARY KEY (`date`)
    )
    ENGINE = InnoDB;

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 
 
 
 
 
 
 
 
 
 
 
 
 
-------------
  <target name="gen-entity">
    <gen-entity
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      javafiledestdir="${javafiledestdir}"
      javafileencoding="${javafileencoding}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
      tableNamePattern="diary"
    />
-------------
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
 
 
 
 
 
 
    /** dateプロパティ */
    @Id
    /*@GeneratedValue*/
    @Temporal(TemporalType.DATE)
    @Column(nullable = false, unique = true)
    public Date date;

  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
 18
 19
 20
 21
 22
 23
 24
 25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Web日記</title>
</head>
<body>
  <h1>2-4のサンプル Web日記</h1>
  
  <%-- 1) href属性によるアクションメソッドの指定--%>
  <s:link href="list">日記を書かずに内容を見る</s:link>
  
  <s:form enctype="multipart/form-data">
    <html:errors/>
    
    日付(2004-09-30のように記述して下さい)<br>
    <html:text property="date" size="20"/><br>
    内容<br>
    <html:textarea rows="10" cols="40" property="content"/><br>
    画像ファイル<html:file property="imgFile"/><br>
    
    <%-- 2) property属性によるアクションメソッドの指定--%>
    <html:submit property="entry" value="日記書き込み"/>
  </s:form>
</body>
</html>

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
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
package sample.form;
 
import java.util.List;
import org.apache.struts.upload.FormFile;
import org.seasar.struts.annotation.DateType;
import org.seasar.struts.annotation.Required;
import sample.dto.DiaryDto;
 
public class DiaryForm {
 
    /** 登録年月日(入力)*/
    @Required
    @DateType(datePattern="yyyy-MM-dd")
    public String date;
    
    /** 内容(入力)*/
    @Required
    public String content;
    
    /** イメージファイルパス(入力) */
    public FormFile imgFile;
    
    /** 日記一覧表示用(出力) */
    public List<DiaryDto> diaries;
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 
 
-
|
|
|
|
|
|
|
|
|
!
package sample.dto;
 
public class DiaryDto {
 
    /** dateプロパティ */
    public String date;
 
    /** contentプロパティ */
    public String content;
 
    /** imgfileurlプロパティ */
    public String imgfileurl;
}

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
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
-
|
!
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
!
|
!
|
|
|
-
|
|
!
|
|
-
|
-
|
|
|
|
|
!
|
!
|
|
-
|
|
|
|
|
|
-
|
!
|
!
!
package sample.action;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
 
import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.UploadUtil;
import org.seasar.struts.util.ServletContextUtil;
import org.seasar.struts.util.RequestUtil;
 
import sample.dto.DiaryDto;
import sample.entity.Diary;
import sample.form.DiaryForm;
import sample.service.DiaryService;
 
public class DiaryAction {
 
    //diaryテーブルアクセスサービス
    @Resource
    protected DiaryService diaryService;
    
    @ActionForm
    @Resource
    protected DiaryForm diaryForm;
    
    //日記登録画面表示アクションメソッド
    @Execute(validator = false)
    public String index() {
        return "entry.jsp";
    }
    
    //日記登録アクションメソッド
    @Execute(input = "entry.jsp")
    public String entry() {
        
        ServletContext app = ServletContextUtil.getServletContext();
        
        //ActionForm→Entityに変換コピーします。
        Diary e = form2entity(diaryForm);
        
        //日記テーブルの追加
        diaryService.insert(e);
        
        //ファイルサイズの上限チェックをしてからファイル出力します。
        HttpServletRequest req = RequestUtil.getRequest();
        if( UploadUtil.checkSizeLimit(req) ) {
            
            //ファイルの格納先フォルダの絶対パスを取得
            String path = app.getRealPath("/image/" + diaryForm.imgFile.getFileName());
            
            //ファイル書き込み(ファイルパスが空の場合は何もしません)
            UploadUtil.write(path, diaryForm.imgFile);
        }
        return list();
    }
    
    //日記一覧画面表示アクションメソッド
    @Execute(validator = false)
    public String list() {
        diaryForm.diaries = entity2dto(diaryService.findAll());
        return "list.jsp";
    }
    
    //Entity→DTOに変換
    private List<DiaryDto> entity2dto(List<Diary> entities) {
        List<DiaryDto> dtos = new ArrayList<DiaryDto>();
        for( Diary c : entities) {
            //日付型プロパティ("date")は、個別に変換方法を指定します。
            DiaryDto d = Beans.createAndCopy(DiaryDto.class, c)
                              .dateConverter("yyyy-MM-dd", "date")
                              .execute();
            dtos.add(d);
        }
        return dtos;
    }
    
    //ActionForm→Entityに変換
    private Diary form2entity(DiaryForm f) {
        //ActionForm→Entityに変換コピーします。
        //formFileプロパティは除外して、個別にコピーします。
        Diary e = Beans.createAndCopy(Diary.class, f)
                       .sqlDateConverter("yyyy-MM-dd", "date")
                       .excludes("formFile")
                       .execute();
        if( !f.imgFile.getFileName().isEmpty() ) {
            e.imgfileurl = "/image/" + f.imgFile.getFileName();
        }
        return e;
    }
}
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
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
-
|
!
|
|
|
|
|
|
-
|
|
-
|
|
-
|
|
|
!
|
!
!
import java.util.Date;
import sample.entity.Diary;
import sample.entity.DiaryNames;
 
/**
 * {@link Diary}のサービスクラスです。
 * 
 * @author S2JDBC-Gen
 */
public class DiaryService extends AbstractService<Diary> implements DiaryNames {
 
    /**
     * 識別子でエンティティを検索します。
     * 
     * @param date
     *            識別子
     * @return エンティティ
     */
    public Diary findById(Date date) {
        return select().id(date).getSingleResult();
    }
    
    /**
     * 日記をマージします。
     * @param in 画面入力
     * @return 結果影響行数
     */
    public int merge(Diary in) {
        int affectedRowNum=0;
        Diary org = findById(in.date);
        if( org  * null ) {
            //新規追加
            affectedRowNum = insert(in);
        } else {
            //同じ日付の日記データがあれば、内容に追記して更新
            in.content = org.content + in.content;
            affectedRowNum = update(in);
        }
        return affectedRowNum;
    }
}

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.entity;
 
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
 
/**
 * Diaryエンティティクラスです。
 * 
 * @author S2JDBC-Gen
 */
@Entity
public class Diary {
 
    /** dateプロパティ */
    @Id
    /*@GeneratedValue*/
    @Temporal(TemporalType.DATE)
    @Column(nullable = false, unique = true)
    public Date date;
 
    /** contentプロパティ */
    @Lob
    @Column(length = 65535, nullable = false, unique = false)
    public String content;
 
    /** imgfileurlプロパティ */
    @Column(length = 255, nullable = true, unique = false)
    public String imgfileurl;
}

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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Web日記</title>
</head>
<body>
<h1>2-4のサンプル Web日記</h1>
 
  <c:forEach var="e" varStatus="s" items="${diaries}">
  <table border="1">
    <tr>
      <td colspan="2">${f:h(e.date)}</td>
    </tr>
    <tr>
      <td>${f:h(e.content)}</td>
      <c:if test="${fn:length(e.imgfileurl)>0}" >
      <td><html:img page="${f:h(e.imgfileurl)}" /></td>
      </c:if>
    </tr>
  </table>
  </c:forEach>
 
</body>
</html>

添付ファイル: filesupersample2-4_5.jpg 440件 [詳細] filesupersample2-4_4.jpg 387件 [詳細] filesupersample2-4_3.jpg 398件 [詳細] filesupersample2-4_2.jpg 563件 [詳細] filesupersample2-4_1.jpg 432件 [詳細]

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