jBrick 開發平台

星期一, 3月 13, 2006

使用者註冊的範例

在此再舉一個使用者註冊的完整範例,由於登入的範例是由UI說明至Server端的程式碼,在這個例子中,將由Server端先說明,最後再說明UI的程式,在此一範例中將會介紹到Server端要如何設計,使得Server端的程式可以再被重覆使用(由不同的流程設定,重覆使用Server程式)。

  • Operation Flow
    使用者輸入個人資料後,系統會先檢查帳號是否重覆,若重覆則傳回重覆的錯誤訊息;否則系統新增使用者帳號與群組的關係,最後新增使用者基本資料至使用者的表格內。
  • Table Schema

    • mbr_user

    • mbr_usergrp

  • Server Command

    • 查詢使用者資訊
      原始碼:

      package com.hclife.brm;

      import java.sql.Connection;
      import com.ecity.cmd.QueryCommand;
      import com.ecity.model.Model;
      import com.hclife.cfg.HCLIFE;

      public class QueryUserInfo extends QueryCommand
      {
      public QueryUserInfo()
      {
      super("HCLIFE");
      }

      public QueryUserInfo(Connection con)
      {
      super(con);
      setAutoCloseConnection(false);
      }

      public void generateSQL(Model model)
      {
      String strSQL = "";

      strSQL= "SELECT '' AS chk, userid, usertype, username, password, " +
      " mobilephone, tel1, tel1ext, tel2, " +
      " tel2ext, email, fax, addr, " +
      " activeflg, cmt, ref1, ref2, " +
      " ref3, ref4, ref5, createdtm " +
      " FROM " + HCLIFE.MBR_USER +
      " WHERE userid = ':USERID'" +
      " AND username = ':USERNAME'" +
      " AND username LIKE '%:USERNAME%'" +
      " AND activeflg = ':STATUS'" +
      " AND usertype = ':USERTYPE'";

      addSQL(getTarget(model,"USER_INFO"),
      strSQL,
      DATA_MODEL);
      }
      }

      說明:
      • 此程式為查詢使用者資訊的程式,所以需要繼承QueryCommand這個類別,使得開發者所以的SQL語法執行後可以傳回查詢結果。
      • 在Constructor有二個型式(Overloding),一個不傳值,另一個是傳入一個java.sql.Connection的類別,當不傳值時,會依據Constructor中的資料庫設定(在此一例子中,會使用HCLIFE這個資料庫的設定),以這種方式來產生的Command在執行完之後就會自動Commit或Rollback。當使用Workflow來作Flow Control時,因Workflow Engine會有Transaction的管理,故會用到第二個Constructor,使用的Connection會由Workfloe Engine傳入。
      • 為了能使此Command可以讓其他的程式共用,所以我們在SELECT的欄位列中會寫入所有的欄位名稱,故只要是查詢mbr_user這個表格的程式,均可共用此一Command。
      • 在FROM之後我並不直接寫Table的名稱,而是利用HCLIFE這個Class中所定義的常數,此種做法是日後系統如果移植到其他環境(例如不同的Schema或不用的Table命名)時,不需將所有的Command重新改寫,只要修改 HCLIFE這個Class即可。
      • 在設定SQL的查詢條件(即WHERE的條件)中,是以":" + 變數的方式來表示所要取得Model中的變數,在本例子中userid = ':USERID' 即會取後Model中的USERID來置換變數內容,假設Model中的USERID為ecity則此一段的SQL會被取代為userid = 'ecity',其餘的寫法均與一般的SQL的寫法一樣,字串會在變數前後加'來表示。
      • 在組完所要執行的SQL Statement之後,需要透過addSQL這個method來將此一SQL加入此一Command中的執行佇列,一個Command可以依序執行多個SQL Statement,但為了能提高共用程度,我並不建議使用多個SQL Statement,而是利用Workflow來設定所要執行的Command流程。因執行結果會被放入Model中,所以在addSQL時需要指定要放入Model中時所要存放的Key值,在此我們用了getTarget(model, "USER_INFO")這個method,當前台(Client)的程式有指定所要放置的Key值時,會使用前台所設定的,若無則用USER_INFO這個Key值來當成預設值。


    • 新增使用者與群組對應
      原始碼:

      package com.hclife.brm;

      import java.sql.Connection;

      import com.ecity.cmd.UpdateCommand;

      import com.ecity.model.Model;
      import com.hclife.cfg.*;


      public class InsertUserGroup extends UpdateCommand
      {
      public InsertUserGroup()
      {
      super("HCLIFE");
      }

      public InsertUserGroup (Connection con)
      {
      super(con);
      setAutoCloseConnection(false);
      }

      public void generateSQL(Model model)
      {
      String strSQL = "";

      strSQL = "INSERT INTO " + HCLIFE.MBR_USERGRP + "(usergid, userid) " +
      " VALUES(':USERGID', ':USERID')";

      addSQL(strSQL);
      }
      }

      說明:
      • 此範例為新增一筆使用者與使用者群組關係的程式,因為異動到資料庫中的資料,所以需要繼承UpdateCommand這個類別,只要是需要異動到資料(例如:Insert / Update / Delete)均需繼承這一個類別。
      • 在異動資料庫的程式並不會傳回結果集(ResultSet),我們不需指定所要存放的Key值,在範例中與Query不同處是在addSQL這個method,在UpdateCommand中只需傳入所要執行的SQL Statement即可。


    • 新增使用者
      原始碼:

      package com.hclife.brm;

      import java.sql.*;

      import com.ecity.cmd.*;
      import com.ecity.model.*;

      import com.hclife.cfg.*;

      public class InsertUser extends UpdateCommand
      {
      public InsertUser()
      {
      super("HCLIFE");
      }

      public InsertUser(Connection con)
      {
      super(con);
      setAutoCloseConnection(false);
      }

      public void generateSQL(Model model)
      {
      String strSQL = "";

      strSQL = "INSERT INTO mbr_user(userid, usertype, username, password, " +
      " nickname, mobilephone, tel1, " +
      " tel1ext, tel2, tel2ext, email, " +
      " fax, addr, activeflg, cmt, " +
      " ref1, ref2, ref3, ref4, " +
      " ref5, createdtm) " +
      " VALUES(':USERID', :USERTYPE, ':USERNAME', ':PASSWORD', " +
      " ':NICKNAME', ':MOBILEPHONE', ':TEL1', " +
      " ':TEL1EXT', ':TEL2', ':TEL2EXT', ':EMAIL', " +
      " ':FAX', ':ADDR', :'ACTIVEFLG', ':CMT', " +
      " ':REF1', ':REF2', ':REF3', ':REF4', " +
      " ':REF5', :CREATEDTM)";

      addSQL(strSQL);
      }
      }

      說明:
      • 此一範例程式為新增一筆使用者資料到mbr_user這個表格中。

  • UI Form

  • Workflow Config

27 Comments:

張貼留言

<< Home