Tomcat組件初解

說明:個人認爲理解背景知識以及Java技術基礎知識是掌握Tomcat工作機制的前提
一、背景知識
1、動態網頁的概念
程序是否在服務器端運行,是區分動態網頁與靜態網頁的重要標誌,靜態網頁隨着html代碼生成後頁面的內容和顯示效果基本上不會發生變化了;而動態網頁則不然,頁面代碼雖然沒有變,但是顯示的內容可以隨着時間、環境或者數據庫操作的結果而發生改變。動態網頁是基本的html語法規範與Java、PHP、等高級程序設計語言、數據庫編程等多種技術的融合, 以實現對網站內容和風格的高效、動態和交互式的管理。注意不要混淆動態網頁和網頁視覺上的動態效果這兩個概念。

2、HTTP與MIME
最早的HTTP協議中,並沒有附加的數據類型信息,所有傳送的數據都被客戶程序解釋爲html文檔,因此web服務器最初只能服務靜態資源,即只能解析html文檔。後來HTTP協議引入MIME框架(Multipurpose Internet Mail Extensions規定了用於表示各種各樣的數據類型的符號化方法),通過在文檔之前附加MIME類型信息來支持多媒體數據類型;此時web服務器就可以解析靜態超媒體文本文檔,瀏覽器接收服務器返回的消息後就會知道哪些是MP3文件,哪些是Shockwave文件等等,當某種擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。可以理解爲服務器將MIME標誌符放入傳送的數據中來告訴瀏覽器使用哪種插件讀取相關文件。

3、Applet
1995年Java發佈的時候互聯網方興未艾,不久,人們對動態網站的技術需求越來越迫切,在這種發展背景下,Sun公司在Java的類庫中引入了applet類,用applet類開發的小程序能夠直接嵌入到html文件中,使用< applet > 和< /applet >來標記html文件中的Applet小程序代碼。在這種情況下,當Client端支持JRE插件的瀏覽器讀取到這對標記時,就會下載相應的小應用程序代碼並在本地計算機上執行該Applet,而後將執行結果通過網頁顯示給用戶。這大大提高Web頁面的交互能力和動態執行能力,但是這種Client端動態網頁技術存在明顯的一個弊端——爲了達到這種動態效果Client端必須要開放一些權限給遠程用戶執行相關程序,如果有惡意的應用程序在Client端執行就可能會危及用戶的系統,儘管Sun公司致力於讓Java程序只能運行在JVM中,這樣儘可能的縮小的惡意程序的破壞範圍(類似chroot機制),但程序的設計避免不了漏洞,總會有安全隱患;applet每一次的改動都需要重新打包簽名,手續非常繁瑣,所以在具體的實現中要將一些會變化參數放到html文件中來,傳到applet中去執行;此外未必每一個用戶都會配置需要的JRE環境,在當時網絡帶寬尚且不大的情況下,applet需要下載到本地執行,因此發展效果不是很理想。

4、CGI
隨後CGI技術誕生,CGI規範允許Web服務器執行外部程序,並將它們的輸出發送給瀏覽器,CGI將Web一組簡單的靜態超媒體文檔轉換爲一個完整的新的交互式媒體。簡單來說當Web服務器發現用戶請求的是動態程序類的資源,會調用相應的CGI進程來執行,CGI執行完畢後把執行結果輸出標準到html語句返回給web服務器,web服務器再返回給Client端。

5、Serverlet
Sun爲了使Java能夠支持基於CGI的方式來開發動態網站,開發出API的另一種特殊規範Serverlet(Server Applet),它是Java編寫的服務器端程序,主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類。綜上所述,可以將Serverlet理解爲是一種CGI技術,能夠讓Java開發動態頁面並通過CGI方式與前端Web進行通信;在通信量大的服務器上,Java Servlet的優點在於其執行速度更快於 CGI 程序,各個用戶請求被激活成單個程序中的一個線程,而無需創建單獨的進程,因此服務器端處理請求的系統開銷明顯降低。但是它輸出html語句還是採用了老的CGI方式,對所有的代碼採用硬編碼的方式一句一句輸出,對於純html文檔的編譯也要由Java程序來輸出,這是非常麻煩的,任何靜態內容的修改也會導致JVM重新編譯Java頁面程序,Java程序員還需要理解html前端展示頁面的定義,所以編寫和修改html非常不方便。

6、JSP
由此Sun公司倡導建立的一種動態網頁技術標準,同時吸引了其他一些公司一起參與進來。JSP(Java Server Pages)就此誕生,其根本是一個簡化的Servlet設計,在傳統的網頁HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成後綴名爲(.jsp)的JSP文件,用來封裝生成動態網頁的處理邏輯,實現了網頁展示邏輯與Servlet的分離,這樣大大簡化和方便了網頁的設計和修改。JSP與Servlet一樣,任何程序操作都在服務器端執行,客戶端瀏覽的服務器端處理的結果。Java Servlet是JSP的技術基礎,大型Web應用程序的開發需要Java Servlet和JSP配合才能完成。JSP具備了Java技術的簡單易用,完全的面向對象,具有平臺無關性且安全可靠。

7、MVC架構
前面提到的CGI編制方式比較困難而且效率低下,因爲每一次修改程序都必須重新將CGI程序編譯成可執行文件,MVC因此而生。MVC模型可以理解爲是一種將數據、邏輯處理、展示界面分離的一種方法。使用MVC的一個最明顯好處就是它將視圖展示和應用邏輯清晰的分離。這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應用的業務流程或者業務規則的改變只需要改動MVC的模型層即可。

  • Model:應用程序中用於處理應用程序數據邏輯的部分,通常模型對象負責在數據庫中存取數據。
  • View:提供了展示模型數據的不同方式,它可以是數據填充的模板;視圖可以有多個,而控制器則決定使用哪個視圖。
  • Controller:主要功能就是調用並協調需要的資源/對象來執行用戶請求。通常控制器會爲任務調用合適的模型,選擇合適的視圖。

Controller,Model和View各自獨立,一個流行的開源實現是Apache Structs框架;目今,設計優良的Web應用程序通常用相關的技術實現相應的功能,比如:
M = JavaBeans:用於傳遞數據,擁有與數據相關的邏輯處理
http://www.zhihu.com/question/19773379
V = JSP,實現內容展示;從Model接收數據並生成HTML,進而降低了HTML維護的複雜度;
C = Servlet,實現應用邏輯;接收HTTP請求並控制Model和View

二、Java SE和Java包含的API
Java SE包含了Java二進制程序(如JVM和Java字節碼編譯器)和Java的核心代碼庫,而Jave EE標準則包含了一組適用於創建企業級Web應用程序的API。Jave EE建立在Java SE的基礎上,並依賴於Java SE才能正常工作。當然,任何級別的應用程序均能從Java EE中獲益,但Jave EE卻更適合解決大型軟件系統設計中的問題。
JAVA EE包含多個獨立的API,Servlet和JSP就是其中的兩個,而JAVA EE中著名的API中還包含如下的幾個:
JAVA EE APIs

  • JMS(Java Message Service):高性能異步消息服務,實現JAVA EE應用程序與非JAVA程序的“透明”通信;
  • JMX(Java Management Extensions):在程序運行時對其進行交互式監控和管理的機制;
  • JTA(Java Transaction API):允許應用程序在自身的一個或多個組件中平滑地處理錯誤的機制;
  • JM(JavaMail):通過工業標準的POP/SMTP/IMAP協議發送和接收郵件的機制;
  • EJB(Enterprise JavaBeans):JAVA相關的諸多高級功能的實現,如RMI(Remote Method Invocation), 對象/關係映射,跨越多個數據源的分佈式事務等;

Java SE APIs

  • JNDI(Java Naming and Directory Interface):用於與LDAP服務交互的API;
  • JAXP(Java API for XML Processing):用於分析及轉換XML(基於XSLT實現);

Java應用服務器主要爲應用程序提供運行環境,爲組件提供服務。Java 的應用服務器很多,從功能上分爲兩類:JSP(支持最新的Servlet 和JSP 規範)和 Java EE (符合J2EE標準的服務器)。
JAVA EE Application Servers:

  • IBM:Websphere 商業
  • BEA(後被Oracle收購):Weblogic 商業
  • Oracle:oc4j 商業
  • Sun:GlassFish 開源
  • Apache:Geronimo 開源
  • RedHat:JBoss 開源,在Tomcat上進行了二次封裝和開發,引入了很多新的功能,尤其是企業級的API

JSP Application Servers :

  • Jetty 開源
  • Apache:Tomcat 開源
  • CAUCHO:Resin 商業

三、Tomcat起源
Sun公司創建了第一個Servlet容器的參考實現,即Java Web Server(僅具備Java EE API中的JSP和Serverlet), 但JWS只是爲了演示Servlet的相應功能,所以其很不穩定。與此同時,ASF(Apache Software Foundation)創建了JServ項目,一個能夠與apache整合起來的servlet容器。1999年,Sun把JWS捐給了ASF,於是兩個項目合二爲一,即Tomcat的前身。第一個tomcat版本是Tomcat 3.x系列,而發佈於2001年Tomcat4.0則是在此前基礎上進行了重新設計和實現,其代碼項目被命名爲Catalina。目前最新的版本則是8.x系列。

儘管Tomcat並沒有完整實現Jave EE API,但Tomcat作爲第一款成功的web容器,具有廣大的用戶羣體,提供Http Server和Servlet容器功能。很企業也漸漸棄用傳統的Java EE技術(如EJB)轉而採用一些開源組件來構建複雜的應用。對於這些開源組件如Structs、Spring和Hibernate,Tomcat都能夠對其實現完美的支持。

Tomcat主要是作爲JSP/Servlet最新規範的參考實現而設計,最常見的使用方式是將其作爲一個服務器軟件安裝到操作系統上,然後在裏面部署web應用,比較適合在中小型系統和併發訪問用戶不是很多的場景下使用;但如果嵌入到其他JEE服務器中以提供Web容器功能或者作爲組件嵌入到其他應用中,操作起來比較麻煩。

四、Tomcat的架構
最新版的Tomcat8主要新增了Servlet 3.1, JSP 2.3, EL 3.0 and Web Socket 1.0支持。版本詳情說明:http://tomcat.apache.org/whichversion.html
Tomcat由一組嵌套的層次和組件組成,一般可分爲以下四類:

  • 頂級組件:位於配置層次的頂級,並且彼此間有着嚴格的對應關係;
  • 連接器:連接客戶端(可以是瀏覽器或Web服務器)請求至Servlet容器,
  • 容器:包含一組其它組件;
  • 被嵌套的組件:位於一個容器當中,但不能包含其它組件;

說明:在第一次調用之後,JSP會被編譯成一個servlet類,在後續的操作中則可以直接使用此類,從而避免了對每一次調用的都要重新分析和編譯。因此,類似servlet,JSP的執行需要在container中完成。JSP的container跟servlet的container基本相同,但在JSP執行之前,需要一些額外的步驟如與servlet代碼建立會話等。Tomcat包含了一個叫做Catalina的Servlet container(執行servlet和編譯過的JSP)和一個JSP編譯器(Jasper編譯器)。事實上,一個包含了JSP編譯器和Servlet容器的應用程序組合通常被稱作Web容器。
各常見組件:
這裏寫圖片描述
server: Tomcat的一個實例,通常一個JVM只能包含一個Tomcat實例;因此,一臺物理服務器上可以在啓動多個JVM的情況下在每一個JVM中啓動一個Tomcat實例,每個實例分屬於一個獨立的管理端口。這是一個頂級組件。
service:一組Connector和一個Engine的集合,這組Connector共用一個Engine來處理所有收到的請求,給服務命名可以方便管理員在日誌文件中識別不同服務產生的日誌。一個server可以包含多個service組件,但通常情下只爲一個service指派一個server。

連接器類組件
connector:連接器負責連接客戶端(可以是瀏覽器或Web服務器)請求至Servlet容器內的Web應用程序,通常指的是接收客戶發來請求的位置及服務器端分配的端口。默認端口通常是HTTP協議的8080,管理員也可以根據自己的需要改變此端口。一個引擎可以配置多個連接器,但這些連接器必須使用不同的端口。默認的連接器是基於HTTP/1.1的Coyote。同時,Tomcat也支持AJP、JServ和JK2連接器。

容器類組件
Engine:通常是指處理請求的Servlet引擎組件,即Catalina Servlet引擎,它檢查每一個請求的HTTP首部信息以辨別此請求應該發往哪個host或context,並將請求處理後的結果返回的相應的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現,它也可以是隻是一個容器。如果Tomcat被配置成爲獨立服務器,默認引擎就是已經定義好的引擎。而如果Tomcat被配置爲Apache Web服務器的提供Servlet功能的後端,默認引擎將被忽略,因爲Web服務器自身就能確定將用戶請求發往何處。一個引擎可以包含多個host組件。
Host:主機組件類似於Apache中的虛擬主機,但在Tomcat中只支持基於FQDN的“虛擬主機”。一個引擎至少要包含一個主機組件。
Context:上下文是最內層次的組件,它表示Web應用程序本身。配置一個Context最主要的是指定Web應用程序的根目錄,以便Servlet容器能夠將用戶請求發往正確的位置。Context組件也可包含自定義的錯誤頁,以實現在用戶訪問發生錯誤時提供友好的提示信息。

被嵌套類(nested)組件
這類組件通常包含於容器類組件中以提供具有管理功能的服務,它們不能包含其它組件,但有些卻可以由不同層次的容器各自配置。
Valve:閥門用來攔截請求並在將其轉至目標之前進行某種處理操作,類似於Servlet規範中定義的過濾器。Valve可以定義在任何容器類的組件中。Valve常被用來記錄客戶端請求、客戶端IP地址和服務器等信息,這種處理技術通常被稱作請求轉儲(request dumping)。請求轉儲valve記錄請求客戶端請求數據包中的HTTP首部信息和cookie信息文件中,響應轉儲valve則記錄響應數據包首部信息和cookie信息至文件中。
Logger:日誌記錄器用於記錄組件內部的狀態信息,可被用於除Context之外的任何容器中。日誌記錄的功能可被繼承,因此,一個引擎級別的Logger將會記錄引擎內部所有組件相關的信息,除非某內部組件定義了自己的Logger組件。
Realm:領域用於用戶的認證和授權;在配置一個應用程序時,管理員可以爲每個資源或資源組定義角色及權限,而這些訪問控制功能的生效需要通過Realm來實現。Realm的認證可以基於文本文件、數據庫表、LDAP服務等來實現。Realm的效用會遍及整個引擎或頂級容器,因此,一個容器內的所有應用程序將共享用戶資源。同時,Realm可以被其所在組件的子組件繼承,也可以被子組件中定義的Realm所覆蓋。

五、Tomcat初解
http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.28/bin/apache-tomcat-8.0.28.tar.gz
1、下載Tomcat二進制包解壓安裝後打開目錄可以看到如下內容(前提:jdk環境已經部署好)
這裏寫圖片描述

  • bin:存放服務器腳本;
  • conf:存放配置文件;
  • logs :存放日誌文件;
  • lib:存放需要的JAR文件;
  • work:存放jsp 文件編繹生成的class文件;
  • webapps:存放需要發佈的Web應用程序及其部署文件;/webapps是Tomcat服務器用來存放Web應用的目錄,每個Web應用都將在這建立各自的子目錄,

對於一個Web應用程序而言,其通常由Servlets、JSP和其它文件等共同組成。這些文件通常被打包成WAR(Web Application Archive)格式,並以.war作爲打包後的文件擴展名。而Servlet規範則定義了在WAR內部組織這些文件的標準目錄結構。其目錄和功用如下:
這裏寫圖片描述

  • /Webapps:應用程序的根目錄,所有可被公開訪問的文件均放置於此處,如HTML、JSP和圖片文件等;
  • /WEB-INF:此目錄爲私有資源目錄,其內部的所有文件和子目錄均不能被公開訪問;包含着此Web應用程序的配置文件web.xml(程序結構描述符文件)通常放置於此目錄;
  • /WEB-INF/classes:當前Web應用程序的類文件的存在目錄;
  • /WEB-INF/lib:可被打包爲JAR格式的類文件通常放置於此目錄;

2、Tomcat的配置文件:
這裏寫圖片描述
catalina.policy: Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力;
catalina.properties: Tomcat內部package的定義及訪問相關的控制,也包括對通過類裝載器裝載的內容的控制;Tomcat6在啓動時會事先讀取此文件的相關設置;
context.xml:所有host的默認配置信息;
logging.properties: Tomcat通過自己內部實現的JAVA日誌記錄器來記錄操作相關的日誌,此文件即爲日誌記錄器相關的配置信息,可以用來定義日誌記錄的組件級別以及日誌文件的存在位置等;
tomcat-user.xml: Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認情況下會用到此文件;在Tomcat中添加/刪除用戶,爲用戶指定角色等將通過編輯此文件實現;
web.xml:遵循Servlet規範標準的配置文件,用於配置servlet,併爲所有的Web應用程序提供包括MIME映射等默認配置信息;
注意:在Tomcat目錄下/webapps/ROOT/WEB-INF中也有一個web.xml,當部署一個Web應用時,總是先加載/conf/web.xml,然後再加載/webapps/ROOT/WEB-INF/web.xml文件;但處理過程中,總是先使用/webapps/ROOT/WEB-INF/web.xml配置文件,如果無法處理,才把它交給Tomcat的web.xml文件。
這裏寫圖片描述
server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息;主要提供Tomcat組件的初始配置,說明Tomcat的結構,含義,使Tomcat通過實例化組件完成啓動及構建自身。

<Server>
    <Service>
        <Connector />
        <Engine>
            <Host>
                <Context> </Context>
            </Host>
        </Engine>
    </Service>
</Server>

3、啓動Tomcat,在瀏覽器中輸入:http://localhost:8080/會打開Tomcat的默認頁面。實際上,剛裝好的Tomcat服務器虛擬主機的默認目錄是/webapps/ROOT,默認頁面就是Tomcat安裝目錄下的webapps/ROOT/index.jsp;
這裏寫圖片描述
這裏寫圖片描述
4、編寫一個簡單shell本用來啓動服務
這裏寫圖片描述
這裏寫圖片描述

發佈了88 篇原創文章 · 獲贊 17 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章