ASP实验五简单聊天室设计课案Word格式.docx
《ASP实验五简单聊天室设计课案Word格式.docx》由会员分享,可在线阅读,更多相关《ASP实验五简单聊天室设计课案Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
文字颜色
Emotion
用户表情
其中,color属性的取值可能为red、blue、green,它们能够直接赋值给<
fontcolor>
,而不是简单的存储汉字,这样可以方便显示。
本例中,emotion存储的是文字信息,如微笑地、难过地等。
读者可以很容易地将其转变为图片信息,实现方式是首先设计一些表情图片,然后将其图片名存储在emotion属性中,在显示时根据其值构造<
img>
标签即可。
(2)实现数据库
下面给出数据库实现的SQL命令,也可以通过SQLServer企业管理器创建:
(1)创建User表
CREATETABLE[dbo].[User](
[UserName][varchar](50)COLLATEChinese_PRC_CI_ASNOTNULL,
[Password][varchar](50)COLLATEChinese_PRC_CI_ASNOTNULL
)ON[PRIMARY]
(2)创建Message表:
CREATETABLE[dbo].[Message](
[CreateTime][varchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Content][text]COLLATEChinese_PRC_CI_ASNULL,
[Color][varchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Emotion][varchar](50)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]
3数据访问层
数据访问层完成所有与数据库交互的工作,本系统只包括一个类Database。
这个类的功能是向数据库提交SQL语句,并返回相应的操作结果。
(1)配置数据库连接
本例中,在Web.config文件中指定了数据库连接字符串配置信息,在Web.config文件中添加如下代码:
1.<
appSettings>
2.<
add
3.key="
DBConnectionString"
4.value="
server=(local);
database=MyChatRoom;
UserId=sa;
pwd=sa"
5./>
6.<
/appSettings>
用户需要根据自己的配置,修改value中各个连接属性的值。
(2)Database类成员一览
把Database类放在MyChatRoom.DataAcceessLayer空间下,其类图如图20.5所示。
图20.5数据库类Database的类图
成员说明如表20.3所示
表20.3Database类的成员说明
属性/方法
功能说明
Connection
保护变量,数据库连接SqlConnection对象
ConnectionString
保护变量,数据库连接串
Open
连接数据库
Close
关闭数据库连接
Dispose
释放数据库连接资源
ExecuteSQL
执行一个非查询(SELECT)类型的SQL命令
GetDataRow
根据输入SQL命令,获取一个DataRow对象
GetDataSet
根据输入SQL命令,获取一个DataSet对象
(3)实现Database类
下面分别介绍Database类中各个方法的实现。
1.构造函数
构造函数的功能为,读取配置文件Web.config中的连接字符串,并赋予ConnectionString属性,实现如下:
1.///构造函数
2.publicDatabase()
3.{
4.ConnectionString=ConfigurationSettings.AppSettings["
];
5.}
这里使用ConfigurationSettings类的的AppSettings静态属性,获取Web.config中使用<
元素的配置信息。
ConfigurationSettings类提供配置文件的访问信息。
2.析构函数
构造函数的功能为,关闭数据库连接,并释放连接数据库所使用的资源。
实现如下:
1.///析构函数,关闭连接,并释放资源
2.~Database()
4.try
5.{
6.if(Connection!
=null)
7.Connection.Close();
8.}
9.catch{}
10.try
11.{
12.Dispose();
13.}
14.catch{}
15.}
代码4~9行关闭连接,10~14行使用下面介绍的Dispose方法,释放资源。
3.Dispose方法
Database类继承了IDisposal接口,后者定义了释放资源的Dispose方法。
在Database中,需要实现这个方法,以释放连接数据库所占用的系统资源(如内存等)。
具体地,将使用Connection属性的Dispose方法,来释放这些资源,实现如下:
1.///公有方法,释放资源。
2.publicvoidDispose()
4.//确保连接被关闭
5.if(Connection!
=null)
6.{
7.Connection.Dispose();
8.Connection=null;
9.}
10.}
4.Open方法
Open方法根据ConnectionString属性,创建新的数据库连接对象,并赋予Connection属性。
1.///保护方法,打开数据库连接。
2.protectedvoidOpen()
4.if(Connection==null)
6.Connection=newSqlConnection(ConnectionString);
7.}
8.if(Connection.State.Equals(ConnectionState.Closed))
9.{
10.Connection.Open();
11.}
12.}
代码判断是否已经建立了连接,如果没有建立,则创建新的连接,并将其打开。
5.Close方法
Close方法关闭数据库连接。
1.///公有方法,关闭数据库连接。
2.publicvoidClose()
4.if(Connection!
5.Connection.Close();
6.}
6.ExecuteSQL方法
ExecuteSQL方法执行非查询(即非SELECT)SQL命令,并返回执行SQL所影响的数据记录数目。
1.///公有方法,执行Sql语句。
2.///<
paramname="
SqlString"
>
Sql语句<
/param>
3.///<
returns>
对Update、Insert、Delete为影响到的行数,其他情况为-1<
/returns>
4.publicintExecuteSQL(StringSqlString)
5.{
6.intcount=-1;
7.Open();
8.try
10.SqlCommandcmd=newSqlCommand(SqlString,Connection);
11.count=cmd.ExecuteNonQuery();
12.}
13.catch
14.{
15.count=-1;
16.}
17.finally
18.{
19.Close();
20.}
21.returncount;
22.}
第7行打开数据库连接;
第8~20行使用try-catch-finally语句,利用ExecuteNonQuery方法来执行SQL命令。
第21行返回执行SQL影响的记录数。
7.GetDataSet方法
GetDataSet方法接受一个SQL查询命令(SELECT语句),然后返回查询得到的数据集DataSet。
1.///公有方法,获取数据,返回一个DataSet。
DataSet<
4.publicDataSetGetDataSet(StringSqlString)
6.Open();
7.SqlDataAdapteradapter=newSqlDataAdapter(SqlString,Connection);
8.DataSetdataset=newDataSet();
9.adapter.Fill(dataset);
10.Close();
11.returndataset;
第6行打开数据库连接;
第7~9行使用SqlDataAdapter对象得到查询结果,并利用其Fill方法将查询结果放入DataSet中;
第10行关闭数据库连接;
第11行返回查询结果集。
8.GetDataRow方法
GetDataRow方法接收一个SQL查询命令(SELECT语句),然后返回查询得到的一行数据对象DataRow,很明显,这个方法适合于结果中至多只包含一个记录的查询,例如根据主键查询数据等。
1.///公有方法,获取数据,返回一个DataRow。
DataRow<
4.publicDataRowGetDataRow(StringSqlString)
6.DataSetdataset=GetDataSet(SqlString);
7.dataset.CaseSensitive=false;
8.if(dataset.Tables[0].Rows.Count>
0)
10.returndataset.Tables[0].Rows[0];
12.else
13.{
14.returnnull;
15.}
16.}
第6行利用前面介绍的GetDataSet方法,获取查询结果数据集;
第8~15行试图取出结果集中第一个表中的第一行数据,并返回;
如果数据集中不存在任何数据,则返回空(null)。
4业务逻辑层
业务逻辑层完成聊天室的功能,具体包括用户和信息管理,分别使用User和Message类来实现,下面对其一一介绍。
1用户类User
1.User类的功能
用户类模拟了一个使用聊天室的用户,位于MyCharRoom.BussinessLogicLayer空间中,其类图如图所示。
注意:
User类的实现将使用到Database类的方法,因此,在实现User类之前,不要忘记引入数据访问层所在的空间“MyCharRoom.DataAccessLayer”。
图20.6User类的类图
成员说明如表20.4所示:
表20.4User类的成员说明
UserName
字符串,用户名
Password
字符串,用户密码
Exist
布尔型,指示用户是否存在
Add
将当前用户添加到数据库中
LoadData
根据用户名,得到用户的详细信息数据
2.LoadData方法
LoadData方法根据用户名参数,查询数据库,并获取该用户的详细信息。
1.///根据参数userName,获取用户详细信息
userName"
用户名<
3.publicvoidLoadData(stringuserName)
4.{
5.Databasedb=newDatabase();
//实例化一个Database类
6.
7.stringsql="
Select*from[User]whereUserName='
"
+userName+"
'
;
8.DataRowdr=db.GetDataRow(sql);
//利用Database类的GetDataRow方法查询数据
9.
10.//根据查询得到的数据,对成员赋值
11.if(dr!
=null)
12.{
13.this._userName=dr["
UserName"
].ToString();
14.this._password=dr["
Password"
15.this._exist=true;
17.else
18.this._exist=false;
19.}
第5行得到一个Database对象db;
第7~8行构造了查询语句,形如:
Select*from[User]WhereUserName=‘ZhangSan’
然后,利用db的GetDataRow方法查询数据;
第10~18行把查询到的数据赋予User类的各个属性,并标识_exist属性为true;
如果没有查询到任何数据,则_exist属性为false。
在构造查询语句时,需要在表名User上添加中括号,这是因为,SQLServer中包含名为User的系统表,为了与系统表加以区分,需要使用中括号。
3.Add方法
Add方法向数据库添加一个用户信息。
1.///向数据库添加一个用户
password"
密码<
4.publicvoidAdd(stringuserName,stringpassword)
6.Databasedb=newDatabase();
7.
8.stringsql="
InsertInto[User]Values("
9.+"
"
10.+"
+password+"
)"
11.
12.db.ExecuteSQL(sql);
//利用Database类的GetDataRow方法查询用户数据
13.}
第6行得到一个Database对象db;
第8行构造了INSERT语句,形如:
InsertInto[User]Values(‘UserName’,’Password’)
然后,利用db的ExecuteSQL方法执行命令。
2消息类Message
1.Message类的功能
Message类用户管理用户的发言信息,位于MyCharRoom.BussinessLogicLayer空间中,其类图如图20.7所示。
图20.7User类的类图
成员说明如表20.5所示。
表20.5User类的成员说明
将一条留言信息,添加到数据库中
LoadTop10
静态方法,查询数据库中最近的10条留言,并用DataSet返回
2.实现Add方法
Add方法向数据库添加一个留言信息,具体内容包括留言用户名、时间、内容、字体颜色,以及表情信息。
1.///向数据库中添加一条留言信息
createTime"
留言时间<
4.///<
content"
留言内容<
5.///<
color"
颜色<
6.///<
emotion"
表情<
7.publicvoidAdd(stringuserName,stringcreateTime,stringcontent,stringcolor,stringemotion)
8.{
9.Databasedb=newDatabase();
10.
11.stringsql="
InsertInto[Message]Values("
12.+"
13.+"
+createTime+"
14.+"
+content+"
15.+"
+color+"
16.+"
+emotion+"
17.
18.db.ExecuteSQL(sql);
InsertInto[Message]Values(‘UserName’,’9:
12:
23’,’留言信息’,’red’,’微笑着’)
3.LoadTop10方法
LoadTop10方法获取聊天室用户最近发表的10条发言,并用一个DataSet数据集返回。
1.///获取事件最近的10条发言
2.publicstaticDataSetLoadTop10()
4.Databasedb=newDatabase();
5.
6.stringsql="
Selecttop10*from[Message]orderbyCreateTimedesc"
7.DataSetds=db.GetDataSet(sql);
//用Database类的GetDataSet查询最近的10条发言
8.
9.returnds;
第4行得到一个Database对象db;
第6行构造了INSERT语句,形如:
Selecttop10*from[Message]OrderByCreateTimeDesc
然后,利用db的GetDataSet方法得到查询结果数据集,并返回。
5页面显示层
页面显示层是最终呈现在用户浏览器上的系统功能,主要包括对逻辑层的调用,动态显示数据,以及美工两部分工作。
此处着重介绍前者。
本例中,所包含的页面有:
(1)用户登录页面Login.aspx。
(2)用户发言页面Speak.aspx。
(3)浏览信息页面ShowMessage.aspx。
为了便于使用,需要使用一个页面将
(2)(3)放在一起,即用户在同一个页面上发言并查看信息,使用框架可以实现这一点,合并的主页面为Main.aspx。
下面一一介绍这几个页面的实现。
在实现页面之前,需要引入业务逻辑层空间“MyCharRoom.BussinessLogicLayer”。
1用户登录Login.aspx
用户登录页面Login.aspx位于MyCharRoom.WebLayer空间中,主要功能为:
(1)当用户首次使用系统时,将自动将其信息注册到数据库中;
(2)用户再次登录时,系统会检查其输入的用户名和密码是否合法,如不合法,则给出提示,并使用户重新登录。
如果合法,则进入聊天室主页面Main.aspx。
Login.aspx的页面布局如图所示。
图20.8Login.aspx的页面布局
主要控件的属性为:
asp:
TextBoxid="
TextBoxUserName"
runat="
server"
<
/asp:
TextBox>
2.<
RequiredFieldValidatorid="
RequiredFieldValidator1"
ErrorMessage="
警告:
必填!
ControlToValidate="
RequiredFieldValidator>
3.<
TextBoxPassword"
TextMode="
4.<
RequiredFieldValidator2"
5.<
Buttonid="
ButtonLogin"
Text="
登录"
Button>
当用户单击“登录”按钮时,其单击事件完成