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