ASP.NET三層結構演化構建之一——混沌

作爲這個系列博文的首篇,難免要在開頭廢話幾句。

網上ASP.NET三層結構的文章也不少了。我看了一下,都寫的很好。有的也手把手的教了如何建立三層結構的ASP.NET網站。但是我認爲針對初學者,對於三層結構思想的理解也是十分重要的。有的人雖然會使用,但是具體原因的說不清,初學者對於有些編程手法更是滿頭霧水。針對這個情況,忙於拯救地球的我不得不放下手中的工作,推出三層結構演化構建系列博客。希望能借這個系列的博文與大家交流交流。嘿嘿。

 

分層開發的優勢我在這裏就先不提了。因爲我對三層的介紹還沒開始。這就像指着空氣讓人意淫一樣,是很不科學的。以後我會結合具體的例子來逐步介紹。

 

現在我要建立一個簡單的普通的ASP.NET班級管理系統。作爲這個博客系列的例子,我會對其進行不斷演化。

 

我使用的工具是Visual Studio 2008+SQL Server 2005

 

首先我們僅僅是討論用戶登錄的功能。

 

作爲一個基礎知識極端紮實的小鳥,一個用戶登錄寫起來還是沒什麼問題的。我相當自信。

 

首先是建庫和建表。這裏給出了相應的T-SQL語句。

 

--建庫

create database StudentMIS

go

use StudentMIS

go

 

--建表

CREATE TABLE [User](

UserId int IDENTITY(1,1) NOT NULL, --用戶ID

Password varchar(50)  NOT NULL CONSTRAINT DF_User_Password  DEFAULT '0', --用戶密碼

IsAdmin bit NOT NULL CONSTRAINT DF_User_IsAdmin  DEFAULT ((0)), --是否爲管理員,True表示爲管理員,False表示不是。默認值爲False

UserName nvarchar(50), --用戶姓名

Sex bit, --用戶性別,True表示男,False表示女

Age smallint, --用戶年齡

 CONSTRAINT PK_User PRIMARY KEY CLUSTERED 

(

UserId ASC --UserId設置爲主鍵

)

)

go

 

--插入數據,頭四個是普通用戶。Han Meimei是管理員。因爲她跟我關係比較好啦。

INSERT INTO [User] (UserName,IsAdmin,Sex,Age) VALUES('Han Meimei',1,0,18)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Li Lei',1,19)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Jim Green',1,18)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Lucy',0,17)

建好之後如圖:

 

 

表中數據如圖: 

 

現在開始寫界面。

 

打開Visual Studio 2008

點擊文件->新建項目,在彈出的對話框的左邊中點選其他項目類型下的Visual Studio解決方案,如圖:

 

選擇右邊的空白解決方案,並且選擇解決方案的名稱和位置。位置在F盤的根目錄下(當然,您可以決定放在哪裏)。爲了拉風一點,我們這裏起名爲StudentMIS,意思是學生管理信息系統。然後點擊確認。

 

爲什麼要新建空白的解決方案呢。我們現在要做的是一個分層次的系統。每一個層次都是一個項目。這些項目需要一個解決方案作爲容器,有了解決方案,我們可以在解決方案中添加新的項目。這樣方便我們的管理。

 

建完解決方案如圖所示:

 

 

右擊解決方案StudentMIS,選擇添加->新建網站,彈出以下對話框:

 

 

這裏我們選擇ASP.NET網站。注意位置,爲了使項目好管理,我們將位置設在剛纔創建解決方案的目錄下的Web文件夾中。這樣使得解決方案和項目在一塊。要移動或者是複製的時候都方便。點擊確定。

 

在我們建立的網站中刪除Default.aspx,添加兩個頁面:Login.aspxIndex.aspx,並將Login.aspx設置爲起始頁。這時候的項目解決方案視圖如圖所示:

計劃是這樣的。Login.aspx是登陸頁面。如果登陸成功,則跳轉到Index.aspx頁面,如果失敗,則彈出失敗的提示。

 

Login.aspx的內容爲:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Login</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:Label ID="lblUserId" runat="server" Text="UserId:"></asp:Label>

        <asp:TextBox ID="tbxUserId" runat="server"></asp:TextBox>

        <br />

        <asp:Label ID="lblPassword" runat="server" Text="Password:"></asp:Label>

        <asp:TextBox ID="tbxPassword" runat="server" TextMode="Password"></asp:TextBox>

        <br />

        <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" />

    </div>

    </form>

</body>

</html>

 

後臺代碼Login.aspx.cs的代碼爲:

 

using System;

using System.Data.SqlClient;

 

public partial class Login : System.Web.UI.Page

{

    protected void btnLogin_Click(object sender, EventArgs e)

    {

        if (tbxUserId.Text.Length == 0 || tbxPassword.Text.Length == 0) return;//若賬號密碼爲空,則返回

        SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建連接

        SqlCommand cmd = new SqlCommand("select password from [User] where UserId=" + tbxUserId.Text, conn);//新建命令,根據文本框tbxUserId中的值查詢數據庫中相應記錄的Password值

        conn.Open();//打開連接

        Object obj = cmd.ExecuteScalar();//執行語句,返回第一行第一列結果

        conn.Close();//關閉連接

        if (obj != null && obj.ToString() == tbxPassword.Text)//若查詢結果不爲空且與文本框tbxPassword中的值相等

            Response.Redirect("Index.aspx");//跳轉到Index.aspx

        else

        {

            tbxUserId.Text = "";//清空tbxUserId中的值

            tbxPassword.Text = "";//清空tbxPassword中的值

        }

    }

}

 

Index.aspx的內容爲:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Index" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        Welcome

        <%=UserName %>

    </div>

    </form>

</body>

</html>

 

後臺代碼Index.aspx.cs的內容爲:

using System;

using System.Data.SqlClient;

 

public partial class Index : System.Web.UI.Page

{

    public string UserName;//用戶名

    protected void Page_Load(object sender, EventArgs e)

    {

        SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建連接

        SqlCommand cmd = new SqlCommand("select UserName from [User] where UserId=" + Request["UserId"], conn);//新建命令,根據請求的UserId中的值查詢數據庫中相應記錄的UserName值

        conn.Open();//打開連接

        Object obj = cmd.ExecuteScalar();//執行語句,返回第一行第一列結果

        conn.Close();//關閉連接

        if (obj != null)

            UserName = obj.ToString();

    }

}

 

 

 

寫完後運行。效果如下圖:

 

UserId:後面的文本框中輸入1,Password:後面的文本框中輸入0,點擊Login,登錄成功,跳轉到Index.aspx。如圖:

 

 

任務就這樣簡單完成了。簡直是太容易了。我真是人才。

 

但是。這樣有什麼弊端呢。

 

這個項目就我一個人開發。所以沒啥問題。如果是一個大項目,一個大公司,有幾十號甚至幾百號人共同開發。如何分工協作。寫界面的是我,寫業務邏輯的是我,寫數據庫連接的還是我。那其他人要幹嘛呢。給人家留口飯吃嘛。做人要厚道。

有的人說,分工進行。好嘛。看看我們的代碼,所有的處理都是在一個文件裏,叫人如何分工呢。

明白了。分層嘛。分幾層呢。三層。表示層,業務邏輯層,數據訪問這三層。

敬請關注下一篇:ASP.NET三層結構演化構建之二——三層肚皮

 

項目示例下載:http://download.csdn.net/source/2946951 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章