导读:三层的学习,也终于得到收获了。这个过程很艰辛,不止一次的想放弃。在这一个学习过程中,真的很感谢师傅的尽心、耐心、费心。其实真的很脆弱,现在回想起来都很不可思议。

一、基本概况

1,什么是三层

我们时常讨论的三层,指的是U层(User Iterface),也叫用户层、显示层;B层(Business Logic Layer),业务逻辑层;D层(Data Access Layer),数据访问层。

2,使用时机

不适用:业务逻辑简单,没有真正意义上的数据存储层

适用:业务逻辑复杂;数据存储到独立的介质。

注意:不是所有的系统都需要三层架构,不应为了分层而分层,从而增加开发负担。

3,各层的作用

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

B:从D层中获取数据,供U层显示用;从U层获取用户指令和数据,执行业务逻辑,并通过D层写入数据源。

D:从数据源加载数据(Select);向数据源写入数据(Insert、Update);从数据源删除数据(Delete)

4,基本原则

D:D层只提供基本的数据访问,不包含任何业务相关的逻辑处理;

U:只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理;(界面设计:用户至上,兼顾简洁)

B:负责处理业务逻辑,同过获取U层传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给D层处理,将处理结果返给U层。

5,引用关系

UI——BLL——DAL

说明:D层所在程序集不引用B层和U层;B层需要引用D层;U层直接引用B层,可能会间接引用D层。

二、具体实例(添加用户)

U层

<span style="font-family:KaiTi_GB2312;font-size:18px;">Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click

        '对密码进行确认
If txtEnsurePassword.Text.Trim = "" Then
MsgBox("请确认密码!")
txtEnsurePassword.Focus()
Exit Sub
End If
'确保用户密码不为空
If txtPassword.Text.Trim = "" Then
MsgBox("请输入密码!")
txtPassword.Focus()
Exit Sub
End If
'保证两次输入的密码一致
If txtEnsurePassword.Text.Trim <> txtPassword.Text.Trim Then
MsgBox("两次密码输入不一致,请重新输入!")
txtEnsurePassword.Focus()
Exit Sub
End If
'防止用户ID文本框为空
If txtUserID.Text.Trim = "" Then
MsgBox("请输入用户ID!")
txtUserID.Focus()
Exit Sub
End If
'用户名必须为数字
If IsNumeric(txtUserID.Text.Trim) = False Then
MsgBox("用户名必须为1-10个数字!")
txtUserID.Focus()
Exit Sub
End If
'添加用户的用户名不为空
If txtUserName.Text.Trim = "" Then
MsgBox("请输入姓名!")
txtUserName.Focus()
Exit Sub
End If
'保证添加的用户的级别不为空
If coboUserLevel.Text.Trim = "" Then
MsgBox("请选择用户级别!")
coboUserLevel.Focus()
Exit Sub
End If
'创建实体对象
Dim MyUser As Charge.Model.UserInfoModel = New Model.UserInfoModel
'对实体赋值
MyUser.UserID = txtUserID.Text.Trim
MyUser.PassWord = txtPassword.Text.Trim
MyUser.UserLevel = coboUserLevel.Text.Trim
MyUser.UserName = txtUserName.Text.Trim
'创建B层对象,并对返回值进行处理
Dim MyAddUser As Charge.BLL.AddUserBLL = New BLL.AddUserBLL
If MyAddUser.IsAddUser(MyUser) Then
MsgBox("该用户添加成功!")
Else
MsgBox("该用户名已经注册,请更改!")
End If</span>

B层

<span style="font-family:KaiTi_GB2312;font-size:18px;">'/**********************************************
'类名:AddUserBLL
'命名空间:Charge.BLL
'创建时间:2014/12/13 10:55:01
'创建人:HHX
'修改时间:
'修改人:
'版本号:v1.0.0
'版权:HHX
'/********************************************** Public Class AddUserBLL
''' <summary>
''' 首先对用户名进行遍历,避免重复,然后注册新用户!
''' </summary>
''' <remarks></remarks>
Dim AddUserD As Charge.DAL.AddUserDAL = New Charge.DAL.AddUserDAL Public Function IsAddUser(ByVal MyUser As Charge.Model.UserInfoModel) As Boolean '判断用户是否成功注册
Dim MyCheck As DataTable
MyCheck = AddUserD.Check(MyUser) If MyCheck.Rows.Count > 0 Then
'用户名重复,不予注册
Return False
Else '用户名不重复,对此用户进行注册
Dim MyAdd As Integer
MyAdd = AddUserD.Add(MyUser)
Return True
End If End Function End Class</span>

D层

<span style="font-family:KaiTi_GB2312;font-size:18px;">'/**********************************************
'类名:AddUser
'命名空间:Charge.DAL
'创建时间:2014/12/12 21:40:24
'创建人:HHX
'修改时间:
'修改人:
'版本号:v1.0.0
'版权:HHX
'/**********************************************
Imports System.Data.SqlClient
Imports System.Configuration Public Class AddUserDAL
''' <summary>
'''共两个方法,Check对用户名进行验证,Add添加新用户
''' </summary>
''' <param name="MyUser"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Check(ByVal MyUser As Charge.Model.UserInfoModel) As DataTable '对新添加的用户进行用户名验证,避免用户名重复
Dim strSql As String
strSql = "select UserID from T_UserInfo where UserID=@UserID"
'给变量赋值
Dim SqlParams As SqlParameter() = {New SqlParameter("@UserId", MyUser.UserID)}
Dim MyHelper As SqlHelper = New SqlHelper
'进行查询
Return MyHelper.ExecSelect(strSql, CommandType.Text, SqlParams) End Function Public Function Add(ByVal MyUser As Charge.Model.UserInfoModel) '经过用户名验证成功后,进行用户添加
Dim strSql As String
strSql = "insert into T_UserInfo(UserID,PassWord,UserLevel,UserName) values(@UserID,@PassWord,@UserLevel,@UserName)"
'对变量进行赋值
Dim SqlParams As SqlParameter() = {New SqlParameter("@UserID", MyUser.UserID),
New SqlParameter("@PassWord", MyUser.PassWord),
New SqlParameter("@UserLevel", MyUser.UserLevel),
New SqlParameter("@UserName", MyUser.UserName)}
Dim MyHelper As SqlHelper = New SqlHelper
'执行
Return MyHelper.ExecAddDelUpdate(strSql, CommandType.Text, SqlParams) End Function End Class</span>

注:SqlHelper是一个封装数据库操作的类。

Model

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class UserInfoModel

    '定义变量
Private strUserName As String
Private strPassword As String
Private strUserId As String
Private strUserLevel As String
Private strHead As String '可读写属性Username
Public Property UserName As String
Get
Return strUserName
End Get
Set(value As String)
strUserName = value
End Set End Property
'可读写属性Password
Public Property PassWord As String Get
Return strPassword
End Get
Set(value As String)
strPassword = value
End Set End Property
'可读写属性UserLevel
Public Property UserLevel As String Get
Return strUserLevel
End Get
Set(value As String)
strUserLevel = value
End Set End Property
'可读写属性Head
Public Property Head As String Get
Return strHead
End Get
Set(value As String)
strHead = value
End Set End Property
'可读写属性UserID
Public Property UserID As String Get
Return strUserId
End Get
Set(value As String)
strUserId = value
End Set End Property End Class
</span>

三、分层的优点

主要优点:解耦和,易于维护和合作(层与层之间分工明确)。


四、个人感受

学习三层真的挺痛苦的,不过熬过去了也就过去了。三层虽好,但也不能到处乱使,还得根据情况集体分析。

其次,在这个过程中,又发现了自己的一个大问题:我喜欢自己磨,我要磨个一两天,甚至的三四天,我要磨到我实在找不出方法来了,我才会去找别人交流。师傅说我这样费事儿,要多去和别人交流,可是我发现我改不过来,我也知道自己磨不好,但如果还有方法没有尝试过,我就是不愿意去找别人要一个答案。尽管师傅说我费事儿,但我发现我还是挺享受这个痛苦又甜蜜的过程的。不过,我以后会改。

【U+B+D】三层框架 原理+实例的更多相关文章

  1. 【EF 1】EF实体框架 原理+实例

    一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...

  2. day13(JSTL和自定义标签&MVC模型&javaweb三层框架)

    day13 JSTL标签库(重点) 自定义标签(理解) MVC设计模式(重点中的重点) Java三层框架(重点中的重点) JSTL标签库   1 什么是JSTL JSTL是apache对EL表达式的扩 ...

  3. ASP.NET动态网站制作(28)-- 三层框架(2)

    前言:三层框架的第二节课,继续上次课的内容. 内容: 1.三层框架的使用目的:可以将视图层和业务逻辑层及实体层分开,可以提高代码的扩展性,安全性,可以实现程序的低耦合性. 2.GetModel方法及G ...

  4. JSP+JavaBean+Servlet工作原理实例…

    JSP+JavaBean+Servlet工作原理实例讲解 首先,JavaBean和Servlet虽都是Java程序,但是是完全不同的两个概念.引用mz3226960提出的MVC的概念,即M-model ...

  5. 【MVC 1】MVC+EF实体框架—原理解析

    导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...

  6. kbmMemTable关于内存表的使用,以及各种三层框架的评价

    关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...

  7. ASP.NET Core 6框架揭秘实例演示[28]:自定义一个服务器

    作为ASP.NET Core请求处理管道的"龙头"的服务器负责监听和接收请求并最终完成对请求的响应.它将原始的请求上下文描述为相应的特性(Feature),并以此将HttpCont ...

  8. 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)

    MVC 1. 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...

  9. spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...

随机推荐

  1. 从零开始利用vue-cli搭建简单音乐网站(五)

    上一篇文章讲到的是如何利用mongoose从数据库读取数据然后更新页面,接下来要实现的就是用户注册登录功能,这个功能涉及到的东西太多了,今天只实现了登录功能,登陆之后更新导航条界面,最后效果如下: 登 ...

  2. Genymotion的安装与设置

    Genymotion是一款非常好用的虚拟机,利用它可以在window.Liunx或MAC系统上实现Android的模似器.对于开发人员来说,有了Android模似器,就可以在电脑上实时调试安卓app, ...

  3. Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法

    Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法

  4. HDU 5469 Antonidas (树形DP,暴力)

    题意: 给一棵n节点的树图,每个点都是一个小写字母,要求找到两个点(a,b),从a->b的路径上形成了一个字符串为s.给出s,问是否存在这样的点对. 思路: 考虑一个点,要么从该点出发,要么在该 ...

  5. HDU 4044 GeoDefense (树形DP,混合经典)

    题意: 给一棵n个节点的树,点1为敌方基地,叶子结点都为我方阵地.我们可以在每个结点安放炸弹,每点至多放一个,每个结点有ki种炸弹可选,且每种炸弹有一个花费和一个攻击力(1点攻击力使敌人掉1点hp). ...

  6. scanf("%s",s)与gets(s)

    #include <stdio.h> void fun(char s[]) {; while(s[i]!='\0') {i++;} printf("%d",i);} v ...

  7. [转]八款开源Android游戏引擎

    八款开源Android游戏引擎 1.Angle Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发.该引擎全部用Java代码编写,并且可以根 ...

  8. Web性能优化系列:10个JavaScript性能提升的技巧

    由 伯乐在线 - Delostik 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:jonraasch.com.欢迎加入翻译小组. Nicholas Zakas是一位 JS 大师,Yahoo! 首页 ...

  9. 多线程下载命令--axel

    axel是轻量级多线程下载工具,对比传统下载工具curl和wget,下载速度上提升不少 centos安装如下 yum install -y axel 命令行用法 axel [option] url1 ...

  10. HTML5服务器发送事件(Server-Send Events)

    HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...