Web 服務器:APACHE TOMCAT
Tomcat 是一個開源免費的 Web 服務器,它跟 Httpd 一樣有處理靜態(tài) Html 的能力,除此之外它還是 Servlet 和 Jsp 的容器,通俗地說可以搭載 Java 的 Web 應用。
1. Web 容器和 J2ee 容器的區(qū)別
- Web 容器
- 靜態(tài)的 Html
- 動態(tài)的 Jsp 或者 Php 等
- J2ee 容器
- 符合 J2ee 規(guī)范的容器
Tomcat 是一個 Web 容器,同時也是實現(xiàn)了部分 J2ee 規(guī)范的服務器。
1.1 J2ee 規(guī)范
在我們軟件開發(fā)的早期,每個公司都是獨立的開發(fā)自己的軟件系統(tǒng),但是各個系統(tǒng)是有相同的功能的,比如大部分的軟件都是要存儲數(shù)據(jù),后來有了各種數(shù)據(jù)庫,J2ee 給這種數(shù)據(jù)庫連接制定了 Jdbc 規(guī)范,Mysql 和 Oracle 這種數(shù)據(jù)庫提供商都是遵從這個規(guī)范來實現(xiàn)的,如果我們的代碼也是遵從這個標準,那我們的系統(tǒng)假如要從Mysql 換到 Oracle 也是很方便的,不用大量重構代碼。除此之外還有大量公用的功能,比如發(fā)送郵件等,于是有了建立在 Java 平臺的企業(yè)級應用解決方案的規(guī)范。下面是 Java 官網(wǎng)展示的 J2ee 協(xié)議。
Tomcat 版本介紹圖:
從 Tomcat 版本的介紹圖,我們可以了解到,Tomcat 主要實現(xiàn)了如下 J2ee 規(guī)范:
- Servlet
- Jsp
- El
- Websocket
- Jaspic
而且這其中的一些在有些低版本也是沒有的,像常見的 Websocket 協(xié)議,需要 Tomcat7.x 以上的版本才有,如果你需要用到此功能,就要選擇好對的版本。
1.2 Java 代碼如何與 Tomcat 合作?
Tomcat 也可稱作 Servlet 容器,Servlet 是它與 Java 應用的橋梁,Tomcat 重點解決了 Http 的請求連接,使得 Java 應用可以更專注處理業(yè)務邏輯。
Servlet 是一套規(guī)范,所以它主要的工作就是定義一些接口,每一個接口解決不同的邏輯功能。請求到達 Tomcat,Tomcat 的 Servlet 齒輪轉動(調(diào)用)起來,觸發(fā)了 Servlet 的應用代碼。
1.3 Servlet
下面是 Java 的 Servlet 定義的接口,所有的 Servlet 程序都需要繼承這個接口。
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
- 在 Tomcat 啟動的時候,Tomcat 也有自己的 init 初始化方法,這個方法層層調(diào)用,最終也會觸發(fā) Servlet 程序的 init 方法,也就達到了啟動 Tomcat 應用的時候也啟動了我們的 Servlet 程序。
- 請求到達 Tomcat 的時候會根據(jù)路徑選擇,最終觸發(fā)某個 Servlet 的
service
方法。
2. Tomcat 架構介紹
2.1 代碼結構
Tomcat 也是用 Java 編寫的一個應用,正常開發(fā)一個軟件的時候都會根據(jù)功能職責對代碼進行劃分。
- Server:tomcat的一個實例;
- Service: connector和container的邏輯分組;
- Connector:負責接收請求;
- Container:負責處理請求。
2.2 請求流程
- 瀏覽器發(fā)起請求;
- Tomcat 響應請求,然后封裝成統(tǒng)一的對象交給 Engine 處理。圖片顯示的是 Http 協(xié)議的處理,但是 Tomcat 的設計并不只是為了 Http 這個協(xié)議,還可以有其它的如 Ajp 協(xié)議。從 Engine 的角度它對這些處理是透明的(可以不關心的);
- Engine 將請求分配給一臺Host機器去處理;
- 一臺機器上面可能同時部署了多個 Java Web 應用,這時候通過 Context 這個上下文可以定位到具體的哪個 Web 應用;
- 交給應用中具體的某個 Servlet 處理;
- 原路一個個返回,將處理的響應結果傳輸給瀏覽器。
3. 配置
Tomcat 的配置相比 Httpd 和 Nginx 來得簡單些,主要就是指定服務器的端口,上下文信息。
4. 小結
Tomcat 沒有 Httpd 和 Nginx 那樣強大的重定向機制,但是它主要是在 Java 的 Web 領域的,所以跟他們之間沒什么競爭關系可言。在 Java 方面,Tomcat 也只是實現(xiàn)了部分 J2ee 規(guī)范的服務器,市場上面不乏完整 J2ee 規(guī)范的服務器(JBoss、WebSphere 等),Tomcat 能夠流行主要是因為它是開源免費的且各方面也表現(xiàn)不錯,其它類型的服務器大多要收費。而且 Tomcat 從各個版本可以看出它正在不斷地實現(xiàn)更多 J2ee 規(guī)范的過程中。