Tomcat與Java

前言:本篇博文主要是來講解一下應用服務器之Tomcat,在講述Tomcat之前要先了解下JAVA.

   一:何爲JAVA

    Java是由Sun Microsystems公司於 1995年5月推出的Java面向對象程序設計語言(以下簡稱Java語言)和Java平臺的總稱。由James Gosling和同事們共同研發,並在1995年正式推出。用Java實現的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺、動態的Web、Internet計算。從此,Java被廣泛接受並推動了Web的迅速發展,常用的瀏覽器均支持Javaapplet。另一方面,Java技術也不斷更新。(2010年Oracle公司收購了SUN)

  二:JAVA 組成

    Java由四方面組成:

    Java編程語言

    Java類文件格式

    Java虛擬機

    Java應用程序接口(Java API)

     我們通過Java編程語言+Java應用程序接口(Java API)編寫出*.java的文件(如,test.java),通過Java編譯器javac(Java Complier)進行編譯生成*.class的類文件(如,test.class),再通過Java類文件+Java虛擬機(JVM)運行Java程序。簡單過程如下

wKiom1Q1KAWw2qedAADM48iWYs4326.jpg

三:JAVA虛擬機

  從上面的的Java流程圖我們可以看出用Java語言編寫的程序經過Java編譯器編譯後才能在JAVA虛擬集中運行.所以說JAVA虛擬機起着運行程序的作用.而Java虛擬機是有那些組件組成的呢?

   Java虛擬機的組成

   JRE(JVM+Java SE API),是用於實現Java程序運行的最小環境。

   JDK (Java+API+JVM),是用於實現Java程序開發的最小環境。 

   Java正是由於引入虛擬機機構使得我們編寫的Java程序可以在多種平臺上運行.

wKiom1Q1KprzYHkrAACzXRvRAzA720.jpg

   我們現在用的安卓手機系統就是跑在Linux平臺上JAVA虛擬裏


四:Java有哪些體系

  上面對Java做了簡單的介紹,那麼我們現在有哪些Java體系?

    Java分爲三個體系

    J2ME(Java 2 Platform Micro Edition,java平臺微型版)

    J2SE(Java2 Platform Standard Edition,java平臺標準版)

    J2EE(Java 2 Platform,Enterprise Edition,java平臺企業版)

  從上面的排序我們可以看出Java企業版可以提供的功能肯定是做多的.那Java企業版提供了那些功能呢?  

    Jave EE標準則包含了一組適用於創建企業級Web應用程序的API。Jave EE建立在Java SE的基礎上,並依賴於Java SE才能正常工作.  這是運行.jsp程序的基礎.


五:servlet和jsp

  Servlet是什麼?

  在Client/Server應用的發展過程中,Java提供了一整套Client/Server解決方案,在這個方案中,程序可以自動地下載到客戶端並執行,這就是applet。但是它僅僅是問題的一半,問題的另一半就是Servlet。Servlet可以被認爲是服務器端的applet。Servlet被Web服務器加載和執行,就如同applet被瀏覽器加載和執行一樣。Servlet從客戶端(通過Web服務器)接收請求,執行某種作業,然後返回結果。使用servlet的基本流程如下:

   客戶端通過HTTP提出請求。

   Web服務器接收該請求並將其發給Servlet。如果這個Servlet尚未被加載,Web服務器將把它加載Java虛擬機並且執行它。

   Servlet將接收該HTTP請求並執行某種處理。

   Servlet將向Web服務器返回應答。

   Web服務器將從Servlet收到的應答發送給客戶端。

wKioL1Q1L0jDIlGLAADAzfS0RnM205.jpg

   Setvlet可以在多種多樣的客戶機上使用。由於Servlet是用Java編寫的,所以你可以很方便地在HTML中使用它們,就像你使用applet一樣。那麼,Servlet是怎樣執行的?怎樣來寫一個Servlet,它的基本架構是怎麼樣的?這些問題,將在後面部分給予介紹。因爲Java運行在服務器端,瀏覽時會很安全.


 JSP和Servlet的關係


 JSP是一種腳本語言,包裝了Java Servlet系統的界面,簡化了Java和Servlet的使用難度,同時通過擴展JSP標籤(TAG)提供了網頁動態執行的能力。儘管如此,JSP仍沒有超出Java和Servlet的範圍,不僅JSP頁面上可以直接寫Java代碼,而且JSP是先被譯成Servlet之後才實際運行的。JSP在服務器上執行,並將執行結果輸出到客戶端瀏覽器,我們可以說基本上與瀏覽器無關。它是與JavaScript不同的,JavaScript是在客戶端的腳本語言,在客戶端執行,與服務器無關。那麼JSP是什麼?就是簡化Servlet,是我們不用懂Java程序就可以寫出基於Java語言的執行腳本..

 

  當Web服務器(或Servlet引擎,應用服務器)支持JSP引擎時,JSP引擎會照着JSP的語法,將JSP文件轉換成Servlet代碼源文件,接着Servlet會被編譯成Java可執行字節碼(bytecode),並以一般的Servlet方式載入執行。簡單來說就是,*.jsp文件 -jasper引擎-> *.java文件 -javac編譯器-> .class (JVM運行)。

   所以說.jsp文件必須依靠jasper引擎,而jasper引擎轉換成Java文件後要想執行必須依靠Java編譯器.而真正提供運行環境的是Java虛擬機.所以說他們幾個之間的關係是相互依靠的.


 六:JSP運行過程


 一個JSP頁面有多個客戶訪問,下面是第一個客戶訪問JSP頁面時候,JSP頁面的執行流程:

  客戶通過瀏覽器向服務器端的JSP頁面發送請求

  JSP引擎檢查JSP文件對應的Servlet源代碼是否存在,若不存在轉向第4步,否則執行下一步

  JSP引擎檢查JSP頁面是否需要修改,若沒修改,轉向第5步,否則執行下一步

  JSP引擎將JSP頁面文件轉譯爲Servlet源代碼(相應的 .java 代碼)

  JSP引擎將Servlet源代碼編譯爲相應字節碼( .class代碼 )

  JSP引擎加載字節碼到內存

  字節碼處理客戶請求,並將結果返回給客戶


wKioL1Q1NfeQ4lMDAAD0_Q5Wl-A154.jpg

七:tomcat

  通過上面的講解我們知道了jsp是什麼.說的簡單點就是編寫的網頁程序文件.好那麼問題來了(學挖掘機哪家強..哈哈)編寫好的這些程序,只有執行才能達到我們編寫程序的目地.那執行這些程序的軟件是什麼.(下面稱爲WEB容器)

 商業版:

    Sun GlassFish Enterprise Server

    Sun Java System Web Server

    JBoss Enterprise Application Platform

    WebLogic Application Server

    Caucho's Resin Server

    WebSphere Application Server

    NetWeaver

  非商業版:

    Apache Tomcat

    Apache Geronimo

    GlassFish

    JBoss Application Server

    Jetty

    Tiny Java Web Server

    Eclipse Virgo

 如果你足夠土豪,商業版不錯.我是緊跟大時代潮流,開源運動的蓬勃發展.Apache Tomcat是不錯的選擇.


 什麼是Tomcat

  Sun推出的JSP(Java Server Pages)是一種運行於服務器端的動態網頁開發技術,它基於Java技術。執行JSP時需要在Web服務器上架設一個編譯JSP網頁的引擎。Tomcat服務器是Apache組織開發的一種JSP引擎同時支持Servlet,本身具有Web服務器的功能,可以作爲獨立的Web服務器來使用。但是,在作爲Web服務器方面,Tomcat處理靜態HTML頁面時不如Apache迅速,也沒有Apache健壯,所以我們一般將Tomcat與Apache配合使用,讓Apache對網站的靜態頁面請求提供服務,而Tomcat作爲專用的JSP引擎,提供JSP解析,以得到更好的性能。並且Tomcat本身就是Apache的一個子項目,所以Tomcat對Apache提供了強有力的支持。對於大多數網站來說,Tomcat是一個很不錯的選擇.

tomcat結構

wKiom1Q1OK_wnERRAAFHgcpbs4Y067.jpg

Tomcat 支持Servlet 2.5和JSP 2.1的規範,它由一組嵌套的層次和組件組成,一般可分爲以下四類:

    頂級組件:位於配置層次的頂級,並且彼此間有着嚴格的對應關係(如,Server、Service);

    連接器:連接客戶端(可以是瀏覽器或Web服務器)請求至Servlet容器,

    容器:包含一組其它組件,如Engine、Host、Content;

    被嵌套的組件:位於一個容器當中,但不能包含其它組件(如,Realm(用戶賬戶數據庫)、valve(基於用戶的認證)、logger(記錄日誌));

頂級組件:

(1).服務器(server):Tomcat的一個實例,通常一個JVM只能包含一個Tomcat實例;因此,一臺物理服務器上可以在啓動多個JVM的情況下在每一個JVM中啓動一個Tomcat實例,每個實例分屬於一個獨立的管理端口。這是一個頂級組件。


(2).服務(service):一個服務組件通常包含一個引擎和與此引擎相關聯的一個或多個連接器。給服務命名可以方便管理員在日誌文件中識別不同服務產生的日誌。一個server可以包含多個service組件,但通常情下只爲一個service指派一個server。


連接器類組件:

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


容器類組件:

(1).引擎(Engine):引擎通是指處理請求的Servlet引擎組件,即Catalina Servlet引擎,它檢查每一個請求的HTTP首部信息以辨別此請求應該發往哪個host或context,並將請求處理後的結果返回的相應的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現,它也可以是隻是一個容器。如果Tomcat被配置成爲獨立服務器,默認引擎就是已經定義好的引擎。而如果Tomcat被配置爲Apache Web服務器的提供Servlet功能的後端,默認引擎將被忽略,因爲Web服務器自身就能確定將用戶請求發往何處。一個引擎可以包含多個host組件。

(2).主機(Host):主機組件類似於Apache中的虛擬主機,但在Tomcat中只支持基於FQDN的“虛擬主機”。一個引擎至少要包含一個主機組件。

(3).上下文(Context):Context組件是最內層次的組件,它表示Web應用程序本身。配置一個Context最主要的是指定Web應用程序的根目錄,以便Servlet容器能夠將用戶請求發往正確的位置。Context組件也可包含自定義的錯誤頁,以實現在用戶訪問發生錯誤時提供友好的提示信息。


  Tomcat連接器架構:基於Apache做爲Tomcat前端的架構來講,Apache通過mod_jk、mod_jk2或mod_proxy模塊與後端的Tomcat進行數據交換。而對Tomcat來說,每個Web容器實例都有一個Java語言開發的連接器模塊組件,在Tomcat中,這個連接器是org.apache.catalina.Connector類。這個類的構造器可以構造兩種類別的連接器:HTTP/1.1負責響應基於HTTP/HTTPS協議的請求,AJP/1.3負責響應基於AJP的請求。但可以簡單地通過在server.xml配置文件中實現連接器的創建,但創建時所使用的類根據系統是支持APR(Apache Portable Runtime)而有所不同。APR是附加在提供了通用和標準API的操作系統之上一個通訊層的本地庫的集合,它能夠爲使用了APR的應用程序在與Apache通信時提供較好伸縮能力時帶去平衡效用。同時,需要說明的是,mod_jk2模塊目前已經不再被支持了,mod_jk模塊目前還apache被支持,但其項目活躍度已經大大降低。因此,目前更常用 的方式是使用mod_proxy模塊。


連接器協議:

Tomcat的Web服務器連接器支持兩種協議:AJP和HTTP,它們均定義了以二進制格式在Web服務器和Tomcat之間進行數據傳輸,並提供相應的控制命令。

AJP(Apache JServ Protocol)協議:目前正在使用的AJP協議的版本是通過JK和JK2連接器提供支持的AJP13,它基於二進制的格式在Web服務器和Tomcat之間傳輸數據,而此前的版本AJP10和AJP11則使用文本格式傳輸數據。

HTTP協議:誠如其名稱所表示,其是使用HTTP或HTTPS協議在Web服務器和Tomcat之間建立通信,此時,Tomcat就是一個完全功能的HTTP服務器,它需要監聽在某端口上以接收來自於商前服務器的請求。


Tomcat 工作模式

(1).獨立的Servlet容器

Tomcat 的默認工作模式,作爲獨立的Servlet容器,是內置在Web服務器中的一部分,是指使用基於JAVA的Web服務器的情形。其他兩種方式是TOMCAT與其他服務器集成的方式。

(2).進程內的Servlet容器

Servlet容器作爲Web服務器的插件和JAVA容器的實現。Web服務器的插件在內部地址空間打開一個JVM(JAVA VIRTUAL MACHINE)使JAVA容器得以在內部運行。如有某個需要調用Servlet的請求,插件將取得對此請求的控制並將它傳遞(使用JNI)給JAVA容器。進程內的容器對於多線程、單進程的服務器非常適合,並且提供了很好的運行速度,只是伸縮性有所不足。

注,JNI是JAVA NATIVE INTERFACE的縮寫,是JAVA本地調用接口,通過JNI,JAVA程序可以和其他語言編寫的本地程序進行通信。


進程外的Servlet容器

Servlet容器運行於Web服務器之外的地址空間,並且作爲Web服務器的插件和JVM使用IPC(如TCP/IP)進行通信。進程外容器的反應時間不如進程內的容器,但有較好的伸縮性、穩定性等性能。

IPC INTERPROCESS COMMUNICATION(進程間通信)的簡寫,它是實現進程間通信的一種技術。


Tomcat 的組織結構

Tomcat是一個基於組件的服務器,它的構成組件都是可配置的,其中最外層的給件是CATALINA SERVLET容器,其他的組件按照一定的格式要求配置在這個頂層容器中。Tomcat的各個組件是server.xml文件中配置的,Tomcat服務器默認情況下對各種組件都有默認的實現,下面通過分析server.xml文件來理解Tomcat的各個組件是如何組織的。

<Server>      頂層元素,代表一個服務器
  <Service>  頂層元素,是Connector的集合,只有一個Engine
      <Connectior/>        連接器類元素,代表通信接口
          <Engine>   容器類元素,爲特定的Service組件處理所有客戶請求,可包含多個Host
              <Host>    爲特定的虛擬主機處理所有客戶請求
                  <Context>     爲特定的WEB應用處理所有客戶請求
                  </Context>
              </Host>
          </Engine>
          
  </Service>
</Server>


ok 我們的tomcat與Java就講到這裏,文中的內容大量參考了網絡上的文檔.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章