1、静态网页设计教程 学习情境四,搭建系统框架,回顾2-1,三层结构都有哪三层? 上一章里我们学习了哪三种导航控件?,回顾2-2,string sql = “SELECT SubjectName FROM Subject“; SqlCommand command = new SqlCommand(sql, DBHelper.connection); DBHelper.connection.Open(); SqlDataReader dataReader = command.ExecuteReader(); while (dataReader.Read( ) cboSubject.Items.Add
2、(dataReader“SubjectName“.ToString(); ,未关闭 Reader dataReader.Close();,未关闭连接 DBHelper.connection.Close(); DBHelper.connection.Dispose();,预习检查,模型层有哪些内容? 数据访问层一般写哪些方法?,本章任务,搭建网上书店的架构 实现书店的用户登录,本章目标,会在 ASP.NET 中使用三层结构。 能够实现三层结构下的用户注册和登录。,系统架构,三层结构 表示层 业务逻辑层 数据访问层,分层的理念:将相似的内容放到一起去处理,开发人员可以只关注整个结构中的其中某一层,
3、可以很容易的用新的实现来替换原有层次的实现,三层结构的经典案例:PetShop,PetShop4.0,宠物商店 微软展示.NET企业开发的范例。 与Sun的PetStore的商业竞争。 一个小型的电子商务案例。 体现了微软推广的开发思想和设计理念。 分22个项目,经典的系统,从设计的思想到最好的编码,学习参考价值很高。,演示:PetShop4.0,PetShop4.0架构简介,ASP.NET Web,BLL,DALFactory,OracleDAL,SQLServerDAL,IDAL,Model,表示层,业务层,数据层,典型的三层结构,搭建第三波网络书店的模型层,模型层 表示层需要访问实体对象
4、的属性值。 业务层需要通过实体对象处理业务逻辑。 数据层也需要通过实体对象读写数据库。 模型是数据载体。 命名 项目名:MyBookShopModels 命名空间:MyBookShop.Models 类名:图书表Books图书类Book 实体类通常冠以Serializable特性,以保证实体传输的可靠性,外键的处理,数据库中有主外键关系,模型层怎么表示? 比如用户表和状态表。 状态字段是用户表的外键。两种方式: 为实体类添加状态id属性,存储状态id。 为实体类添加状态属性,存储状态对象。,示例,用户类的模型 用户需要有登录名、密码、状态等属性 状态表存储状态名称 用户的状态属性使用状态对象,
5、public UserState UserState get return this.userState; set this.userState = value; ,处理外键的代码,Serializable() public class User /字段public User() /构造函数/常见属性public UserState UserState/用户状态-外键get return this.userState; set this.userState = value; ,小结,编写实体类UserRole并更新User类相关属性 类关系图如下,答案:UserRole类,数据访问层,数据访问
6、层 所有与数据库交互的操作 数据表的增、删、查、改操作 数据访问层不做逻辑判断 命名 项目名:MyBookShopDAL 命名空间:MyBookShop.DAL 类名:图书表Books图书数据访问类BookService,代码比较,比较两段代码 代码1 代码2 在每一个对象的数据库访问类中: 数据库连接反复出现 数据库连接打开和关闭反复出现 执行Sql语句的方法相似 返回记录集的方法相似,根据面向对象思想,是否可以减少这些重复劳动?,DBHelper类,我们将常用方法提取出来,作为DBHelper类该类包含了:,建立数据库连接,执行Sql的方法 (存储过程sql语句),返回记录集,返回Read
7、er,返回结果,创建数据访问层的类,创建UserService类 Create方法Retrieve方法Update方法Delete方法,bool AddUser(User user),IList GetAllUsers( ) User GetUserById(int id) IList GetUsersBySql(string sql),bool DeleteUserById(int id),bool UpdateUser(User user),增加一个用户的方法,public static bool AddUser(User user) string sql =“INSERT USERS (
8、loginid, loginpwd, name, address, phone, mail, userroleId,UserStateId)“ +“VALUES (LoginId,LoginPwd,Name,Address,Phone,Mail, RoleId,UserStateId)“;SqlParameter para = new SqlParameter new SqlParameter(“LoginId“,user.LoginId),;DBHelper.ExecuteCommand(sql, para);return true; ,组合SQL语句,参数赋值,调用DBHelper类中的方
9、法进行处理,小结,模型层为什么要标记为可序列化? 模型层的作用? 数据访问层的功能?编写User的数据访问类的查、改、删方法。,示例:User的数据库访问类,业务逻辑层,业务逻辑层 是表示层与数据访问层的桥梁, 负责逻辑的判断,业务处理、数据传递。 不在表示层访问数据库,数据更加安全。 命名 项目名:MyBookShopBLL 命名空间:MyBookShop.BLL 类名:图书表Books图书业务逻辑层类BookManager,用户登录的业务逻辑方法,public static bool Login(string loginId, string loginPwd, out User valid
10、User) User user = UserService.GetUserByLoginId(loginId);if (user = null)validUser = null;return false;if (user.LoginPwd = loginPwd)validUser = user;return true;elsevalidUser = null; /密码错误return false; ,表示层,表示层的设计给客户最直接的体验。 页面风格和布局,美观大方。 页面操作符合逻辑,讲究用户体验 。 注意风格统一。,表示层负责内容的展现和与用户的交互。 可以进行变量范围的验证。 不做业务逻
11、辑判断。 不做与数据库交互的处理。,用户管理模块,首先根据数据库创建模型层。 包括用户的实体类以及相关联的类。 创建数据访问层用户管理类。 包括增删查改方法。 设计相关页面,并编写事件代码。 新用户注册。 用户登录。 用户信息修改。 创建业务逻辑层处理类。 根据需要,添加相关方法。,示例1,用户登录 创建页面。 编写事件处理代码,包括验证输入。 创建业务逻辑层方法,调用数据访问层相关方法处理。,演示示例:用户登录,用户注册的确认事件代码, User user = new User(); user.LoginId = this.txtLoginId.Text; user.UserState =
12、new UserState(); user.UserState.Id = 1; if (UserManager.AddUser(user) this.ltMain.Text = “alert(注册成功!请继续购物 ); window.location=/default.aspx“; else this.ltMain.Text = “alert(用户名已使用!请重新选择!) “; ,实例化User类,对类相关属性进行赋值,默认值,硬编码,业务层进行相关判断和处理,弹出脚本提示 小技巧:在控件上输出脚本,小结,编写图书模块相关实体类和数据层、业务层的类。 图书有id、作者、标题、分类、出版社、描述、ISBN(简化)。 出版社有id、名称。 分类有id、名称。 编写图书、出版社、分类的实体类。 编写图书的数据层增删查改方法。 编写图书业务层的查询所有的方法。,演示示例:图书模块相关类,总结,数据访问层常见的方法有哪几种? 页面要显示一个表的内容,可否直接使用ADO.NET连接数据库,为什么? 业务逻辑层的方法来自哪部分的需求?,