作为这个系列博文的首篇,难免要在开头废话几句。
网上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