(MVC)三层架构知识的学习总结

首先介绍一下MVC的意义,和各个层面之间的用途和功能。

1)实体层。主要用来声明在视图层和业务逻辑层之间传递数据的载体。通常代表来源与项目数据库中一个或者多个表组成的一条有意义的记录。

2)业务逻辑层。根据业务逻辑向视图层提供数据,这个项目中的类有权根据业务逻辑来决定是否调用数据库访问层的方法

3)数据库访问层。项业务逻辑层提供访问数据的方法。

4)视图层。主要是以网站开发为例。用于提供显示,添加,编辑和删除数据。

我在VS中创建的项目的结构图:

NetMVC就是所谓的视图层。Entity是实体层,用来声明开发过程中被要使用的所有变量。DAL是数据库访问层,主要完成所有操作对数据库的访问。BLL是业务逻辑层,处理视图层传来的业务逻辑,然后传递给数据库访问层进行处理。

本例主要演示的是登陆页面的实现,Entity层的代码如下:

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Entity
  5. {
  6. public class UserInfo
  7. {
  8. private int UserId;
  9. /// <summary>
  10. /// 用户比编号
  11. /// </summary>
  12. public int UserId1
  13. {
  14. get { return UserId; }
  15. set { UserId = value; }
  16. }
  17. private string username;
  18. /// <summary>
  19. /// 登录账户名称
  20. /// </summary>
  21. public string Username
  22. {
  23. get { return username; }
  24. set { username = value; }
  25. }
  26. private string password;
  27. /// <summary>
  28. /// 登录密码
  29. /// </summary>
  30. public string Password
  31. {
  32. get { return password; }
  33. set { password = value; }
  34. }
  35. private int loginCount;
  36. /// <summary>
  37. /// 登陆次数
  38. /// </summary>
  39. public int LoginCount
  40. {
  41. get { return loginCount; }
  42. set { loginCount = value; }
  43. }
  44. private DateTime regDate;
  45. /// <summary>
  46. /// 注册时间
  47. /// </summary>
  48. public DateTime RegDate
  49. {
  50. get { return regDate; }
  51. set { regDate = value; }
  52. }
  53. private DateTime lastLoginDate;
  54. /// <summary>
  55. /// 最后登录时间
  56. /// </summary>
  57. public DateTime LastLoginDate
  58. {
  59. get { return lastLoginDate; }
  60. set { lastLoginDate = value; }
  61. }
  62. private bool isForbidden;
  63. private string passwordQuestion;
  64. /// <summary>
  65. /// 找回密码提示问题
  66. /// </summary>
  67. public string PasswordQuestion
  68. {
  69. get { return passwordQuestion; }
  70. set { passwordQuestion = value; }
  71. }
  72. private string passwordAnswer;
  73. /// <summary>
  74. /// 找回密码答案
  75. /// </summary>
  76. public string PasswordAnswer
  77. {
  78. get { return passwordAnswer; }
  79. set { passwordAnswer = value; }
  80. }
  81. }
  82. }

完成对实体类的创建,接着就要完成对数据库访问层的创建(其中需要用到上篇问章所写的SqlHelper数据库访问通用类http://blog.csdn.net/yisuowushinian/article/details/7999305),代码如下,

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Configuration;
  7. using Entity;
  8. namespace DAL
  9. {
  10. public class UserDal
  11. {
  12. private string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
  13. /// <summary>
  14. /// 添加用户
  15. /// </summary>
  16. /// <param name="info">用户的实体类</param>
  17. /// <returns></returns>
  18. public bool AddUser(UserInfo info)
  19. {
  20. string sql = "insert into Users(Username,password) values(‘@Username‘,‘@password‘)";
  21. SqlParameter[] parameters = new SqlParameter[4];
  22. parameters[0] = new SqlParameter("@Username", SqlDbType.NVarChar, 30);
  23. parameters[0].Value = info.Username;
  24. parameters[1] = new SqlParameter("password", SqlDbType.VarChar, 50);
  25. parameters[1].Value = info.Password;
  26. return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
  27. }
  28. /// <summary>
  29. /// 删除用户
  30. /// </summary>
  31. /// <param name="UserId">用户编号</param>
  32. /// <returns></returns>
  33. public bool DeleteUser(int UserId)
  34. {
  35. string sql = "delete from users where UserId=" + UserId;
  36. return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
  37. }
  38. /// <summary>
  39. /// 更新用户
  40. /// </summary>
  41. /// <param name="info">用户的实体类</param>
  42. /// <returns></returns>
  43. public bool UpDateUser(UserInfo info)
  44. {
  45. string sql = "update users set [email protected],[email protected] where [email protected]";
  46. SqlParameter[] parameters = new SqlParameter[7];
  47. parameters[0] = new SqlParameter("@password", SqlDbType.VarChar, 30);
  48. parameters[0].Value = info.Password;
  49. parameters[1] = new SqlParameter("@loginCount", SqlDbType.Int, 4);
  50. parameters[1].Value = info.LoginCount;
  51. return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
  52. }
  53. /// <summary>
  54. /// 根据用户名或者用户编号查询用户
  55. /// </summary>
  56. /// <param name="userId">用户编号</param>
  57. /// <returns></returns>
  58. public DataTable GetUser(int userId)
  59. {
  60. string sql = "select * from users where [email protected]";
  61. SqlParameter[] parameters = new SqlParameter[1];
  62. parameters[0] = new SqlParameter("@UserId", SqlDbType.Int, 4);
  63. parameters[0].Value = userId;
  64. return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);
  65. }
  66. /// <summary>
  67. /// 根据用户名查询用户信息
  68. /// </summary>
  69. /// <param name="Username">用户名</param>
  70. /// <returns></returns>
  71. public DataTable GetUser(string Username)
  72. {
  73. string sql = "select * from users where [email protected]";
  74. SqlParameter[] parameters = new SqlParameter[1];
  75. parameters[1] = new SqlParameter("@username", SqlDbType.NVarChar, 30);
  76. parameters[1].Value = Username;
  77. return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);
  78. }
  79. /// <summary>
  80. /// 按照用户编号升序查询从指定位置开始的指定条数记录
  81. /// </summary>
  82. /// <param name="startIndex">查询的起始位置</param>
  83. /// <param name="size">返回的最大记录条数</param>
  84. /// <returns></returns>
  85. public DataTable GetUserList(int startIndex, int size)
  86. {
  87. string sql = "select top " + size + " * from users where UserId not in (select top " + startIndex + " UserId from Users order by UserId asc)order by UserId asc";
  88. return new SqlDbHelper(connectionString).ExecuteDataTable(sql);
  89. }
  90. /// <summary>
  91. /// 查询用户总数
  92. /// </summary>
  93. /// <returns></returns>
  94. public int GetUserCount()
  95. {
  96. string sql = "select count(1) from Users";
  97. return int.Parse(new SqlDbHelper(connectionString).ExecuteScalar(sql).ToString());
  98. }
  99. }
  100. }

然后创建业务逻辑层,代码如下:

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using DAL;
  5. using Entity;
  6. using System.Data;
  7. using System.Data.SqlClient;
  8. using System.Security.Cryptography;
  9. using System.Security;
  10. namespace BLL
  11. {
  12. public class UserBLL
  13. {
  14. private static string MD5Hash(string password)
  15. {
  16. MD5 md5 = MD5.Create();//创建Md5算法实例
  17. //将原始字符串转换成UTF-8编码的字节数组
  18. byte[] sourceBytes = System.Text.Encoding.UTF8.GetBytes(password);
  19. //计算字节数组的哈希值
  20. byte[] resultBytes = md5.ComputeHash(sourceBytes);
  21. StringBuilder buffer = new StringBuilder(resultBytes.Length);
  22. //将计算得到的哈希值的字节数组中的每一个字节转换成十六进制形式
  23. foreach (byte b in resultBytes)
  24. {
  25. buffer.Append(b.ToString("X"));
  26. }
  27. return buffer.ToString();
  28. }
  29. /// <summary>
  30. /// 添加用户
  31. /// </summary>
  32. /// <param name="info">用户的实体类</param>
  33. /// <returns></returns>
  34. public static bool AddUser(UserInfo info)
  35. {
  36. UserDal dal = new UserDal();
  37. DataTable data = dal.GetUser(info.Username);
  38. if (data.Rows.Count > 0)
  39. {
  40. return false;
  41. }
  42. else
  43. {
  44. info.Password =MD5Hash (info.Password);
  45. return new UserDal().AddUser(info);
  46. }
  47. }
  48. /// <summary>
  49. /// 删除用户
  50. /// </summary>
  51. /// <param name="userId">用户编号</param>
  52. /// <returns></returns>
  53. public static bool DeleteUser(int userId)
  54. {
  55. return new UserDal().DeleteUser(userId);
  56. }
  57. /// <summary>
  58. /// 更新用户
  59. /// </summary>
  60. /// <param name="info">用户的实体类</param>
  61. /// <param name="changePassword">是否需要对用户密码进行加密</param>
  62. /// <returns></returns>
  63. public static bool UpdateUser(UserInfo info, bool changePassword)
  64. {
  65. //如果更改密码就需要对新密码进行加密
  66. //如果没有更改密码则不能对密码重复加密,否则会对用户造成无法登陆
  67. if (changePassword)
  68. {
  69. info.Password = MD5Hash(info.Password);
  70. }
  71. return new UserDal().UpDateUser(info);
  72. }
  73. /// <summary>
  74. /// 根据用户编号查询用户
  75. /// </summary>
  76. /// <param name="UserId">用户的编号</param>
  77. /// <returns></returns>
  78. public static DataTable GetUser(int UserId)
  79. {
  80. return new UserDal().GetUser(UserId);
  81. }
  82. /// <summary>
  83. /// 根据用户名查询用户信息
  84. /// </summary>
  85. /// <param name="userName">用户名</param>
  86. /// <returns></returns>
  87. public static DataTable GetUser(string userName)
  88. {
  89. return new UserDal().GetUser(userName);
  90. }
  91. /// <summary>
  92. /// 按照用户编号升序查询从指定位置开始的指定条数的记录
  93. /// </summary>
  94. /// <param name="startIndex">查询的起始位置</param>
  95. /// <param name="size">返回的最大记录条数</param>
  96. /// <returns></returns>
  97. public static DataTable GetUserList(int startIndex, int size)
  98. {
  99. return new UserDal().GetUserList(startIndex, size);
  100. }
  101. /// <summary>
  102. /// 查询用户总数
  103. /// </summary>
  104. /// <returns></returns>
  105. public static int GetUserCount()
  106. {
  107. return new UserDal().GetUserCount();
  108. }
  109. /// <summary>
  110. /// 根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null
  111. /// </summary>
  112. /// <param name="userId">用户编号</param>
  113. /// <returns></returns>
  114. public static UserInfo GetUserEntity(int userId)
  115. {
  116. return ChangeToEntity(new UserDal().GetUser(userId));
  117. }
  118. /// <summary>
  119. /// 根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null
  120. /// </summary>
  121. /// <param name="userName">用户名</param>
  122. /// <returns></returns>
  123. public static UserInfo GetUserEntity(string userName)
  124. {
  125. return ChangeToEntity(new UserDal().GetUser(userName));
  126. }
  127. /// <summary>
  128. /// 将包含Users表记录的DataTables中的第一条记录转换成Userinfo实体
  129. /// </summary>
  130. /// <param name="data"></param>
  131. /// <returns></returns>
  132. private static UserInfo ChangeToEntity(DataTable data)
  133. {
  134. UserInfo info = null;
  135. //如果data不为空并且包含的记录条数大于0、
  136. if (data!=null&&data.Rows.Count > 0)
  137. {
  138. DataRow row = data.Rows[0];
  139. info = new UserInfo();
  140. }
  141. return info;
  142. }
  143. public static bool Login(string userName, string password)
  144. {
  145. bool exits = false;
  146. UserInfo info = GetUserEntity(userName);
  147. if (info != null && MD5Hash(password) == info.Password)
  148. {
  149. exits = true;
  150. info.LoginCount = info.LoginCount + 1;//将用户登陆的次数加1
  151. info.LastLoginDate = DateTime.Now;//将用户最后的登录时间设置为现在
  152. UpdateUser(info, false);//更新用户的登陆次数和最后的登录时间
  153. }
  154. return exits;
  155. }
  156. }
  157. }

这个就完成了对数据库访问层,实体层,业务逻辑层的创建工作。因为在创建过程中被,有很多的重复的工作,我为了加快速度,就省略了一些的代码。

在登陆页面使用时,只需要引入业务逻辑层的方法,然后根据其中的方法,传入相应的参数,就可以完成所有的操作。

时间: 2024-08-22 20:33:26

(MVC)三层架构知识的学习总结的相关文章

ASP.NET(MVC)三层架构知识的学习总结()转

至从使用过一次MVC进行团队开发后,体会到了面向对象开发软件的便利.使用MVC的时候,各个层之间的低耦合使得他们之间的联系非常的第,也就降低了模块之间的依赖程度.首先介绍一下MVC的意义,和各个层面之间的用途和功能.1)实体层.主要用来声明在视图层和业务逻辑层之间传递数据的载体.通常代表来源与项目数据库中一个或者多个表组成的一条有意义的记录.2)业务逻辑层.根据业务逻辑向视图层提供数据,这个项目中的类有权根据业务逻辑来决定是否调用数据库访问层的方法3)数据库访问层.项业务逻辑层提供访问数据的方法

Angular JS从入门基础 mvc三层架构 常用指令

Angular JS从入门基础  mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 1.常用指令 AngularJS 通过指令扩展了HTML,且通过表达式绑定数据到 HTML.下面我们看一下AngularJS中的常用指令. (1).基本概念 指令:AngularJS中,通过扩展HTML的属性提供功能.所以,ng-

SpringMVC学习一、MVC三层架构与SpringMVC原理

SpringMVC SSM:Mybatis + Spring + SpringMVC MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码 MVC主要作用是降低了视图与业务逻辑间的双向耦合 MVC不是设计模式,是一种架构模式.不同的MVC存在差异 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离

MVC三层架构模式编程思想 JSP-Servlet-JavaBean

MVC(Mdodel-View-Controller)编程模式,把一个Java应用分成三层:模型层.视图层.控制层,各层分别实现各层的功能,整个过程见下图就一目了然了. JSP.JavaBean.Servlet三层架构即MVC编程模式是现在我们学习web应用编程的基础思想,上图是经本人总结后做出的图,有不对的地方望各位朋友多提意见.

asp.net mvc 三层架构之dal层查询方法

分享分享分享!!! 首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. .net的三层结构中,并没有action这个概念. asp.net mvc 是微软新发布的一种网站开发架构.为了解决传统asp.net开发中不能分离Model,View和Controller而设计的. 普通的网站为了解决可移植,可维护,可扩展等问题,会把网站设计成三个独立的模块,Model负责数据库部分,View负责网页的界面,而Controller

MVC三层架构在各框架中的特征

转一篇写得很棒的文章:https://my.oschina.net/win199176/blog/208171?p=7&temp=1495894148424 1.基于web开发中最原始的jsp+Servlet   图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端接收到的信息通过封装技术进行解析,在交给web

JSP--JSP语法--指令---九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1. JSP模板元素:JSP中HTML标签及文本 2. 脚本:写JAVA代码,<% %> 3. 表达式:用于输出变量及表达式,<%= %> 4. 注释:分为三种 a) <!-- --> :JSP翻译成Servlet时也将进行翻译.页面中也有. b) <% /*.......*/ %>:JSP翻译成Se

MVC三层架构

新建ViewController类 继承 UIViewController AppDelegate.m #import "ViewController.h" #pragma mark - 重写 #pragma mark dealloc - (void)dealloc { [_window release]; [super dealloc]; } //设置window self.window = [[[UIWindow alloc] init] autorelease]; self.wi

公共增删改查(MVC+三层架构)

1.建立数据访问层:新建一个项目,选择类库,命名为XXXDAL,然后把新生成的类删除,重新建一个类BaseDal,代码如下: public class BaseDal<T> where T : class,new() { syEntities1 db = new syEntities1(); /// <summary> /// 添加 /// </summary> /// <param name="model"></param>