Tomcat專題一:tomcat基礎之java

Tomcat基礎之JAVA

 

    各位小夥伴,從這篇文章開始,接連將有七篇文章來對tomcat這個軟件,或者說是WEB容器做一個專題討論。還是一樣的格調,本人不會有意排版,把文章搞的跟專業論文一樣,只是想到哪寫到哪,儘量寫出自己知道的東西。

 

    之所以介紹一下java,是因爲tomcat所面向的語言就是java語言,它是java程序的一個解釋容器。雖然tomcat自身也實現了一個WEB容器,不但可以解釋java程序,也可以解釋html語言,但是在生產環境中,約定俗成的都是用tomcat來構建java應用服務器。根據我的理解,tomcat只是提供了一個java應用的WEB框架,例如:與前端http協議對接的WEB接口,servlet容器,連接器,虛擬機主機等,而提到java應用不得不提的jvm虛擬機,其實這不是tomcat的功能,而是java這個體系所提供的功能。因此,要想全面瞭解tomcat,有必要對java程序設計語言有一個大致的瞭解。

 

程序的演變

    java是一個跨平臺的程序設計語言,這到底體現在什麼地方呢?什麼樣的機制使得其能夠實現跨平臺的應用。

    從程序的演變來看,早期在計算機剛剛誕生的時候,那個時候的編程語言是機器語言,所謂的機器語言也就是一堆的二進制01代碼,由於學習困難,編程難度大,因此後期出現了彙編語言,彙編語言在一定的程度上有所提高,但是因爲其非常接近機器語言,因爲也使很多程序員望而止步。爲了解決這種現狀,後期又出現了高級語言,也就是現在經常使用的編程語言,例如:c,c++,php,java等。

 

    既然產生了這麼多的高級語言,使得程序員越來越得心應手,但是對操作系統架構來說還存在着諸多的問題。這裏就需要我們對操作系統有一個瞭解,這裏我針對的linux系統(對於其它系統也基本一樣)。

    學linux的可能都知道,在linux系統中,有兩種重要的工作空間,一是用戶空間,另一個是內核空間。用戶空間通過shell這個外殼和上層使用者進行交互,內核空間管理着計算機的各種環境,在這裏要特別知道的是內核管理着計算機的所有硬件功能。所有用戶空間的程序都不允許直接跟硬件交互,必須通過內核來跟硬件進行交互,而內核跟硬件交互則是通過一個一個功能單一的system call來實現與硬件打交道,控制硬件的運行。

    對於編程語言來說,最終的執行無非就是調用硬件來完成一些列的工作,因此要想操作硬件,就必須調用內核的system call才能完成與硬件的交互。然後system call功能非常單一,對於複雜的應用程序來說可能會調用一大堆的system call 這往往可能比程序自身還要臃腫,爲了解決這個問題,就產生了API這個概念。API,application program interface 應用程序編程接口,它所實現的功能就是封裝一些列的system call 形成一系列的類庫lib,這一些不同的類庫就被稱爲API。API誕生之後,程序語言不用在調用一個個system call,而在需要完成某些功能的時候,只需要調用一個封裝了多個systemcall的類庫就行,或者說只要調用一下對應功能的API接口就行。

    有了API之後,大大減輕了程序員的工作,但是對於程序來說,不同系統之間的API不同,導致了在不同系統上開發的程序不能在另一種操作系統上進行編譯,爲了磨合這種分別,產生了POSIX:portableoperating system,只要遵循這種規範,就可以將在一種操作系統上開發的程序可以在任何遵循posix的系統上進行編譯,到這裏應用程序算是實現了跨平臺的編譯,但是還不能跨平臺運行。因爲雖然API的不同被磨合了,但是不同系統之間的ABI不同,所謂ABI:application binary interface,應用二進制接口。遵循了posifx接口雖然可以在任何系統上進行編譯運行,但是在一種操作系統上編譯好的程序卻不能夠直接在另一種操作系統上運行。因爲兩種操作系統的二進制接口不同。例如linux基於.so,而windows是基於.dll的。爲了實現跨平臺運行,除非再產生一種機

制磨合ABI的不同。此時java就出現了,java不但磨合了API還磨合了ABI,這主要歸於java的虛擬機jvm。jvm虛擬機機制其實分爲兩塊,一塊是與上層程序語言直接相關jvm虛擬機,一塊則與下層系統直接相關jvm機制,通過jvm的這種兩層機制就磨合了ABI的不同,使得在一種系統上編譯的java程序,可以輕鬆的運行在不同的操作系統上。

    因此就產生了一種說法:java程序一次編譯,到處運行。但是要記住java的運行要基於java的虛擬機。到這裏總算引出了java語言,說了上面這一堆很抽象的東西,其實就是爲了解釋下java語言爲什麼能夠跨平臺運行。

 

JAVA技術要點

    java應用有四個獨立但又相關的組成部分

1.java程序設計語言

2.java API :java應用程序編程接口,有時也可以認爲是封裝了一些列函數的庫

3.java class:java 類文件

4.jvm :java virtual machine ,java虛擬機

關聯流程:

    java程序設計語言結合javaAPI,實現各種功能的java程序,java程序通過java編譯器(其實也就是javac)編譯成一些列的java 類文件,java類文件則放於jvm中運行,實現程序功能,只有編譯成java類文件才能在jvm中運行。

 

java程序通常都是以 .java結尾的文件

java類文件通常都是以 .class 結尾的文件(相當於字節碼)

 

    既然java程序在運行前必須要進行編譯成.class文件才能在jvm中執行,那jvm的實現方式又是什麼呢?(注意:java程序是在jvm中運行的,因此編譯的過程也是在jvm中實現的)

 

jvm實現程序編譯的方式:

1.一次性的解釋器,解釋字節碼並執行(即解釋.class文件),解釋的過程是將字節碼轉換成真正二進制的過程。要注意是每次執行都需要解釋

2.即時編譯器(just-in-time complier),第一次解釋字節碼,解釋之後就會緩存解釋成的二進制碼,因此就會需要更多的內存來緩存解釋後的結果。此時可能會導致佔據大量內存,如果jvm虛擬機內存不夠的話,就會導致內存溢出的狀況

3.自適應編譯器:自動的緩存那些執行屏蔽比較搞的字節碼的二進制碼,而不是全部緩存,這樣就結合了1和2兩種方法取得折中。二八法則,緩存20%左右的代碼,提高80%左右的速度;

 

jvm:有很多種jvm

    sun公司自己的jvm:hotspot jvm

       又分爲兩種;

           JRE: java 運行環境

           JDK:java開發環境

              JDK包含了jre,但不止jre一個功能,還包括很多的開發功能等

             

    開源界的jvm:openjdk

       開發+運行的開源實現

 

JRE:java runtime environment ,其實一個最簡單的jvm虛擬機的實現就是JRE,要運行java程序就必須要安裝JRE。但是JRE不緊緊實現了jvm的功能,還提供了一些功能性的API

JDK:JDK的功能比較多,基本上包含了JAVA程序源碼,API,jvm等功能

 

JAVA根據其應用領域的不同,JAVA技術可分爲三類:

    JAVA SE :JAVA 標準版類庫,適合中小型企業

    JAVA EE :JAVA 企業版  大型企業

    JAVA ME:mobileedtion,java移動版,用於開發手機程序(用的比較少)

 

 

此外,jvm虛擬機還實現了很多中垃圾回收機制,這些東東就不在聊了,不是程序員,說不清楚啊。

 

JAVA實現的動態網站

客戶端動態網站:

    applet:小程序

       將java開發的applet小程序嵌入到html網頁中,客戶端訪問html頁面的時候,將applet小程序一起下載到本地,然後在本地的jre環境中進行運行,此時必須保證客戶端安裝了jre運行環境

   

服務器動態網站:

    CGI:commongateway interface

    在服務器端生成靜態頁面,直接返回給客戶端,而不用在客戶端使用jre運行動態內容

   

    Servlet:JAVA 實現的CGI,增加了對http協議的處理能力,能夠識別html文檔無論上面的那種實現方式,靜態頁面都是歸java源程序所管理,一旦發生改變,就必須重新先編譯成字節碼才能在jvm虛擬機中運行

 

    JSP:java ServerPage

       是基於Servlet上的一種特殊類,可以實現在html文檔中嵌入java程序,這樣html文檔就不需要java源程序來處理了。jsp實現了將java程序以標籤的形式嵌入到html頁面中。

    JSP程序執行時,使用jasper將jsp頁面必須先轉換成servlet,然後在java編譯器編譯成字節碼在jvm虛擬機中運行

    JSP的性能和穩定程度要比php程序好的多的多,因此在大型應用程序和業務的場合,基本都使用jsp程序。

 

    到這裏爲止,基本上可能大家有一種疑惑,上面說了這麼多語言之類的,那tomcat到底是處理那種語言編寫的頁面。這裏還是要簡單的介紹一下相互之間的關係。java語言是一種程序設計語言,早期的java語言是一種靜態語言,爲了實現動態網站,後期應用而生了applet,servlet技術,applet是一種在客戶端執行的技術,而sevlet則是在服務器端執行的技術,但不管是applet還是servlet技術,其都是java語言中的一個類庫,都是用java語言實現的。而JSP語言是基於servlet技術之上的一個特殊類庫,其能夠實現java語言嵌套在html頁面中,當用戶請求時,請求到jsp的頁面時候,會將嵌套的java語言編譯成servlet,然後在編譯成字節碼,在jvm虛擬機中運行,然後返回結果和html頁面一起返回給客戶端,使用JSP這種技術,html這種靜態頁面就無需再和java程序一起編譯。而現如今,java實現的動態網站都是JSP這種技術,可以說JSP不是一種真正的編程語言,而是一種框架,整合了java語言和html頁面。因此,雖然你可能經常看到的是.jsp結尾的頁面,但裏面嵌套的動態頁面還是java語言,所以說tomcat處理java程序也是對的。其次大家要注意的是,這裏討論jsp和java是從編程的角度理解,而不是一上來就是什麼執行過程,jvm虛擬機之類的。舉個例子對比一下,如果現在讓你寫個jsp的頁面,寫個java程序,你可能不是想什麼jvm運行,而是腦子裏面第一閃過的就是jsp和java編程的知識,什麼樣的編程格式,直接點說寫jsp和java源程序頁面是一樣的嗎? 我想使用java開發的人才能說清楚這裏面的關係,大家有不清楚的可以和開發溝通,而當你問jsp和java的區別時,開發絕對不會跟你說什麼jvm運行之類的。此時你就明白了我到底是要表明一種什麼意思。

 

 

好,關於tomcat之java技術只是就說到這裏,純屬個人理解。有不對之處,可以交流。

 


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