三層結(jié)構(gòu)開發(fā)模式_第1頁
三層結(jié)構(gòu)開發(fā)模式_第2頁
三層結(jié)構(gòu)開發(fā)模式_第3頁
三層結(jié)構(gòu)開發(fā)模式_第4頁
三層結(jié)構(gòu)開發(fā)模式_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第14章 三層結(jié)構(gòu)開發(fā)模式14.1三層結(jié)構(gòu)概述14.1.1兩層結(jié)構(gòu)及其局限性前面我們講述的web應(yīng)用程序都是基于兩層結(jié)構(gòu)的,它們有如下特點(diǎn):l 數(shù)據(jù)庫訪問和用戶類型判斷邏輯放在一起實(shí)現(xiàn)。l 用戶界面層直接調(diào)用數(shù)據(jù)訪問實(shí)現(xiàn)。l 整個系統(tǒng)功能放在同一項(xiàng)目中實(shí)現(xiàn)。傳統(tǒng)的兩層結(jié)構(gòu)的特點(diǎn)是用戶界面層直接與數(shù)據(jù)庫進(jìn)行交互,還要進(jìn)行業(yè)務(wù)規(guī)則、合法性校驗(yàn)等工作。兩層結(jié)構(gòu)軟件模型如圖18-2所示。這種結(jié)構(gòu)存在著很多局限性,比如:一旦用戶的需求發(fā)生變化,應(yīng)用程序都需要進(jìn)行大量修改,甚至需要重新開發(fā),給系統(tǒng)的維護(hù)和升級帶來了極大的不便;用戶界面層直接訪問數(shù)據(jù)庫,會帶來很多安全隱患。為了克服兩層結(jié)構(gòu)的局限性提出了三層

2、結(jié)構(gòu)。14.1.2什么是三層結(jié)構(gòu)所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫之間加入了一個“中間層”,也叫組件層。這里所說的三層體系,不是指物理上的三層,不是簡單地放置三臺機(jī)器就是三層體系結(jié)構(gòu),也不僅僅有b/s應(yīng)用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即使這三個層放置到一臺機(jī)器上。通用三層結(jié)構(gòu)軟件模型如圖18-2所示。中間層通常包括業(yè)務(wù)邏輯層(business logic layer,簡稱bll)、數(shù)據(jù)訪問層(database access layer,簡稱dal)和數(shù)據(jù)對象模型層(database object model layer,簡稱dom)。此時(shí)的三層結(jié)構(gòu)軟件模型如圖18-2所示。用戶界面

3、(user interface,簡稱ui),也稱表示層,位于最上層,用于顯示和接收用戶提交的數(shù)據(jù),為用戶提供交互式的界面。表示層一般為windows窗體應(yīng)用程序或web應(yīng)用程序。業(yè)務(wù)邏輯層是表示層和數(shù)據(jù)訪問層之間溝通的橋梁,主要負(fù)責(zé)數(shù)據(jù)的傳遞和處理。數(shù)據(jù)訪問層主要實(shí)現(xiàn)對數(shù)據(jù)的讀取、保存和更新等操作。數(shù)據(jù)對象模型層即業(yè)務(wù)實(shí)體層。主要用于表示數(shù)據(jù)存儲的持久對象。在實(shí)際應(yīng)用程序中的實(shí)體類是跟數(shù)據(jù)庫中的表相對應(yīng)的,也就是說一個表會有一個對應(yīng)的實(shí)體類。當(dāng)然有些三層結(jié)構(gòu)并不包含單獨(dú)的數(shù)據(jù)對象模型層,而將其功能分解到業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層之中。在三層結(jié)構(gòu)中,表示層直接依賴于業(yè)務(wù)邏輯層;業(yè)務(wù)邏輯層直接依賴于數(shù)

4、據(jù)訪問層;數(shù)據(jù)訪問層直接依賴于數(shù)據(jù)對象模型層。14.1.3 三層結(jié)構(gòu)的優(yōu)點(diǎn)三層結(jié)構(gòu)主要體現(xiàn)出對程序分而治之的思想:數(shù)據(jù)訪問層只負(fù)責(zé)提供原原始數(shù)據(jù),并不需要了解業(yè)務(wù)邏輯;業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問層提供的方法自定義一些業(yè)務(wù)邏輯,對數(shù)據(jù)進(jìn)行加工,本身不需要了解數(shù)據(jù)訪問層的實(shí)現(xiàn);表示層直接調(diào)用業(yè)務(wù)邏輯提供的方法把數(shù)據(jù)呈現(xiàn)給用戶。三層結(jié)構(gòu)的優(yōu)點(diǎn)在于不必為了業(yè)務(wù)邏輯上的微小變化而遷至整個程序的修改,只需要修改商業(yè)邏輯層中的一個函數(shù)或一個過程;增強(qiáng)了代碼的可重用性;便于不同層次的開發(fā)人員之間的合作,只要遵循一定的接口標(biāo)準(zhǔn)就可以進(jìn)行并行開發(fā)了,最終只要將各個部分拼接到一起構(gòu)成最終的應(yīng)用程序。三層結(jié)構(gòu)的應(yīng)用程序?qū)?/p>

5、業(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,客戶端不直接與數(shù)據(jù)庫進(jìn)行交互,而是通過com/dcom通訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交互,這樣會大大提高系統(tǒng)的安全性。三層結(jié)構(gòu)的應(yīng)用程序更能夠適應(yīng)企業(yè)級應(yīng)用日益增長的復(fù)雜度和靈活性的要求,并且通過軟件分層的高內(nèi)聚、低耦合的原則,實(shí)現(xiàn)擴(kuò)展、維護(hù)和重用的要求,可以大大提高開發(fā)效率。14.2用asp.net搭建三層結(jié)構(gòu)框架asp.net 可以使用.net平臺快速方便的搭建三層結(jié)構(gòu)。asp.net革命性的變化是在網(wǎng)頁中也使用基于事件的處理,可以指定處理的后臺代碼文件,可以使用c#、vb作為后臺代碼語言。.net中可以

6、方便的實(shí)現(xiàn)組件的裝配,后臺代碼通過命名控件可以方便的使用自己定義的組件。表示層放在 web窗體中,業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層和數(shù)據(jù)對象模型層用類庫來實(shí)現(xiàn),這樣就很方便的實(shí)現(xiàn)了三層結(jié)構(gòu)。1新建解決方案打開vs 2008,新建一個"空白解決方案",將其命名為"threelayers "。2搭建表示層(網(wǎng)站)(1)在"解決方案資源管理器"中,在解決方案名稱上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加""新建網(wǎng)站"命令,新建一個網(wǎng)站,其存放位置為解決方案文件夾下的myweb子文件夾。(2)在該網(wǎng)站下建一個數(shù)

7、據(jù)庫(簡單起見可建access數(shù)據(jù)庫),以備存取數(shù)據(jù)。3搭建業(yè)務(wù)邏輯層(類庫)在"解決方案資源管理器"中,新建一個"類庫"項(xiàng)目。填寫項(xiàng)目的名稱為" businesslogiclayer ",該項(xiàng)目用于實(shí)現(xiàn)業(yè)務(wù)邏輯。4搭建數(shù)據(jù)訪問層(類庫)在"解決方案資源管理器"中,新建一個"類庫"項(xiàng)目。填寫項(xiàng)目的名稱為" dataaccesslayer ",該項(xiàng)目用于實(shí)現(xiàn)數(shù)據(jù)訪問層。5搭建數(shù)據(jù)對象模型層(類庫)在"解決方案資源管理器"中,新建一個"類庫"

8、;項(xiàng)目。填寫項(xiàng)目的名稱為"models",該項(xiàng)目用于實(shí)現(xiàn)數(shù)據(jù)實(shí)體。至此,已搭建了三層結(jié)構(gòu)(添加了4個項(xiàng)目)。5添加各層之間的依賴(引用)此時(shí),雖然三層結(jié)構(gòu)的基本框架已經(jīng)搭建成功,但是各層之間是獨(dú)立的。只有添加依賴關(guān)系,才能讓它們相互協(xié)作。(1) 添加表示層對業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層和數(shù)據(jù)對象模型層的依賴。(2)添加業(yè)務(wù)邏輯層對數(shù)據(jù)訪問層和數(shù)據(jù)對象模型層的依賴。(3)添加業(yè)數(shù)據(jù)訪問層對數(shù)據(jù)對象模型層的依賴。至此,三層結(jié)構(gòu)及各層之間的依賴關(guān)系創(chuàng)建完畢。6將表示層設(shè)置為啟動項(xiàng)目通過上述步驟,就已經(jīng)成功部署了asp.net的三層架構(gòu)。表示層myweb網(wǎng)站放置用于顯示的web頁面;事務(wù)

9、邏輯層businesslogiclayer項(xiàng)目,我們把所有的業(yè)務(wù)邏輯代碼在該層實(shí)現(xiàn);數(shù)據(jù)訪問層dataaccesslayer項(xiàng)目主要處理數(shù)據(jù)庫的操作,供事務(wù)邏輯層調(diào)用;數(shù)據(jù)對象模型層models項(xiàng)目實(shí)現(xiàn)數(shù)據(jù)實(shí)體類,供其它各層調(diào)用。只要在各個層中實(shí)現(xiàn)具體的類就可以成功實(shí)施三層結(jié)構(gòu)的應(yīng)用程序了。14.3應(yīng)用舉例14.3.1系統(tǒng)分析本例的功能非常簡單,只是實(shí)現(xiàn)用戶登錄與注冊的功能,用戶信息存放在數(shù)據(jù)庫中,旨在體現(xiàn)如何在asp.net實(shí)現(xiàn)三層結(jié)構(gòu)。表示層myweb網(wǎng)站放置用于顯示的web頁面;事務(wù)邏輯層businesslogiclayer項(xiàng)目,我們把所有的業(yè)務(wù)邏輯代碼在該層實(shí)現(xiàn);數(shù)據(jù)訪問層dataac

10、cesslayer項(xiàng)目主要處理數(shù)據(jù)庫的操作,供事務(wù)邏輯層調(diào)用;數(shù)據(jù)對象模型層models項(xiàng)目實(shí)現(xiàn)數(shù)據(jù)實(shí)體類,供其它各層調(diào)用。各層次之間的調(diào)用(引用)關(guān)系如表所示。層項(xiàng)目名稱用途引用關(guān)系實(shí)例文件界面展示myweb(網(wǎng)站)web頁面和控件businesslogiclayerdataaccesslayermodelsdefault.aspxwelcome.aspxregister.aspx業(yè)務(wù)邏輯businesslogiclayer負(fù)責(zé)登錄,注冊用戶,獲取用戶列表等業(yè)務(wù)操作dataaccesslayermodelsblluser.cs userrole.cs數(shù)據(jù)訪問dataaccesslayer調(diào)用

11、dataprovider相關(guān)方法修改或獲取數(shù)據(jù)。modelsdataprovider.csdaluser.cs業(yè)務(wù)實(shí)體models定義對象實(shí)體類無tuser.cs14.3.2創(chuàng)建框架1. 建立數(shù)據(jù)庫打開access創(chuàng)建名為userinfo.mdb的數(shù)據(jù)庫,并為其創(chuàng)建一個名為t_user的表,其結(jié)構(gòu)如圖所示。2. 新建解決方案打開vs 2008,依次選擇"文件""新建""項(xiàng)目"命令,打開"新建項(xiàng)目"對話框中,然后選擇項(xiàng)目類型為"visual studio解決方案",選擇模板為"空白解決方

12、案"。然后填寫解決方案的名稱為"threelayers ",并指定保存位置,如圖18-4所示。單擊“確定”按鈕,創(chuàng)建解決方案。3. 搭建表示層(1)在"解決方案資源管理器"中,在解決方案名稱上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加""新建網(wǎng)站"命令,如圖18-8所示。(2)在打開的"添加新網(wǎng)站"對話框中,選擇"asp.net網(wǎng)站",選擇位置為"文件系統(tǒng)",并設(shè)置網(wǎng)站的路徑,如圖18-9所示。(3)設(shè)計(jì)default.aspx如圖所示。(4)添

13、加一web窗體,將其命名為welcome.aspx,其設(shè)計(jì)視圖如圖所示。(5)添加一web窗體,將其命名為register.aspx,其設(shè)計(jì)視圖如圖所示。(6)將建好的userinfo.mdb拷貝到站點(diǎn)的app_data文件夾下。(7)添加global.asax在其application_start()添加如下代碼。void application_start(object sender, eventargs e) /在應(yīng)用程序啟動時(shí)運(yùn)行的代碼 /應(yīng)用程序運(yùn)行時(shí)設(shè)置數(shù)據(jù)庫路徑。 string dbpath = this.server.mappath("/") + "

14、;app_datauserinfo.mdb" dataaccesslayer.dataprovider.instance.dbpath = dbpath; 4. 搭建業(yè)務(wù)邏輯層(類庫)在"解決方案資源管理器"中,在解決方案名稱上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加""新建項(xiàng)目"命令,打開"新建項(xiàng)目"對話框中,然后選擇項(xiàng)目類型為"visual c#",選擇模板為"類庫"。填寫項(xiàng)目的名稱為" businesslogiclayer ",該項(xiàng)目用于

15、實(shí)現(xiàn)業(yè)務(wù)邏輯。此時(shí)項(xiàng)目的保存位置已經(jīng)默認(rèn)輸入了,是剛才創(chuàng)建空白解決方案時(shí)產(chǎn)生的路徑,如圖18-6所示。5. 搭建數(shù)據(jù)訪問層(類庫)在"解決方案資源管理器"中,在解決方案名稱上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加""新建項(xiàng)目"命令,打開"新建項(xiàng)目"對話框中,然后選擇項(xiàng)目類型為"visual c#",選擇模板為"類庫"。填寫項(xiàng)目的名稱為dataaccesslayer",該項(xiàng)目用于實(shí)現(xiàn)數(shù)據(jù)訪問層。此時(shí)項(xiàng)目的保存位置已經(jīng)默認(rèn)輸入了,是剛才創(chuàng)建空白解決方案時(shí)產(chǎn)生的路徑。

16、6. 搭建數(shù)據(jù)對象模型層(類庫)在"解決方案資源管理器"中,在解決方案名稱上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加""新建項(xiàng)目"命令,打開"新建項(xiàng)目"對話框中,然后選擇項(xiàng)目類型為"visual c#",選擇模板為"類庫"。填寫項(xiàng)目的名稱為"models",該項(xiàng)目用于實(shí)現(xiàn)數(shù)據(jù)訪問層。此時(shí)項(xiàng)目的保存位置已經(jīng)默認(rèn)輸入了,是剛才創(chuàng)建空白解決方案時(shí)產(chǎn)生的路徑,如圖18-6所示。至此,已搭建了三層結(jié)構(gòu)(添加了4個項(xiàng)目),此時(shí)的解決方案如圖所示。7. 添加各層之間的

17、引用(依賴)此時(shí),雖然三層結(jié)構(gòu)的基本框架已經(jīng)搭建成功,但是各層之間是獨(dú)立的。只有添加依賴關(guān)系,才能讓它們相互協(xié)作。(1) 添加表示層對業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層和數(shù)據(jù)對象模型層的依賴。在"解決方案資源管理器"中,在表示層上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加引用"命令,打開"添加引用"對話框,然后選擇"項(xiàng)目"選項(xiàng)卡,選中項(xiàng)目名稱為" businesslogiclayer "的項(xiàng)目,單擊"確定"按鈕,如圖18-13所示。同樣添加對dataaccesslayer和models的

18、引用。(2)添加業(yè)務(wù)邏輯層對數(shù)據(jù)訪問層和數(shù)據(jù)對象模型層的依賴。在"解決方案資源管理器"中,在業(yè)務(wù)邏輯層上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"添加引用"命令,打開"添加引用"對話框,然后選擇"項(xiàng)目"選項(xiàng)卡,選中項(xiàng)目名稱為" dataaccesslayer "的項(xiàng)目,單擊"確定"按鈕。同樣添加對models的引用。(3)添加數(shù)據(jù)訪問層對數(shù)據(jù)對象模型層的依賴。至此,三層結(jié)構(gòu)及各層之間的依賴關(guān)系創(chuàng)建完畢?,F(xiàn)在你的threelayers解決方案資源管理器應(yīng)該如圖所示:8. 將表示層設(shè)

19、置為啟動項(xiàng)目運(yùn)行程序前,還需設(shè)置啟動項(xiàng)目。在"解決方案資源管理器"中的表示層上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇"設(shè)為啟動項(xiàng)目"命令,將表示層設(shè)置為啟動項(xiàng)目。將表示層設(shè)置為啟動項(xiàng)目后,表示層(站點(diǎn))自動創(chuàng)建了bin文件夾,該文件夾下生成了:businesslogiclayer.dll、businesslogiclayer.pdb、dataaccesslayer.dll、dataaccesslayer.pdb、models.dll和models.pdb等6個文件,如圖所示。通過上述步驟,就已經(jīng)成功部署了asp.net的三層架構(gòu)。在myweb這一層我們放置

20、用于顯示的web頁面,在 business層,我們把所有的業(yè)務(wù)邏輯代碼在該層實(shí)現(xiàn)。dataaccess層主要處理數(shù)據(jù)庫的操作,供business層調(diào)用。只要在各個層中實(shí)現(xiàn)具體的類就可以成功實(shí)施三層結(jié)構(gòu)的應(yīng)用程序了。14.3.3在各個層中實(shí)現(xiàn)具體的類1. models中的類models中的類為實(shí)體類。實(shí)體類僅定義數(shù)據(jù)模型,該模型應(yīng)與數(shù)據(jù)表對應(yīng),屬性定義應(yīng)與數(shù)據(jù)表的字段名一致。一個表會有一個對應(yīng)的實(shí)體類。本數(shù)據(jù)庫只有一個表t_user,所以只需定義一個實(shí)體類tuser.cs。其代碼如下: public class tuser private int _id = 0; private string

21、_nickname; private string _name; private string _pwd; public int id get return _id; set _id = value; public string name get return _name; set _name = value; public string nickname get return _nickname; set _nickname = value; public string pwd get return _pwd; set _pwd = value; 2dataaccesslayer中的類dat

22、aaccesslayer中的類用于用戶數(shù)據(jù)的存取。數(shù)據(jù)訪問層是與數(shù)據(jù)庫交互的層級。如獲取數(shù)據(jù),更新數(shù)據(jù),插入記錄等等。它的上一級是業(yè)務(wù)邏輯層。業(yè)務(wù)邏輯層需要操作某數(shù)據(jù)時(shí),調(diào)用數(shù)據(jù)訪問層的接口,數(shù)據(jù)訪問層操作oledb接口訪問access數(shù)據(jù)庫,最后返回?cái)?shù)據(jù)。 本例dataaccesslayer中共有如下兩個類。(1)dataprovider.cs該類定義(重載)了許多方法來操作access數(shù)據(jù)庫,其方法供daluser.cs調(diào)用,其代碼如下。using system.data.oledb;/ 操作oledb接口訪問access數(shù)據(jù)庫public class dataprovider priva

23、te static dataprovider _instance = null; / <summary> / 數(shù)據(jù)提供者對象實(shí)例,因程序頻繁請求數(shù)據(jù),減少創(chuàng)建對象的次數(shù)。 / </summary> public static dataprovider instance get if (_instance = null) _instance = new dataprovider(); return _instance; private string _dbpath = "" / <summary> / access數(shù)據(jù)庫路徑 / </

24、summary> public string dbpath get return _dbpath; set _dbpath = value; / <summary> / 提供數(shù)據(jù)表 / </summary> / <param name="sql">sql 查詢語句</param> / <param name="tablename">數(shù)據(jù)表名</param> / <returns></returns> public datatable gettable(s

25、tring sql, string tablename) oledbconnection conn = this.createconnection(); oledbcommand cmd = new oledbcommand(sql, conn); oledbdataadapter adp = new oledbdataadapter(cmd); datatable dt = new datatable(tablename); adp.fill(dt); conn.close(); conn.dispose(); return dt; / <summary> / 執(zhí)行查詢,并返回查

26、詢所返回的結(jié)果集中第一行的第一列。忽略其他列或行。 / </summary> / <param name="sql"></param> / <returns></returns> public object execscalar(string sql) oledbconnection conn = this.createconnection(); oledbcommand cmd = new oledbcommand(sql, conn); object o = cmd.executescalar(); conn.

27、close(); conn.dispose(); return o; / <summary> / 針對system.data.oledb.oledbcommand.connection 執(zhí)行sql 語句并返回受影響的行數(shù)。 / </summary> / <param name="sql"></param> / <returns></returns> public int execnoquery(string sql) oledbconnection conn = this.createconnectio

28、n(); oledbcommand cmd = new oledbcommand(sql, conn); int ret = cmd.executenonquery(); conn.close(); conn.dispose(); return ret; / <summary> / 創(chuàng)建一個oledbconnection連接. / </summary> / <returns></returns> private system.data.oledb.oledbconnection createconnection() string connstr

29、= "provider=microsoft.jet.oledb.4.0;data source=" + dbpath; oledbconnection conn = new oledbconnection(connstr); if (conn.state != connectionstate.connecting) conn.open(); return conn; (2)daluser.cs該類還調(diào)用tuser類對象,定義了獲取所有用戶列表、新增用戶(注冊)和檢查用戶是否存在(注冊檢查)等方法。該類通過調(diào)用dataprovider相關(guān)方法修改或獲取數(shù)據(jù),其代碼如下。usi

30、ng models;/引用數(shù)據(jù)對象模型層modelspublic class daluser private static daluser _instance = null; public static daluser instance get if (_instance = null) _instance = new daluser(); return _instance; / <summary> / 獲取所有用戶列表 / </summary> / <returns></returns> public datatable getusers()

31、string sql = "select * from t_user" return dataprovider.instance.gettable(sql, "t_user"); / <summary> / 新增用戶 / </summary> / <param name="user">用戶對象</param> / <returns></returns> public bool adduser(tuser user) /往數(shù)據(jù)庫寫入記錄 string sql = &

32、quot;insert into t_user(name,nickname,pwd) values ('0','1','2') " sql = string.format(sql, , user.nickname, user.pwd); int i = dataprovider.instance.execnoquery(sql); return i > 0; / <summary> / 用戶登錄 / </summary> / <param name="name"&

33、gt;登錄帳號</param> / <returns></returns> public bool login(string name, string pwd) string sql = "select count(*) from t_user where name='" + name + "' and pwd='" + pwd + "'" object o = dataprovider.instance.execscalar(sql); return int.par

34、se(o.tostring() > 0; / <summary> / 檢查用戶是否存在 / </summary> / <param name="name">用戶編號</param> / <returns></returns> public bool existsuser(string name) string sql = "select count(*) from t_user where name='" + name + "'" objec

35、t o = dataprovider.instance.execscalar(sql); return int.parse(o.tostring() > 0; 3businesslogiclayer中的類businesslogiclayer中的類主要負(fù)責(zé)數(shù)據(jù)的傳遞和處理。共有如下兩個類。(1)userrole.cs該類調(diào)用tuser類對象和daluser類對象,定義用戶是否存在和用戶是否合法的方法,制定用戶規(guī)則,檢查數(shù)據(jù)合法性。其代碼如下。using models;using dataaccesslayer;public class userrole public static void

36、 validate(tuser user) if (daluser.instance.existsuser() throw new exception("用戶已經(jīng)存在!"); public static void validatelogin(string name, string pwd) if (name.trim() = "") throw new exception("用戶編號不正確或不能為空!"); if (pwd.trim() = "") throw new exception(&quo

37、t;密碼不正確或不能為空!"); (2)blluser.cs該類調(diào)用tuser類對象、daluser類對象和userrole類的相關(guān)方法,負(fù)責(zé)登錄,注冊用戶,獲取用戶列表等業(yè)務(wù)操作。其代碼如下。using models;using dataaccesslayer;using businesslogiclayer.roles;public class blluser / <summary> / 新增用戶 / </summary> / <param name="user">用戶對象</param> / <retur

38、ns></returns> public bool adduser(tuser user) /向數(shù)據(jù)庫寫入數(shù)據(jù)之前,檢查數(shù)據(jù)的合法性。比如sql注入,暴力注入等業(yè)務(wù)操作。 /如果數(shù)據(jù)是合法的,可以寫入數(shù)據(jù)了。這種邏輯性操作,是不是屬于業(yè)務(wù)邏輯的范疇呢? userrole.validate(user); return daluser.instance.adduser(user); public bool login(string name, string pwd) /檢查登錄信息 userrole.validatelogin(name, pwd); /調(diào)用數(shù)據(jù)訪問層的接口檢查用

39、戶登錄 return daluser.instance.login(name, pwd); public datatable getusers() return daluser.instance.getusers(); 14.3.4用戶界面層中的事件代碼1. default.aspx.cs中的事件代碼該頁面調(diào)用業(yè)務(wù)邏輯層的接口blluser().login()方法,實(shí)現(xiàn)用戶登錄,或轉(zhuǎn)到用戶注冊頁面。using businesslogiclayer;protected void btnlogin_click(object sender, eventargs e) try /頁面展示層調(diào)用業(yè)務(wù)邏輯

40、層的接口. bool login = new blluser().login(textbox1.text, textbox2.text); if (login) /成功 this.session"uid" = textbox1.text; this.session"time" = datetime.now; this.response.redirect("welcome.aspx"); else msg.show(this, "用戶名或密碼不正確!"); catch (exception ex) msg.show(

41、this, ex.message); protected void buttonregister_click(object sender, eventargs e) this.response.redirect("register.aspx"); 2. welcome.aspx.cs中的事件代碼登錄成功后,出現(xiàn)歡迎頁面,同時(shí)通過session對象將登錄頁面輸入的用戶信息通過顯示在該頁面中。 /顯示登錄名,session獲取 public string getnickname() string uid = (string)this.session"uid"

42、 return uid = null ? "您還沒有登錄!" : uid; /最后登錄時(shí)間,session獲取 public string getlastlogin() if (this.session"time" = null) return "您還沒有登錄!" else return this.session"time".tostring();welcome.aspx中的代碼 您的昵稱:<span style="font-weight: bold; color: red"> <%=getnickname()%> </span> <br /> 登錄時(shí)間:<span style="font-weight: bold; color: red"><%=getlastlogin() %></s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論