搞懂 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),用于編寫持久層接口,用于將實體對象轉換為業務對象。
圖片
交互邏輯:
表現層交由用戶進行控制,用戶操作表現層,將請求發送至控制層
控制層調用業務層,處理用戶請求
業務層根據業務的實際需求,調用持久層將用戶操作存儲在數據庫,或從數據庫取出數據
持久層返回操作結果給業務層
業務層返回持久層結果給控制層
控制層進行一定的數據封裝、渲染,返回給表現層
1.2 表現層
表現層主要需要解決的問題是展示層和控制層的如何通信。
- 展示層不管是采用JSP還是VUE,都需要將用戶的請求發送到控制層。
- 控制層不管是用Java,還是Python,也都需要將響應結果反饋給展示層。
1.2.1 Web服務器
Web服務器:Web服務器提供了各式各樣的功能,側重點也不也一樣,Java中常用的三種Web服務器就是Tomcat、Undertow、Jetty
1)Tomcat
Tomcat 是 Apache 軟件基金會開發的開源 Web 服務器,也是 Java Web 應用中最廣泛使用的 Servlet 容器之一。它支持 Java Servlet 和 JavaServer Pages (JSP) 技術,適用于傳統 Java Web 應用的開發和部署。Tomcat 以其穩定性和社區支持而聞名,適合中小規模企業級應用 。
Tomcat 的主要特點包括:
- 穩定性高:經過長期發展和廣泛使用,Tomcat 在穩定性和可靠性方面表現優異。
- 支持標準 Java Web 技術棧:支持 Servlet、JSP、JSTL 等標準技術。
- 社區支持廣泛:擁有龐大的用戶社區和豐富的文檔資源。
2)Jetty
Jetty 是一個輕量級、高性能的 Java Web 容器,由 Eclipse 基金會維護。它支持 Servlet 3.1 和 WebSocket,適用于高性能和分布式系統。Jetty 以其輕量級和快速啟動的特點而受到青睞,適合嵌入式應用和微服務架構 。
Jetty 的主要特點包括:
- 輕量級:啟動快、內存占用低,適合嵌入式應用和微服務。
- 高性能:支持異步非阻塞 I/O,適合高并發場景。
- 靈活性:支持按需加載組件,便于擴展和定制。
3)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是用于數據傳輸的,請求/響應攜帶的數據。
Tomcat版本 | Servlet/JSP版本 | JavaEE版本 | 運行環境 |
4.1 | 2.3/1.2 | 1.3 | JDK1.3 |
5.0 | 2.4/2.0 | 1.4 | JDK1.4 |
5.5/6.0 | 2.5/2.1 | 5.0 | JDK5.0 |
7.0 | 3.0/2.2 | 6.0 | JDK6.0 |
8.0 | 3.1/2.3 | 7.0 | JDK7.0 |
Servlet在2.5版本及之前都是采用的xml配置的方式,在3.0之后就是注解的方式實現了 Servlet在4.x中提供了異步請求、注解、增強的Servlet API、非阻塞IO。
1.2.3 靜態web和動態web
1.2.3.1 靜態web
html\htm網頁,通過直接獲取的方式,進行頁面展示,所有的用戶看到的都是同一個頁面 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與上下游交互的交互邏輯。
JDBC架構.svg
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。

























