接下來開始講解如何用三層架構(gòu)來建立用戶登錄過程.
這個(gè)過程用一般的編程方式寫起來很簡單,從這里入手來講解三層架構(gòu)的實(shí)例,想必大家都會更容易了解其中的邏輯結(jié)構(gòu).
首先我們做一些準(zhǔn)備工作,構(gòu)造這個(gè)業(yè)務(wù)需要用到的幾個(gè)類,其中包括三個(gè)部分:
User部分的實(shí)體類MOD_User,單表數(shù)據(jù)訪問類DAL_User
UserLog部分的單表數(shù)據(jù)訪問類DAL_UserLog
User業(yè)務(wù)相關(guān)的業(yè)務(wù)邏輯類BLL_User,多表數(shù)據(jù)訪問類MUL_User
好,我們開始準(zhǔn)備第一部分.
[User] 表的結(jié)構(gòu)如下
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserAccount] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[UserPassword] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[UserPower] [int] NOT NULL,
[LogCount] [int] NULL,
[UserDate] [datetime] NULL,
以[User]表生成一個(gè)實(shí)體類MOD_User,文件名為MOD_User.asp,放在/Class/MOD/目錄下,內(nèi)容如下,請大家熟悉一下property的寫法
class MOD_User
' ******[User] database field
private lngUserID '[int] NOT NULL
private strUserAccount '[ntext] 用戶登錄名
private strUserPassword '[ntext] 密碼
private strUserName '[ntext] 用戶名稱
private intUserPower '[int] 權(quán)限
' ==============================================================================
' Class Initialize, Terminate
' ==============================================================================
Private Sub Class_Initialize
End Sub
Private Sub Class_Terminate
End Sub
' ==============================================================================
' property in/out
' ==============================================================================
Public Property Let UserID(ByVal Value )
lngUserID = Convert.ToLng(Value)
End Property
Public Property Get UserID
UserID = lngUserID
End Property
Public Property Let UserAccount(ByVal Value )
strUserAccount = trim(Value)
End Property
Public Property Get UserAccount
UserAccount = strUserAccount
End Property
Public Property Let UserPassword(ByVal Value )
strUserPassword = trim(Value)
End Property
Public Property Get UserPassword
UserPassword = strUserPassword
End Property
Public Property Let UserName(ByVal Value )
strUserName = trim(Value)
End Property
Public Property Get UserName
UserName = strUserName
End Property
Public Property Let UserPower(ByVal Value )
intUserPower = Convert.ToInt(Value)
End Property
Public Property Get UserPower
UserPower = intUserPower
End Property
end class
Convert 對象在此出現(xiàn)的比較多.
實(shí)體類的好處之一就在這里,把值填充到類的屬性中,可以將變量轉(zhuǎn)換的工作完全交給這個(gè)實(shí)體類,在程序中使用的時(shí)候就不用再來來去去地轉(zhuǎn)換了.
所以鼓勵(lì)大家用Property代替Public操作.
Appdb系統(tǒng)會有一個(gè)功能,通過已有的數(shù)據(jù)表,直接生成對應(yīng)的MOD類的代碼,它會自己用Property構(gòu)造如上同樣的實(shí)體類,而且會根據(jù)字段類型不同自己選擇不同的Convert方法進(jìn)行轉(zhuǎn)換. 有了這個(gè)工具,就可以節(jié)省大量的重復(fù)性的基礎(chǔ)工作了,這個(gè)工具也是為三層架構(gòu)而產(chǎn)生的,其他語言的編程工具中都有這樣的功能,咱也不能缺.
以[User]表生成一個(gè)單表數(shù)據(jù)訪問類DAL_User,文件名為DAL_User.asp,放在/Class/DAL/目錄下,內(nèi)容如下:
class DAL_User
' ******[User] database field
private lngUserID '[int] NOT NULL
private strUserAccount '[ntext]
private strUserPassword '[ntext]
private strUserName '[ntext]
private intUserPower '[int]
private strSql 'Sql query
private rs_User 'Dataset for poheader
' ==============================================================================
' Class Initialize, Terminate
' ==============================================================================
Private Sub Class_Initialize
set rs_User=server.createobject("adodb.recordset")
End Sub
Private Sub Class_Terminate
set rs_User=nothing
End Sub
' ///////////////////////////////////////////////////////////////////////////////
' Get Data / dataset
' ///////////////////////////////////////////////////////////////////////////////
Public Function CheckLogin(ByRef vMUser)
strSql = " select top 1 * from [User] where UserAccount='" & page.ToSql(vMUser.UserAccount) & "'"
rs_User.Open strSql,Data.conn,1,1
if rs_User.bof and rs_User.eof then
e.Add " This User does not exit ! "
CheckLogin = false
else
if rs_User("UserPassword") = vMUser.UserPassword then
vMUser.UserID = rs_User("UserID")
vMUser.UserName = rs_User("UserName")
vMUser.UserPower = rs_User("UserPower")
CheckLogin = true
else
e.Add " Wrong password ! "
CheckLogin = false
end if
end if
rs_User.close
End Function
' ///////////////////////////////////////////////////////////////////////////////
' Update Table
' ///////////////////////////////////////////////////////////////////////////////
' ///////////////////////////////////////////////////////////////////////////////
' Show UI / Show-select
' ///////////////////////////////////////////////////////////////////////////////
end class
需要解說一下的是DAL_User類中的CheckLogin方法.
這個(gè)方法接納一個(gè)參數(shù)(ByRef vMUser), vMUser 是一個(gè)MOD_User實(shí)例化之后一個(gè)實(shí)體對象,實(shí)例化語句為:
set MUser = new MOD_User
在BLL_User中會調(diào)用上面這個(gè)CheckLogin方法,將MUser傳遞給DAL_User.CheckLogin, 就是這里的ByRef vMUser了,習(xí)慣上我把函數(shù)的參數(shù)名前面加一個(gè)v.
具體的實(shí)現(xiàn)過程請看后面的用戶登錄過程的實(shí)施階段.
這個(gè)地方有個(gè)需要討論的疑點(diǎn),就是實(shí)體類作為傳值參數(shù)時(shí),是應(yīng)該用ByRef還是ByVal.
在vbscript中,一個(gè)實(shí)例化的對象在被set給另外一個(gè)實(shí)例名以后,雖然名稱不同,但是仍然是指向同一個(gè)內(nèi)存地址,換了湯沒換藥. 所以在這里用ByRef ByVal效果是一模一樣的.
但是為了在程序的邏輯上的清晰,在此使用ByRef,以示這個(gè)vMUser實(shí)體類在這里被加工后,仍然會被調(diào)用它的程序繼續(xù)使用.
Private Sub Class_Initialize 和 Private Sub Class_Terminate應(yīng)該不用解釋了吧,如果不甚了解,可以去看看vbscript語法
不知道你有沒有注意到這句: page.ToSql(vMUser.UserAccount)
page是另一個(gè)比較重要的通用類,用來處理頁面上常用的操作,例如這里的ToSql就是將一個(gè)字符串加工成為安全的SQL參數(shù),實(shí)施單引號替換為兩個(gè)單引號等操作. 這個(gè)類我還沒有完善,所以就不貼出來獻(xiàn)丑了,也算作為大家來學(xué)習(xí)三層架構(gòu)的作業(yè),自己構(gòu)造一個(gè)CON_Page類來用吧
還有兩個(gè)通用對象的身影:
Data.conn
e.Add " Wrong password ! "
大家可以對照前面幾章熟悉一下這兩個(gè)通用類.
另外有個(gè)注釋,如下:
' ///////////////////////////////////////////////////////////////////////////////
' Get Data / dataset
' ///////////////////////////////////////////////////////////////////////////////
這個(gè)給類中的不同的方法進(jìn)行分組的大分隔符,代碼中還有2個(gè)類似的.
原因是,我發(fā)現(xiàn)單表數(shù)據(jù)訪問類中的方法,其功能上基本上只有3組:
1.獲取單值或單記錄集
2.更新數(shù)據(jù)表的內(nèi)容
3.產(chǎn)生出放在UI上的HTML段,例如<option value=1></option>....之類
把這三組分開以后,再來查找某一個(gè)方法,比較容易定位.
只是一個(gè)個(gè)人習(xí)慣,大家可以各自發(fā)揮.
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點(diǎn)擊進(jìn)入論壇