Top > SAStrutsあれこれ > 2-2 会員登録をしよう

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CREATE TABLE `sastruts`.`member` (
  `name` VARCHAR(16) NOT NULL,
  `mail` VARCHAR(255) NOT NULL,
  `password` VARCHAR(32) NOT NULL,
  `address` VARCHAR(255) NOT NULL,
  `tel` VARCHAR(12) NOT NULL,
  `birth` DATE NOT NULL,
  PRIMARY KEY (`mail`)
)
ENGINE = InnoDB;
 
CREATE TABLE `sastruts`.`roles` (
  `mail` VARCHAR(255) NOT NULL,
  `role` VARCHAR(32) NOT NULL,
  INDEX `Index_1`(`mail`)
)
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="member|roles"
    />
-------------
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
 
 
 
 
 
    /** mailプロパティ */
    @Id
    /*@GeneratedValue*/
    @Column(length = 255, nullable = false, unique = true)
    public String mail;

  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
 
 
errors.phone={0}は電話番号({1})として不正です。
errors.already=そのメールアドレスは既に登録されています。
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
 
 
 
 
 
    <global-exceptions>
      <exception key="errors.already" 
          type="sample.exception.AlreadyEntryException"
          path="/WEB-INF/view/member/memberEntry.jsp"/>
    </global-exceptions>

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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>2-2のサンプル<br>データベースの更新</h1>
<html:errors/>
<s:form>
  <table>
    <tr>
      <td>氏名</td>
      <td><html:text property="name"/></td>
    </tr>
    <tr>
      <td>メールアドレス</td>
      <td><html:text property="mail"/></td>
    </tr>
    <tr>
      <td>パスワード(今回の例ではMD5で暗号化しています)</td>
      <td><html:password property="password" redisplay="false"/></td>
    </tr>
    <tr>
      <td>住所</td>
      <td><html:text property="address"/></td>
    </tr>
    <tr>
      <td>電話番号(99-9999-9999)</td>
      <td><html:text property="tel"/></td>
    </tr>
    <tr>
      <td>生年月日(YYYY-MM-DDでお願いします。1980-03-02)</td>
      <td><html:text property="birth"/></td>
    </tr>
    <tr>
      <td>
        <html:submit property="entry" value="登録"/>
      </td>
    </tr>
  </table>
</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
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
package sample.form;
 
import org.seasar.struts.annotation.Arg;
import org.seasar.struts.annotation.DateType;
import org.seasar.struts.annotation.EmailType;
import org.seasar.struts.annotation.Mask;
import org.seasar.struts.annotation.Msg;
import org.seasar.struts.annotation.Required;
 
public class MemberForm {
 
    /** 氏名 */
    @Required
    public String name;
    
    /** Eメール */
    @Required
    @EmailType
    public String mail;
 
    /** パスワード */
    @Required
    public String password;
    
    /** 住所 */
    @Required
    public String address;
    
    /** 電話番号 */
    @Required
    @Mask(mask = "^\\d{2}-\\d{2,4}-\\d{4}$", msg = @Msg(key = "errors.phone"), args = @Arg(key = "99-9999-9999", resource = false, position = 1))
    public String tel;
    
    /** 生年月日 */
    @Required
    @DateType(datePattern="yyyy-MM-dd")
    public String birth;
}

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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
!
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
!
package sample.action;
 
import java.security.NoSuchAlgorithmException;
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.entity.Member;
import sample.entity.Roles;
import sample.exception.AlreadyEntryException;
import sample.form.MemberForm;
import sample.service.DigestService;
import sample.service.MemberService;
import sample.service.RolesService;
 
public class MemberAction {
    
    @Resource
    protected MemberService memberService;
 
    @Resource
    protected RolesService rolesService;
    
    @Resource
    protected DigestService digestService;
 
    @ActionForm
    @Resource
    protected MemberForm memberForm;
    
    //登録画面の表示
    @Execute(validator = false)
    public String index() {
        return "memberEntry.jsp";
    }
    
    //会員登録処理と登録確認画面の表示
    @Execute(input="memberEntry.jsp")
    public String entry() throws AlreadyEntryException {
        
        // 1) 日付型のプロパティについては、個別に変換方法を指定します。
        Member emp = Beans
                       .createAndCopy(Member.class, memberForm)
                       .sqlDateConverter("yyyy-MM-dd", "birth")
                       .execute();
        
        // 入力された文字列のダイジェスト文字列を取得します。
        emp.password = digestService.md5(emp.password);
        
        // 会員テーブルに追加
        memberService.insertWithCheck(emp);
        
        // 2) 役割テーブルに追加
        Roles roles = Beans
                        .createAndCopy(Roles.class, memberForm)
                        .execute();
        roles.role = "user";
        rolesService.insert(roles);
        
        return "complete.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
 
 
 
 
 
-
|
|
|
|
|
|
|
-
|
|
-
|
|
|
|
|
-
|
!
-
|
!
|
!
!
package sample.service;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class DigestService {
    
    /**
     * 入力された文字列をMD5でハッシュして、ダイジェスト文字列を返します。
     * @param src ソース文字列
     * @return ダイジェスト文字列
     * @throws NoSuchAlgorithmException
     */
    public String md5(String src) {
        
        String rtn = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(src.getBytes());
            byte[] digest = md.digest();
 
            //ダイジェストを文字列に変換します。
            for (int i = 0; i < digest.length; i++) {
                rtn += String.format("%02x", digest[i]);
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return rtn;
    }
}

Everything is expanded.Everything is shortened.
  1
  2
  3
 
-
!
package sample.exception;
public class AlreadyEntryException extends RuntimeException {
}
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.service;
 
import sample.entity.Member;
import sample.entity.MemberNames;
import sample.exception.AlreadyEntryException;
 
/**
 * {@link Member}のサービスクラスです。
 * 
 * @author S2JDBC-Gen
 */
public class MemberService extends AbstractService<Member> implements MemberNames {
 
     /**
     * 識別子でエンティティを検索します。
     * 
     * @param mail
     *            識別子
     * @return エンティティ
     */
    public Member findById(String mail) {
        return select().id(mail).getSingleResult();
    }
 
    //2重登録チェックを行ってから挿入します。
    public int insertWithCheck(Member entity) throws AlreadyEntryException {
        
        //メールアドレスでMemberテーブルを検索、ヒットした場合(>0)
        //2重登録とみなす。
        if( select().id(entity.mail).getCount()>0 ) {
            throw new AlreadyEntryException();
        }
        return insert(entity);
    }
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 
 
 
 
 
 
 
 
 
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>2-2のサンプル<br>データベースの更新</h1>
${f:h(name)}さん<br>
ご登録ありがとうございました。
</body>
</html>

添付ファイル: filesupersample2-2_5.jpg 518件 [詳細] filesupersample2-2_4.jpg 421件 [詳細] filesupersample2-2_3.jpg 448件 [詳細] filesupersample2-2_2.jpg 562件 [詳細] filesupersample2-2_1.jpg 496件 [詳細]

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