




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第14章 三层结构开发模式14.1三层结构概述14.1.1两层结构及其局限性前面我们讲述的web应用程序都是基于两层结构的,它们有如下特点:l 数据库访问和用户类型判断逻辑放在一起实现。l 用户界面层直接调用数据访问实现。l 整个系统功能放在同一项目中实现。传统的两层结构的特点是用户界面层直接与数据库进行交互,还要进行业务规则、合法性校验等工作。两层结构软件模型如图18-2所示。这种结构存在着很多局限性,比如:一旦用户的需求发生变化,应用程序都需要进行大量修改,甚至需要重新开发,给系统的维护和升级带来了极大的不便;用户界面层直接访问数据库,会带来很多安全隐患。为了克服两层结构的局限性提出了三层
2、结构。14.1.2什么是三层结构所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有b/s应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。通用三层结构软件模型如图18-2所示。中间层通常包括业务逻辑层(business logic layer,简称bll)、数据访问层(database access layer,简称dal)和数据对象模型层(database object model layer,简称dom)。此时的三层结构软件模型如图18-2所示。用户界面
3、(user interface,简称ui),也称表示层,位于最上层,用于显示和接收用户提交的数据,为用户提供交互式的界面。表示层一般为windows窗体应用程序或web应用程序。业务逻辑层是表示层和数据访问层之间沟通的桥梁,主要负责数据的传递和处理。数据访问层主要实现对数据的读取、保存和更新等操作。数据对象模型层即业务实体层。主要用于表示数据存储的持久对象。在实际应用程序中的实体类是跟数据库中的表相对应的,也就是说一个表会有一个对应的实体类。当然有些三层结构并不包含单独的数据对象模型层,而将其功能分解到业务逻辑层和数据访问层之中。在三层结构中,表示层直接依赖于业务逻辑层;业务逻辑层直接依赖于数
4、据访问层;数据访问层直接依赖于数据对象模型层。14.1.3 三层结构的优点三层结构主要体现出对程序分而治之的思想:数据访问层只负责提供原原始数据,并不需要了解业务逻辑;业务逻辑层调用数据访问层提供的方法自定义一些业务逻辑,对数据进行加工,本身不需要了解数据访问层的实现;表示层直接调用业务逻辑提供的方法把数据呈现给用户。三层结构的优点在于不必为了业务逻辑上的微小变化而迁至整个程序的修改,只需要修改商业逻辑层中的一个函数或一个过程;增强了代码的可重用性;便于不同层次的开发人员之间的合作,只要遵循一定的接口标准就可以进行并行开发了,最终只要将各个部分拼接到一起构成最终的应用程序。三层结构的应用程序将
5、业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过com/dcom通讯与中间层建立连接,再经由中间层与数据库进行交互,这样会大大提高系统的安全性。三层结构的应用程序更能够适应企业级应用日益增长的复杂度和灵活性的要求,并且通过软件分层的高内聚、低耦合的原则,实现扩展、维护和重用的要求,可以大大提高开发效率。14.2用asp.net搭建三层结构框架asp.net 可以使用.net平台快速方便的搭建三层结构。asp.net革命性的变化是在网页中也使用基于事件的处理,可以指定处理的后台代码文件,可以使用c#、vb作为后台代码语言。.net中可以
6、方便的实现组件的装配,后台代码通过命名控件可以方便的使用自己定义的组件。表示层放在 web窗体中,业务逻辑层、数据访问层和数据对象模型层用类库来实现,这样就很方便的实现了三层结构。1新建解决方案打开vs 2008,新建一个"空白解决方案",将其命名为"threelayers "。2搭建表示层(网站)(1)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加""新建网站"命令,新建一个网站,其存放位置为解决方案文件夹下的myweb子文件夹。(2)在该网站下建一个数
7、据库(简单起见可建access数据库),以备存取数据。3搭建业务逻辑层(类库)在"解决方案资源管理器"中,新建一个"类库"项目。填写项目的名称为" businesslogiclayer ",该项目用于实现业务逻辑。4搭建数据访问层(类库)在"解决方案资源管理器"中,新建一个"类库"项目。填写项目的名称为" dataaccesslayer ",该项目用于实现数据访问层。5搭建数据对象模型层(类库)在"解决方案资源管理器"中,新建一个"类库"
8、;项目。填写项目的名称为"models",该项目用于实现数据实体。至此,已搭建了三层结构(添加了4个项目)。5添加各层之间的依赖(引用)此时,虽然三层结构的基本框架已经搭建成功,但是各层之间是独立的。只有添加依赖关系,才能让它们相互协作。(1) 添加表示层对业务逻辑层、数据访问层和数据对象模型层的依赖。(2)添加业务逻辑层对数据访问层和数据对象模型层的依赖。(3)添加业数据访问层对数据对象模型层的依赖。至此,三层结构及各层之间的依赖关系创建完毕。6将表示层设置为启动项目通过上述步骤,就已经成功部署了asp.net的三层架构。表示层myweb网站放置用于显示的web页面;事务
9、逻辑层businesslogiclayer项目,我们把所有的业务逻辑代码在该层实现;数据访问层dataaccesslayer项目主要处理数据库的操作,供事务逻辑层调用;数据对象模型层models项目实现数据实体类,供其它各层调用。只要在各个层中实现具体的类就可以成功实施三层结构的应用程序了。14.3应用举例14.3.1系统分析本例的功能非常简单,只是实现用户登录与注册的功能,用户信息存放在数据库中,旨在体现如何在asp.net实现三层结构。表示层myweb网站放置用于显示的web页面;事务逻辑层businesslogiclayer项目,我们把所有的业务逻辑代码在该层实现;数据访问层dataac
10、cesslayer项目主要处理数据库的操作,供事务逻辑层调用;数据对象模型层models项目实现数据实体类,供其它各层调用。各层次之间的调用(引用)关系如表所示。层项目名称用途引用关系实例文件界面展示myweb(网站)web页面和控件businesslogiclayerdataaccesslayermodelsdefault.aspxwelcome.aspxregister.aspx业务逻辑businesslogiclayer负责登录,注册用户,获取用户列表等业务操作dataaccesslayermodelsblluser.cs userrole.cs数据访问dataaccesslayer调用
11、dataprovider相关方法修改或获取数据。modelsdataprovider.csdaluser.cs业务实体models定义对象实体类无tuser.cs14.3.2创建框架1. 建立数据库打开access创建名为userinfo.mdb的数据库,并为其创建一个名为t_user的表,其结构如图所示。2. 新建解决方案打开vs 2008,依次选择"文件""新建""项目"命令,打开"新建项目"对话框中,然后选择项目类型为"visual studio解决方案",选择模板为"空白解决方
12、案"。然后填写解决方案的名称为"threelayers ",并指定保存位置,如图18-4所示。单击“确定”按钮,创建解决方案。3. 搭建表示层(1)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加""新建网站"命令,如图18-8所示。(2)在打开的"添加新网站"对话框中,选择"asp.net网站",选择位置为"文件系统",并设置网站的路径,如图18-9所示。(3)设计default.aspx如图所示。(4)添
13、加一web窗体,将其命名为welcome.aspx,其设计视图如图所示。(5)添加一web窗体,将其命名为register.aspx,其设计视图如图所示。(6)将建好的userinfo.mdb拷贝到站点的app_data文件夹下。(7)添加global.asax在其application_start()添加如下代码。void application_start(object sender, eventargs e) /在应用程序启动时运行的代码 /应用程序运行时设置数据库路径。 string dbpath = this.server.mappath("/") + "
14、;app_datauserinfo.mdb" dataaccesslayer.dataprovider.instance.dbpath = dbpath; 4. 搭建业务逻辑层(类库)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加""新建项目"命令,打开"新建项目"对话框中,然后选择项目类型为"visual c#",选择模板为"类库"。填写项目的名称为" businesslogiclayer ",该项目用于
15、实现业务逻辑。此时项目的保存位置已经默认输入了,是刚才创建空白解决方案时产生的路径,如图18-6所示。5. 搭建数据访问层(类库)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加""新建项目"命令,打开"新建项目"对话框中,然后选择项目类型为"visual c#",选择模板为"类库"。填写项目的名称为dataaccesslayer",该项目用于实现数据访问层。此时项目的保存位置已经默认输入了,是刚才创建空白解决方案时产生的路径。
16、6. 搭建数据对象模型层(类库)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加""新建项目"命令,打开"新建项目"对话框中,然后选择项目类型为"visual c#",选择模板为"类库"。填写项目的名称为"models",该项目用于实现数据访问层。此时项目的保存位置已经默认输入了,是刚才创建空白解决方案时产生的路径,如图18-6所示。至此,已搭建了三层结构(添加了4个项目),此时的解决方案如图所示。7. 添加各层之间的
17、引用(依赖)此时,虽然三层结构的基本框架已经搭建成功,但是各层之间是独立的。只有添加依赖关系,才能让它们相互协作。(1) 添加表示层对业务逻辑层、数据访问层和数据对象模型层的依赖。在"解决方案资源管理器"中,在表示层上单击鼠标右键,在弹出的快捷菜单中选择"添加引用"命令,打开"添加引用"对话框,然后选择"项目"选项卡,选中项目名称为" businesslogiclayer "的项目,单击"确定"按钮,如图18-13所示。同样添加对dataaccesslayer和models的
18、引用。(2)添加业务逻辑层对数据访问层和数据对象模型层的依赖。在"解决方案资源管理器"中,在业务逻辑层上单击鼠标右键,在弹出的快捷菜单中选择"添加引用"命令,打开"添加引用"对话框,然后选择"项目"选项卡,选中项目名称为" dataaccesslayer "的项目,单击"确定"按钮。同样添加对models的引用。(3)添加数据访问层对数据对象模型层的依赖。至此,三层结构及各层之间的依赖关系创建完毕。现在你的threelayers解决方案资源管理器应该如图所示:8. 将表示层设
19、置为启动项目运行程序前,还需设置启动项目。在"解决方案资源管理器"中的表示层上单击鼠标右键,在弹出的快捷菜单中选择"设为启动项目"命令,将表示层设置为启动项目。将表示层设置为启动项目后,表示层(站点)自动创建了bin文件夹,该文件夹下生成了:businesslogiclayer.dll、businesslogiclayer.pdb、dataaccesslayer.dll、dataaccesslayer.pdb、models.dll和models.pdb等6个文件,如图所示。通过上述步骤,就已经成功部署了asp.net的三层架构。在myweb这一层我们放置
20、用于显示的web页面,在 business层,我们把所有的业务逻辑代码在该层实现。dataaccess层主要处理数据库的操作,供business层调用。只要在各个层中实现具体的类就可以成功实施三层结构的应用程序了。14.3.3在各个层中实现具体的类1. models中的类models中的类为实体类。实体类仅定义数据模型,该模型应与数据表对应,属性定义应与数据表的字段名一致。一个表会有一个对应的实体类。本数据库只有一个表t_user,所以只需定义一个实体类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中的类用于用户数据的存取。数据访问层是与数据库交互的层级。如获取数据,更新数据,插入记录等等。它的上一级是业务逻辑层。业务逻辑层需要操作某数据时,调用数据访问层的接口,数据访问层操作oledb接口访问access数据库,最后返回数据。 本例dataaccesslayer中共有如下两个类。(1)dataprovider.cs该类定义(重载)了许多方法来操作access数据库,其方法供daluser.cs调用,其代码如下。using system.data.oledb;/ 操作oledb接口访问access数据库public class dataprovider priva
23、te static dataprovider _instance = null; / <summary> / 数据提供者对象实例,因程序频繁请求数据,减少创建对象的次数。 / </summary> public static dataprovider instance get if (_instance = null) _instance = new dataprovider(); return _instance; private string _dbpath = "" / <summary> / access数据库路径 / </
24、summary> public string dbpath get return _dbpath; set _dbpath = value; / <summary> / 提供数据表 / </summary> / <param name="sql">sql 查询语句</param> / <param name="tablename">数据表名</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> / 执行查询,并返回查
26、询所返回的结果集中第一行的第一列。忽略其他列或行。 / </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 执行sql 语句并返回受影响的行数。 / </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> / 创建一个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该类还调用tuser类对象,定义了获取所有用户列表、新增用户(注册)和检查用户是否存在(注册检查)等方法。该类通过调用dataprovider相关方法修改或获取数据,其代码如下。usi
30、ng models;/引用数据对象模型层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) /往数据库写入记录 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中的类主要负责数据的传递和处理。共有如下两个类。(1)userrole.cs该类调用tuser类对象和daluser类对象,定义用户是否存在和用户是否合法的方法,制定用户规则,检查数据合法性。其代码如下。using models;using dataaccesslayer;public class userrole public static void
36、 validate(tuser user) if (daluser.instance.existsuser() throw new exception("用户已经存在!"); 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该类调用tuser类对象、daluser类对象和userrole类的相关方法,负责登录,注册用户,获取用户列表等业务操作。其代码如下。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) /向数据库写入数据之前,检查数据的合法性。比如sql注入,暴力注入等业务操作。 /如果数据是合法的,可以写入数据了。这种逻辑性操作,是不是属于业务逻辑的范畴呢? userrole.validate(user); return daluser.instance.adduser(user); public bool login(string name, string pwd) /检查登录信息 userrole.validatelogin(name, pwd); /调用数据访问层的接口检查用
39、户登录 return daluser.instance.login(name, pwd); public datatable getusers() return daluser.instance.getusers(); 14.3.4用户界面层中的事件代码1. default.aspx.cs中的事件代码该页面调用业务逻辑层的接口blluser().login()方法,实现用户登录,或转到用户注册页面。using businesslogiclayer;protected void btnlogin_click(object sender, eventargs e) try /页面展示层调用业务逻辑
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中的事件代码登录成功后,出现欢迎页面,同时通过session对象将登录页面输入的用户信息通过显示在该页面中。 /显示登录名,session获取 public string getnickname() string uid = (string)this.session"uid"
42、 return uid = null ? "您还没有登录!" : uid; /最后登录时间,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 /> 登录时间:<span style="font-weight: bold; color: red"><%=getlastlogin() %></s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025财务专项资金监管合同
- 2025年合同法与旧合同法:新旧规定对比解析
- 2025标准的采购合同范本示例
- 2025农村合作银行社团贷款合同
- 2025年激光扫描绘图机项目发展计划
- 2025年土地流转合同范本正式版
- 医药行业中医药现代化研发方案
- 中国传统家具史知到课后答案智慧树章节测试答案2025年春宁波大学
- 中国典籍外译知到课后答案智慧树章节测试答案2025年春山东建筑大学
- 新能源项目风险评估与应对策略指南
- 信用风险度量第六章-KMV模型课件
- 小学硬笔书法课教案(1-30节)
- 基于CAN通讯的储能变流器并机方案及应用分析报告-培训课件
- 医院清洁消毒与灭菌课件
- 消防安装工程施工方案Word版
- 软管管理规定3篇
- 关于对领导班子的意见和建议
- 【课件】学堂乐歌 课件-2022-2023学年高中音乐人音版(2019)必修音乐鉴赏
- 纳布啡在胃肠镜麻醉中的临床观察-课件
- 常用手术器械手工清洗
- 2022中西医执业医师实践技能疾病对照诊断内科
评论
0/150
提交评论