作爲這個系列博文的首篇,難免要在開頭廢話幾句。
網上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.aspx和Index.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