三层架构介绍

三层架构详解 三层架构是一种常见的软件架构模式,用于将应用程序划分为三个不同的层次:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer),每个层次都有不同的职责和功能。Java三层架构实战:从数据库表到控制层的完整开发流程。 阅读详情
AI摘要

三层架构将应用分为界面层、业务逻辑层和数据访问层,旨在实现高内聚、低耦合,提高系统的可维护性和可扩展性。表示层负责用户交互,业务逻辑层处理业务规则,数据访问层则与数据库交互。三层通过实体层进行通信,降低模块间交互复杂度,使得各层职责明确,降低变更影响。

一、什么是三层架构?

1.1概述

三层架构(3-tier architecture) 就是将整个业务应用划分为:

  • 界面层(User Interface layer) UI
  • 业务逻辑层(Business Logic Layer) BLL
  • 数据访问层(Data Access layer) DAL

在这里插入图片描述

1.2表示层

  • 表示层,又称界面层,是与用户交互的界面。位于最外层/最上层,离用户最近,用于接收用户输入的数据和显示处理后用户需要的数据。

  • 【接受请求,封装数据,调用业务逻辑层,响应数据(servlet,jsp)】

1.3业务逻辑层

  • 业务逻辑层,又称服务层,是表示层和数据访问层之间的桥梁。位于中间层,用来处理业务逻辑,具体包含:验证、计算、业务规则等等。

1.4数据访问层

  • 数据访问层,是对数据库访问的层。位于最里层/最下层,主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

1.5层与层的关系

  • 表示层依赖于业务逻辑层
  • 业务逻辑层依赖于数据访问层

既然三层各司其责,那么怎么将三层联系起来?

这个时候实体层(Entity) 来了

  • Entity(实体层):它不属于三层中的任何一层,但是它是必不可少的一层
  • Entity在三层架构中的作用:
    • 1、实现面向对象思想中的"封装";
    • 2、贯穿于三层,在三层之间传递数据;(注:确切的说实体层贯穿于三层之间,来连接三层)
    • 3、每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。

二、为什么需要三层架构?

三层架构的出现就是为了“高内聚,低耦合”

内聚:一个模块内各个元素的关联度。
耦合 :各个模块之间的关联度。
  • 高内聚 :尽可能一个类/模块只负责一个功能(一个模块内的元素关联度,越容易理解、修改和维护,出错就越少)。
  • 低耦合 :模块与模块之间的关联度要尽可能的低,避免牵一发而动全身
  • 从类角度来看:高内聚低耦合:减少类内部,对其他类的调用
  • 从功能块来看:高内聚低耦合:减少模块之间的交互复杂度

简单来说,就是解耦:减少模块之间的交互复杂度,自己做自己的事

三层: 发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高

在这里插入图片描述

两层: 当任何一个地方发生变化时,都需要重新开发整个系统。“多层”放在一层,分工不明确耦合度高,难以适应需求变化,可维护性低、可扩展性低

在这里插入图片描述

三、层架构的应用

在这里插入图片描述

3.1原则

  • 上层依赖其下层,依赖关系不跨层
    • 表示层不能直接访问数据访问层
    • 上层调用下层的结果,取决于下层的实现
  • 下一层不能调用上一层
  • 下一层不依赖上一层
    • 上层的改变不会影响下一层
    • 下层的改变会影响上一层得到的结果
  • 在上一层中不能出现下一层的概念
    • 分工明确,各司其职

3.2例子:实现登录功能

表现层:jsp页面

	<body>
		<div class="container" style="margin-top:140px;height: 100px;">
			<div class="row">
				<div class="col-md-6 bg-primary">
					<h2 class="text-white">欢迎登录</h2>
					<p class="text-white">商城后台管理系统</p>
				</div>
				<div class="col-6 bg-white py-5">
					<form action="login.do" method="post" onsubmit="return myLogin()">
						<div class="mb-3">
							<label for="exampleInputEmail1" class="form-label">邮箱账号</label>
							<input placeholder="请输入邮箱账号" ptype="email" class="form-control" id="exampleInputEmail1"
								aria-describedby="emailHelp" name="username">
						</div>
						<div class="mb-3">
							<label for="exampleInputPassword1" class="form-label">密码</label>
							<input placeholder="请输入密码" type="password" class="form-control" id="exampleInputPassword1" name="password">
						</div>
						<div class="mb-3">
							<label for="exampleInputPassword1" class="form-label">验证码</label>
							<div class="input-group mb-3 " style="width: 200px;">
								<input id="yz" placeholder="请输入验证码" type="text" class="form-control">
								<button id="login" type="button" class="btn btn-primary">
									<span id="code" class="badge bg-danger">9888</span>
								</button>
							</div>
						</div>
						<button type="submit" class="btn btn-primary">登录</button>
					</form>
				</div>
			</div>
		</div>
	</body>

控制器:Servlet

Servler通常作为控制器位于服务层和表示层之间,处理请求并相应地调用服务层方法执行业务逻辑

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置编码
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		// 获取参数
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		// 处理请求
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		//实例化业务逻辑层对象
		IUserService ius=new UserServiceImpl();
		User login = ius.login(username, password);
		System.out.println(login);
		if (login != null) {
			session.setAttribute("Login", login);
			out.println("<script>alert('登录成功');location.href='good.jsp'</script>");
		} else {
			out.println("<script>alert('账号或密码错误');location.href='login.jsp'</script>");
		}

	}
}

业务逻辑层:

/**
 * 业务逻辑层
 * 定义接口类
 * @author 许潜行
 *
 */
public interface IUserService {
	/**
	 * 用户登录方法
	 * @param uname
	 * @param upwd
	 * @return
	 */
	public User login(String uname,String upwd);
}

/**
 * 业务逻辑层
 * 实现接口类
 * @author 许潜行
 *
 */
public class UserServiceImpl implements IUserService {

	//实例化数据访问层对象
	private IUsersDao iud=new UsersDaoImpl();
	@Override
	public User login(String uname, String upwd) {
		return iud.login(uname, upwd);
	}

}

数据访问层:

/**
 * 数据访问层
 * 定义接口
 * @author 许潜行
 *
 */
public interface IUsersDao {
	/**
	 * 用户登录方法
	 * @param uname
	 * @param upwd
	 * @return
	 */
	public User login(String uname,String upwd);
}


/**
 * 数据访问层
 * 实现接口类
 * @author 许潜行
 *
 */
public class UsersDaoImpl extends BaseDao implements IUsersDao {
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	 public User login(String uname,String upwd) {
	        User u=null;
	        String sql="select * from tb_user where username=? and password=?";
	        try {
	        	rs=this.executeQuery(sql, new Object[] {uname,upwd});
	            if(rs.next()) {
	                u=new User(rs.getInt(1), rs.getString(2), rs.getString(3));
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            DBHelper.myClose(conn, ps, rs);
	        }
	        return u;
	    }
	    public static void main(String[] args) {
			User login = new UsersDaoImpl().login("user123@qq.com", "a12345");
			System.out.println(login);
		}

}

	

实体类:

public class User {
	private Integer id;
	private String username;
	private String password;

	public User() {
		// TODO Auto-generated constructor stub
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public User(Integer id, String username, String password) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}

}

BaseDao

/**
	 *增删改通用方法
	 * @param sql
	 * @param obj
	 * @return
	 */
	public int execute(String sql,Object...obj) {
		int n=0;
		try {
			//建立连接
			conn=DBHelper.getConn();
			//传入sql并执行
			ps=conn.prepareStatement(sql);
			//占位符赋值
			if (obj!=null) {
				for (int i = 0; i < obj.length; i++) {
					ps.setObject(i+1, obj[i]);
				}
			}
			//返回结果
			n=ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			DBHelper.myClose(conn, ps, rs);
		}
		return n;
	}
	/**
	 * 查询通用方法
	 * @param sql
	 * @param obj
	 * @return
	 */
	public ResultSet executeQuery(String sql,Object...obj) {
		try {
			//建立连接
			conn=DBHelper.getConn();
			//传入sql并执行
			ps=conn.prepareStatement(sql);
			//占位符赋值
			if (null!=obj) {
				for (int i = 0; i < obj.length; i++) {
					ps.setObject(i+1, obj[i]);
				}
			}
			//返回结果
			rs=ps.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rs;
	}


JavaWeb简易入门(三) 三层架构(该部分引自菜鸟教程) 什么是三层? UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。 BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。 DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库... 阅读详情

相关推荐

移动应用架构解析:用户界面层、业务逻辑层、数据访问层

移动应用的成功离不开一个良好的架构设计,在移动应用开发过程中,合理的层次结构对于应用的可维护性、可扩展性和可测试性至关重要。移动应用的常见层次结构包括用户界面层、业务逻辑层、数据访问层,但是随着跨平台开发框架的不断发展,以React Native、Flutter为代表的工具已经深入到移动应用架构中,本文希望探讨在每个层次中使用React Native和Flutter等开发框架的优势。

POHOU23的博客 4116

什么是三层架构?

三层架构 三层架构来源于后端开发的一种分层的思想。 引用自百科的解释: 三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。 区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(

weixin_49066399的博客 4万+

软件工程_三层架构介绍

一、三层架构 1、什么是三层? UI(表现层):主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。 BLL:(业务逻辑层):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。 DAL:(数据访问层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当...

云计算架构师的博客 2295

三层架构 详解

文章目录前言什么是三层架构?为什么要用三层架构?优缺点:怎么用三层架构?实例演练: 前言 当看到一个陌生的名词时你会怎么想?what?way?how? 现在就按照这个思维框架走进“三层架构”。 什么是三层架构? 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。 1、表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 2、业务逻辑层(BLL):针对具体问题的

潘小蓝的博客 5303

三层架构简要介绍

三层架构是哪三层 界面层(User Interface layer) 业务逻辑层(Business Logic Layer) 数据访问层(Data access layer) 如何搭建三层架构 步骤1: 文件---新建---项目---Windows窗体应用程序 名称:UIL 解决方案名称:Demo3Tier 选中解决方案名称:Demo3Tier 添加---新建项目---类库 名称:BLL 选中解决方案名称:Demo3Tier 添加---新建项目---类库 名称:DAL 选中解决方案名称:D

baidu_39283498的博客 378

Nornir自动化简单介绍-网络设备信息收集

作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。 Nornir就是这样一个自动化网络运维工具。按照官网上的说明: Nornir是用python编写的自动化框架,可与python一起使用。Nornir旨在通过提供一个纯Python框架来解决这些问题。 详细参考: Github GitHub - nornir-automation/nornir: Pluggable multi-threaded framework with inventory .

Gun&rose 7805

SpringBoot中的三层架构简单介绍

声明业务方法,不包含具体实现。便于后续扩展(如实现类切换为分布式版本)。代码示例/*** 获取所有用户(业务规则:按创建时间降序排序)*//*** 根据ID获取用户(业务规则:如果用户不存在,抛出异常)*//*** 创建用户(业务规则:用户名和邮箱不能为空)*/代码示例@Mapper// 查询所有用户// 根据ID查询用户// 插入用户(返回自增ID)

H545569的博客 2263

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 234

什么是三层架构?简单的介绍三层架构!

三层架构(3-tierarchitecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(Presentation layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。    MVC也分为三层,但不是我们所说的三层架构。MVC只相当于三层架构中的UI。

LoveSummer 1万+

基于TDOA的chan算法(定位算法)

Chan算法原理 TDOA(TDOA,the time differences of arrival,到达时间差),Chan算法是TDOA定位方法的一个很好用的方法。 Chan算法是非递归双曲线方程组解法,具有解析表达式解,主要特点是:在测量误差服从理想高斯分布时,它的定位精度高、计算量小,并且可以通过增加已确定点的数量来提高算法精度。 该算法的推导前提是基于测量误差为零均值高斯随机变量,对于实际环境中误差较大的测量值,比如在有非视距误差的环境下,该算法的性能会有显著下降。二维情况下,可分为只有三个点参与定

优快云不再更新 2万+

使用基于python的neurora进行表征相似性分析(RSA)

发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。

zjh12312311的博客 2764

三层架构的介绍

三层架构模式介绍 三层架构模式: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了 “高内聚低耦合” 的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。 表

m0_62198213的博客 3194

智能网联汽车云控系统核心解析:车云数据交互协议设计与实践

本文深入解析了智能网联汽车云控系统的核心——车云数据交互协议的设计与实践。文章围绕“说什么”、“怎么说”及异常处理三大核心问题,详细阐述了二进制与结构体数据类型定义、TCP/UDP双通道传输机制、通用报文格式以及典型交互流程(如GLOSA车速引导),并分享了时间同步、坐标系定义等关键实战经验与避坑指南,为构建高效、可靠、安全的车云“神经系统”提供专业指导。

alice7model的博客 121

三层架构简单介绍

目录 前言 一、什么是三层架构 各模块功能划分表: 三层架构运作流程图: 三层架构中各功能模块如何联系? Entity在三层架构中的作用: 三层及实体层之间的依赖关系: 二、为什么使用三层架构 三、三层与两层的区别 三层架构的优势: 三层架构的劣势: 前言 在阅读本篇文章时请关注如下问题: 1.什么是三层架构? 2.为什么使用三层架构? 3.三层与以往使用的两层相比有什么不同?它的优势在哪里? 4.如何学好三层架构?如何应用三层架构? 一、什么是三层架构 ...

不想掉头发$的博客 1万+

泰山派rk3566 audio音频基础介绍

本文介绍了嵌入式系统中音频处理的基础知识,重点围绕RK3566平台的音频子系统展开。文章首先解释了音频信号从模拟到数字的转换过程,包括采样率、位深和声道等核心概念。随后详细分析了嵌入式音频开发中的关键接口:I2C用于控制音频编解码器,I2S作为专用音频数据传输总线,以及PCM作为原始音频格式和ALSA设备抽象的双重含义。通过对这些基础概念和接口的解析,为在RK3566平台上进行音频驱动开发和应用调试提供了理论基础。

qq_37077309的博客 294

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1150

三层架构详细介绍

一、分层架构-3层架构-多层架构 逻辑关系图 架构:   架构一般是针对整个系统的,并非对某个单独的问题(单独的问题可以用模式等来解决)   针对整个系统的“一张蓝图”,对系统的抽象。架构与具体的语言平台无关。   架构设计、模式应用的经验积累的具体代码实现,方便以后的复用。Asp.net mvc、NHibemate、NSpring、... 模式:   软件开发中遇到的一些...

weixin_30384031的博客 1099

【unity小技巧】新输入系统InputSystem游戏运行中改键重新绑定控制按键(最全最完美解决方案)

在游戏开发中,控制输入是至关重要的一环。Unity的新输入系统(Input System)为开发者提供了强大的工具来管理和处理用户输入,不仅支持各种平台上的多种输入设备,还能轻松处理复杂的输入操作和映射。本文将深入探讨如何使用Unity的新输入系统重新绑定控制按键,为开发者提供一套全面且完善的解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7358

MVC(Model-View-Controller)架构模式和三层架构介绍

本文系统解析MVC架构模式的核心组件与交互流程,通过用户注册案例演示模型、视图、控制器的协同机制,对比MVC与三层架构的异同及互补关系,阐述分层设计如何提升系统可维护性和扩展性,为现代Web开发提供清晰的架构设计指导。

m0_73941339的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JavaWeb 三层架构简单介绍与案例实现

本文介绍了JavaWeb开发中的三层架构模式(表现层、业务逻辑层、数据访问层),并通过一个用户管理系统案例完整展示了其实现过程。案例采用SpringBoot框架,包含实体类、DAO接口及实现、Service接口及实现、Controller控制层等核心代码,使用Hutool工具简化文件操作。项目结构清晰,实现了层间解耦,展示了从数据读取到展示的完整流程,控制台输出用户数据验证了架构的有效性。该案例非常适合JavaWeb初学者理解分层开发思想,代码可直接复用。

2402_84971234的博客 1510

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java ee 三层架构_JavaEE——三层架构模式介绍

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。三层架构模式介绍三层架构模式:三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data ac...

weixin_33657398的博客 1870

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

三层架构、MVC、springMVC介绍

三层架构 我们开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也即是浏览器/服务器。在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,现在Java项目中也都是基于三层架构设计的。 表现层: 也就是我们常说的web层。它负责介绍客户端的请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应。 表现层包括展

CVPR收割机的博客 995
上一篇: JavaWeb02
下一篇: Jsp相关介绍
许潜行
博客等级 码龄4年 302粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值