JavaEE 分层模型:Web 服务器 + 核心框架 + 交互逻辑全解析
1.1 JavaEE应用的分层模型
-
表现层:也就是常说的WEB层。主要负责接收客户端请求,向客户端响应结果。表现层也细分为:展示层和控制层
-
- 展示层:负责展示结果。由一系列JQuery、Angular、Vue等各种前端框架组成
-
- 控制层:负责接收请求和拦截非法请求。由一系列JSP页面、FreeMarker页面组成
-
业务层:由一系列业务逻辑对象组成,这些业务逻辑对象实现了Domain Object方法及其他组件实现的业务逻辑方法
-
- Domain Object(领域对象):此层由一系列POJO对象组成,用于实现业务逻辑方法
-
- 事务控制:业务层经常需要确保事务的一致性。
-
持久层:主要负责数据的持久化,数据层通常包括数据库和数据访问层
-
- 数据库:指具体的数据库软件,例如mysql、Oracle等。通常是利用数据库驱动以及数据库连接池技术实现与数据库的连接
最原始的当然就是JDBC,后续衍生出来的JPA、Mybatis以及Mybatis-plus都是对于JDBC的封装,简化开发。
-
- 数据访问层:也就是DAO(Data Access Object),用于编写持久层接口,用于将实体对象转换为业务对象。

- 数据访问层:也就是DAO(Data Access Object),用于编写持久层接口,用于将实体对象转换为业务对象。
交互逻辑:
1、表现层交由用户进行控制,用户操作表现层,将请求发送至控制层
2、控制层调用业务层,处理用户请求
3、业务层根据业务的实际需求,调用持久层将用户操作存储在数据库,或从数据库取出数据
4、持久层返回操作结果给业务层
5、业务层返回持久层结果给控制层
6、控制层进行一定的数据封装、渲染,返回给表现层
1.2 表现层
表现层主要需要解决的问题是展示层和控制层的如何通信。
展示层不管是采用JSP还是VUE,都需要将用户的请求发送到控制层。
控制层不管是用Java,还是Python,也都需要将响应结果反馈给展示层。
1.2.1 Web服务器
Web服务器:Web服务器提供了各式各样的功能,侧重点也不也一样,Java中常用的三种Web服务器就是Tomcat、Undertow、Jetty
Tomcat
Tomcat 是 Apache 软件基金会开发的开源 Web 服务器,也是 Java Web 应用中最广泛使用的 Servlet 容器之一。它支持 Java Servlet 和 JavaServer Pages (JSP) 技术,适用于传统 Java Web 应用的开发和部署。Tomcat 以其稳定性和社区支持而闻名,适合中小规模企业级应用 。
Tomcat 的主要特点包括:
稳定性高:经过长期发展和广泛使用,Tomcat 在稳定性和可靠性方面表现优异。
支持标准 Java Web 技术栈:支持 Servlet、JSP、JSTL 等标准技术。
社区支持广泛:拥有庞大的用户社区和丰富的文档资源。
Jetty
Jetty 是一个轻量级、高性能的 Java Web 容器,由 Eclipse 基金会维护。它支持 Servlet 3.1 和 WebSocket,适用于高性能和分布式系统。Jetty 以其轻量级和快速启动的特点而受到青睐,适合嵌入式应用和微服务架构 。
Jetty 的主要特点包括:
轻量级:启动快、内存占用低,适合嵌入式应用和微服务。
高性能:支持异步非阻塞 I/O,适合高并发场景。
灵活性:支持按需加载组件,便于扩展和定制。
Undertow
Undertow 是 Red Hat 开发的高性能 Web 服务器,基于 NIO 实现,支持异步非阻塞 I/O 和 HTTP/2。它被广泛用于 WildFly 应用服务器,并且在 Spring Boot 中作为可选的内嵌服务器。Undertow 以其高性能和灵活性而受到关注 。
Undertow 的主要特点包括:
高性能:在高负载下表现优异,吞吐量高,适合高并发场景。
灵活性:支持异步非阻塞 I/O,适合实时通信和微服务架构。
轻量级:配置简单,易于集成到 Spring Boot 等框架中。
总结
Tomcat:适合传统 Java Web 应用,稳定可靠,社区支持广泛。
Jetty:适合轻量级、高性能和嵌入式应用,启动快、内存占用低。
Undertow:适合高性能、高并发场景,支持异步非阻塞 I/O,适合微服务和实时通信。
其他服务器
Jboss:是一个遵从了javaEE规范的、开源的、纯EJB服务器,它支持所有的javaEE规范
GlassFish:由Oracle公司开发的一款JavaWeb服务器,是一款强健的商业服务器,达到产品级质量
Resin:自身采用Java开发,是目前最快的JSP、Servlet运行平台,支持EJB,商用收费,个人免费
WebLogic:是Oracle公司的产品,目前应用最广泛的Web服务器,支持JavaEE规范,适合大型项目(收费,大公司用得比较多)
Nginx服务器:负载均衡服务器,主要用于反向代理,详细介绍参考:Nginx
IIS(Internet Information Services)服务器:微软公司开发的WEB服务器,允许托管网站和Web应用,并提供了一系列用于Web服务器管理的功能
1.2.2 JSP、Servlet、JavaBean
JSP是动态Web,HTML是静态Web。
JSP和Servlet底层实现原理一致,JSP必须被Web服务器编译为Servlet,才能使用,所以真正在Web服务器中运行的是Servlet
JavaBean是用于数据传输的,请求/响应携带的数据

Servlet在2.5版本及之前都是采用的xml配置的方式,在3.0之后就是注解的方式实现了 Servlet在4.x中提供了异步请求、注解、增强的Servlet API、非阻塞IO
1.2.3 静态web和动态web
1.2.3.1 静态web
htmlhtm网页,通过直接获取的方式,进行页面展示,所有的用户看到的都是同一个页面 css、js、txt mp4 jpg等都算是静态web资源

静态web存在的缺点:
Web页面无法动态更新,所有用户看到的都是同一个页面
无法和数据库交互(数据无法持久化,用户无法交互)
1.2.3.2 动态web
jsp/sevlet动态资源,可以与数据库进行交互,实现动态页面
ASP:微软的产品,底层是在HTML中嵌入VB的脚本,ASP+COM,导致在页面中包含太多业务逻辑代码
PHP:开发速度很快,功能很强大,跨平台,代码很简单,但是无法承载大访问量的情况
JSP:本质是Servlet,是sun公司开发的B/S架构,可以承载三高(高性能、高可用、高并发)问题,语法像ASP

动态Web的缺点:假如服务器的动态web资源出现错误,我们需要重新编译后台程序,重新发布
1.3 业务层
业务层的内容其实特别多,很多技术其实都是在业务层出现问题后产生的一系列扩展。聊这些内容势必就会带来一些场景问题,这里我们浅浅了解一下,方便后续对Spring设计的理解。
假设现在有一个新增用户的业务,需要更新两个表,sys_user表和sys_user_role表,这是一个很常见的业务,那么现在假设sys_user更新成功,sys_user_role更新失败,会出现什么问题?
实际就是创建用户,界面提示新增失败,但是查询时可以查询到这个用户,这个用户无法登录【因为没有角色权限】,这就是很典型的事务问题,放到金融行业,直接爆炸!!!
所以说像Spring自带的日志模块、事务模块以及消息模块等,都是服务于业务的。
1.4 持久层
说到持久层,不管是古早的JPA还是现在的Mybatis、Mybatis-plus都是基于JDBC,全称为Java DataBase Connectivity(Java数据库连接器)
其实我们所说的JDBC只是规范,并非具体实现,具体实现还是依靠各大数据库厂商提供的驱动
下图就是最原始的JDBC与上下游交互的交互逻辑

引入数据库的驱动jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
获取连接
DriverManager获取连接
Class.forName("com.mysql.cj.jdbc.Driver");//注册驱动
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "123456";
Connection con = DriverManager.getConnection(url, username, password);
获取 Statement
用过获取的连接,得到Statement
Statement stmt = con.createStatement();
执行sql
// 定义 sql 插入语句
String sql = "insert into person(id,name,gender,birthday)values(REPLACE(uuid(),'-',''),'测试人员','1','1997-09-23')";
// 定义 sql 更新语句
String sql = "update person t set t.gender = '2' where t.id='07382329976811f09ffbfa163e3e8fb6'";
// 定义 sql 删除语句
String sql = "delete person t where t.id='07382329976811f09ffbfa163e3e8fb6'";
// 创建 sql 执行对象
stmt = conn.createStatement();
// 执行查询 sql 并返回更新条数
int count = stmt.executeUpdate(sql);
String sql = "select * from person";
ResultSet rs = stmt.executeQuery(sql);
后面为了简化开发,衍生出来很多数据库框架,详细介绍就参考Spring Data JPA、MyBatis、Mybatis-plus









