MVC

来源:互联网 发布:淘宝补差价是什么意思 编辑:程序博客网 时间:2024/06/06 06:06

 

三层和MVC 初识篇

分类: 机房收费系统 664人阅读 评论(16) 收藏 举报
架构三层 MVC

       最近一直都在看有关三层和MVC的资料,说来也挺可笑的,刚开始看培养目标的时候,还以为三层和MVC是同一个东西呢,所以去图书馆找资料的时候,也是想着要么找本MVC要么找本三层的书就可以了。反正两者都是一样的嘛!


       随着查阅资料的增多,才发现三层和MVC还真不是同一个东西。那么三层和MVC是什么呢?它们两者有什么区别呢?由于没有项目经验,还只是在初步学习阶段,所以只能借鉴网上大部分主流的观点,先从理论上了解它们,以后会从实践中去体会和了解。


1.什么是三层?     看下面的图:

       所谓的三层体系结构,就是在客户端和数据之间加入了一个“中间层”,也叫“组件层”。这里的三层体系不同于物理上的三层,而是逻辑上的三层,是一种体系结构。典型的三层体系结构是由表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)构成。

      联系现实生活,就会发现用三层体系结构开发的系统与饭店类似,例如下面的这张图:



       上图中可以看出,表示层对应的是饭店的服务员,直接和客户打交道。业务逻辑层对应的是饭店的厨师,负责把采购回来的食品进行加工完成,传递给服务员;数据访问层只负责数据的存储工作,类似于饭店的采购,系统里有什么数据取决于数据访问层的工作,饭店提供什么样的材料取决于采购回来什么材料。


       区分层次的目的即是为了“高内聚,低耦合”的思想。就像饭店中的服务员、厨师和采购员,他们都是独立的个体,一个个体的变化和更改并不影响到另一个个体。例如,如果服务员某天离职了或是请假了,直接用其他的服务员代替即可,而厨师和采购员并不需要发生改动。


       层是一种弱耦合的关系,层与层之间的依赖是向下的,底层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何的影响。


各层的作用:

表示层:主要是指与用户交互的界面,用于显示数据和接收用户输入的数据

业务逻辑层:处在表示层与数据访问层中间,起到了数据交换中承上启下的作用;做一些有效性的验证工作,如完成数据添加,修改和查询业务等。

数据访问层:主要是负责数据库的访问。简单的说就是通过DAL对数据库进行SQL操作。


       其实这里的三层并不是说只有三层,可能是有更多的层。其实相对于不分层的编程方法来说,使用三层或多层架构的应用程序反而运行效率低,代码量大,难度增加。所以三层一般是适用于大型的项目系统,使用多人多组开发。这样适用三层就有利于团队的分工合作,开发人员可以只关注整个结构中的某一层。就像上面的服务员,厨师和采购员,分工合作,各司其职。


2.什么是MVC?看下面的图:

       MVC全名是Model View Controller,是模型(model)-视图(View)- 控制器(Controller)的缩写。MVC开始是存在Desktop程序中,M是指数据模型,V是指用户界面,C则是控制器,MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务逻辑,通常可以用JavaBeanEJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller层是ModelView之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示。


3.三层与MVC的区别

        如果要把三层和MVC进行比较的话,那么三层架构和MVC的相同之处在于他们都有一个表现层。它们的设计理念都是一样的,即把视图设计和数据持久化 进行分离,从而降低耦合性,易于扩展,提高团队开发效率。不同的是,在三层架构中没有定义一个Controller的概念,而MVC也没有把业务的访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然,三层中也提到了Model,但是三层架构中的model是以实体类构成的,而MVC,则是由业务逻辑与数据访问组成的。

       为了比较它们两者的不同,我们可以引入这么一个例子:


        例如,路人甲在在安次区逛街,有人要抢劫他,打110报警了。路人乙,在广阳区也被人抢劫了他也打110报警。他们再打110的时候,接电话的是某某城市的公安局指挥中心。对于路人甲,指挥中心派出的是安次区的分警去解救。对于路人乙,指挥中心派出的是广阳区的分警去解救。对于路人甲和路人乙,他们不需要知道的是到底谁来解救他们,他们只要拨打110即可(类似于页面数据由action提交到控制器),由110的指挥中心确定他们的位置和派出地方警局去解救(控制器根据需求调用Model层去完成对应的数据处理),而三层架构中如果这两个人被抢劫了,他们直接到当地警察局(调用BLL层的方法)找警察来处理。


        其实,不管是三层还是MVC,他们所分的层都相当于是一个黑盒子,我们不用知道它们内部是怎么实现的,只需要去调用它们就行了。每层只需要与上下相邻的两层打交道。当一层的局部由于技术发生改变时,只要接口不变,其他层就不需要进行任何改变。


 

三层架构实战篇—系统登录实例

分类: 机房收费系统 621人阅读 评论(12) 收藏 举报
三层框架登录例子
          上一篇博客,介绍了三层的一些基本理论,但是学习光有理论还是不行滴!马克思不也说过了吗?实践是检验真理的唯一标准!

        所谓的三层分为物理上的三层和逻辑上的三层。物理上的三层包括:客户端(PC)、应用服务器、数据库服务器。逻辑上的三层,也就是我们要讨论的,分为表示层、业务逻辑层、数据访问层。实体层,严格的来说不属于三层中的任一层,它是独立于其他三个层次的,只能供其他层次进行引用,但是不能引用其他的三个层次。

        下面是数据在三层中的一个具体走向图,这对于我们了解三层的一条线很有帮助。


       

       三层应用原则:

  • DAL只提供基本的数据访问,不包含任何的业务逻辑
  • UI只负责显示和采集用户操作,不包含任何业务相关的逻辑处理
  • BLL负责处理业务逻辑。通过获取UI传来的用户指令,执行业务逻辑,在需要访问数据源的时候,直接交个DAL进行处理。处理完成后,返回必要数据给UI。

     实现步骤

       (1)前期准备

              1.根据上一层引用下一层以及实体层在各层的作用,绘制UML图。


       2.根据UML图显示的关系,构建三层框架


       

3.建立数据库,包含UserInfo表。


2)代码实现阶段

1.用户界面层(LoginUI):

       作用:

  • 向用户展现特定业务数据
  • 采集用户的输入信息和操作

       原则:用户至上,兼顾简洁

       添加类:frmLogin


[csharp] view plaincopyprint?
  1. namespace LoginUI  
  2. {  
  3.     public partial class frmLogin : Form  
  4.     {  
  5.         public frmLogin()  
  6.         {  
  7.             InitializeComponent();  
  8.         }  
  9.   
  10.         private void btnLogin_Click(object sender, EventArgs e)  
  11.         {  
  12.             //UI层将用户输入数据传递给BLL层  
  13.             string userName = txtUserName.Text.Trim();  
  14.             string password = txtPassword.Text;  
  15.             Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();  
  16.            Login.Model .UserInfo user= mgr.UserLogin (userName, password);  
  17.   
  18.             //UI层返回业务层传递的数据给用户  
  19.            MessageBox.Show("登录用户:" + user.UserName);  
  20.         }  

2.业务逻辑层(LoginBLL):

       作用:

  • 从DAL获取数据,提供UI显示
  •  从UI获取用户和指令,执行业务逻辑
  • 从UI获取用户和指令,通过DAL写入数据

       BLL的职责机制:

               UI→BLL→UI

               UI→BLL→DAL→BLL→UI   

       添加类:LoginManager    

  

[csharp] view plaincopyprint?
  1. namespace Login.BLL  
  2. {  
  3.     public class LoginManager  
  4.     {  
  5.         public Login.Model .UserInfo UserLogin(string userName,string password)  
  6.     {  
  7.         Login.DAL.UserDAO  uDao = new Login.DAL.uDao ();   //实例化DAL层  
  8.         Login.Model.UserInfo user = uDao.SelectUser(userName, password);  
  9.   
  10.            //不需要访问数据源,直接执行业务逻辑  
  11.         if (user != null)  
  12.         {  
  13.             return user;  
  14.         }  
  15.         else  
  16.         {  
  17.             throw new Exception("登录失败");  
  18.         }  
  19.     }  
  20.     }  
  21. }  


3.数据访问层(LoginDAL):

       作用:SELECT、INSERT/UPDATE、DELETE

       添加类:UserDAO         


[csharp] view plaincopyprint?
  1. namespace Login.DAL  
  2. {  
  3.     public class UserDAO  
  4.     {  
  5.         public Login.Model.UserInfo SelectUser(string userName, string Password)  
  6.         {  
  7.             //建立数据库连接  
  8.             string ConnString = @"Server =192.168.24.45;DataBase =Login; User ID =sa ;Password =123";  
  9.             using (SqlConnection conn = new SqlConnection(ConnString))  
  10.             {  
  11.                 //执行SQL语句进行查询  
  12.                 SqlCommand cmd = conn.CreateCommand();  
  13.                 cmd.CommandText = @"SELECT ID,UserName,Password,Email   
  14.                                                             FROM UserInfo WHERE UserName =@UserName AND Password =@Password";  
  15.                 //输出查询结果  
  16.                 cmd.CommandType = CommandType.Text;  
  17.   
  18.                 //添加两个参数  
  19.                 cmd.Parameters.Add(new SqlParameter(@"UserName", userName));  
  20.                 cmd.Parameters.Add(new SqlParameter(@"Password", Password));  
  21.   
  22.                 conn.Open();  
  23.                 SqlDataReader reader = cmd.ExecuteReader();  
  24.   
  25.                 Login.Model.UserInfo user = null;  
  26.   
  27.                 //读取具体的数据  
  28.                 while (reader.Read())  
  29.                 {  
  30.                     if (user == null)  
  31.                     {  
  32.                         user = new Login.Model.UserInfo();  
  33.                     }  
  34.                     //读取查询到的数据  
  35.                     user.ID = reader.GetInt32(0);  
  36.                     user.UserName = reader.GetString(1);  
  37.                     user.Password = reader.GetString(2);  
  38.                     if (!reader.IsDBNull(3))  
  39.                     {  
  40.                         user.Email = reader.GetString(3);  
  41.                     }  
  42.                 }  
  43.                 return user;   
  44.                 }  
  45.             }             
  46.         }  
  47.     }  

4.实体(LoginModel):

       作用:封装数据,使数据在三层中传输 ,更倾向于业务逻辑层

       添加类:UserInfo


[csharp] view plaincopyprint?
  1. namespace Login.Model  
  2.     {  
  3.         public class UserInfo  
  4.         {  
  5.             //定义用户属性  
  6.             public int ID { getset; }  
  7.             public string UserName { getset; }  
  8.             public string Password { getset; }  
  9.             public string Email { getset; }  
  10.         }  
  11.     }  

原创粉丝点击