Java
Java是由Sun Microsystems公司于 1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱Java語(yǔ)言)和Java平臺(tái)的總稱。由James Gosling和同事們共同研發(fā),并在1995年正式推出。用Java實(shí)現(xiàn)的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)、動(dòng)態(tài)的Web、Internet計(jì)算。從此,Java被廣泛接受并推動(dòng)了Web的迅速發(fā)展,常用的瀏覽器均支持Javaapplet。另一方面,Java技術(shù)也不斷更新。
Java 組成
Java由四方面組成:
Java編程語(yǔ)言
Java類文件格式
Java虛擬機(jī)
Java應(yīng)用程序接口(Java API)
下面我們來說一下這四個(gè)方面的關(guān)系,我們通過Java編程語(yǔ)言+Java應(yīng)用程序接口(Java API)編寫出.java的文件(如,test.java),通過Java編譯器javac(Java Complier)進(jìn)行編譯生成.class的類文件(如,test.class),再通過Java類文件+Java虛擬機(jī)(JVM)運(yùn)行Java程序。
Java 程序語(yǔ)言+Java API ---> test.java (java程序)
javac(Java Complier) ---> test.class (字節(jié)碼文件)
Java類文件+Java虛擬機(jī) ---> 運(yùn)行test.class
Java 組成
Java 平臺(tái)
Java平臺(tái)由Java虛擬機(jī)(Java Virtual Machine,簡(jiǎn)稱JVM)和Java 應(yīng)用編程接口(Application Programming Interface,簡(jiǎn)稱API)構(gòu)成。Java應(yīng)用編程接口為此提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行。Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。
Java 平臺(tái)
Java 體系
ava分為三個(gè)體系,
J2SE(Java2 Platform Standard Edition,java平臺(tái)標(biāo)準(zhǔn)版)
J2EE(Java 2 Platform,Enterprise Edition,java平臺(tái)企業(yè)版)
J2ME(Java 2 Platform Micro Edition,java平臺(tái)微型版)。
其中,Java SE則只包含了Java二進(jìn)制程序(如JVM和Java字節(jié)碼編譯器)和Java的核心代碼庫(kù),而Jave EE標(biāo)準(zhǔn)則包含了一組適用于創(chuàng)建企業(yè)級(jí)Web應(yīng)用程序的API。Jave EE建立在Java SE的基礎(chǔ)上,并依賴于Java SE才能正常工作。當(dāng)然,任何級(jí)別的應(yīng)用程序均能從Java EE中獲益,但Jave EE卻更適合解決大型軟件系統(tǒng)設(shè)計(jì)中的問題。JAVA EE包含多個(gè)獨(dú)立的API,Servlet和JSP就是其中的兩個(gè),而JAVA EE中著名的API中還包含如下的幾個(gè),
JAVA EE APIs:
EJB(Enterprise JavaBeans):JAVA相關(guān)的諸多高級(jí)功能的實(shí)現(xiàn),如RMI(Remote Method Invocation), 對(duì)象/關(guān)系映射,跨越多個(gè)數(shù)據(jù)源的分布式事務(wù)等;
JMS(Java Message Service):高性能異步消息服務(wù),實(shí)現(xiàn)JAVA EE應(yīng)用程序與非JAVA程序的“透明”通信;
JMX(Java Management Extensions):在程序運(yùn)行時(shí)對(duì)其進(jìn)行交互式監(jiān)控和管理的機(jī)制;
JTA(Java Transaction API):允許應(yīng)用程序在自身的一個(gè)或多個(gè)組件中平滑地處理錯(cuò)誤的機(jī)制;
JavaMail:通過工業(yè)標(biāo)準(zhǔn)的POP/SMTP/IMAP協(xié)議發(fā)送和接收郵件的機(jī)制;
Java SE APIs:
JNDI(Java Naming and Directory Interface):用于與LDAP服務(wù)交互的API;
JAXP(Java API for XML Processing):用于分析及轉(zhuǎn)換XML(基于XSLT實(shí)現(xiàn));
Java 優(yōu)勢(shì)
與傳統(tǒng)程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術(shù)。全球數(shù)以萬計(jì)的 Java 開發(fā)公司被要求所設(shè)計(jì)的 Java軟件必須相互兼容?!癑ava 語(yǔ)言靠群體的力量而非公司的力量”是Sun公司的口號(hào)之一,并獲得了廣大軟件開發(fā)商的認(rèn)同。這與微軟公司所倡導(dǎo)的注重精英和封閉式的模式完全不同。Sun 公司對(duì) Java 編程語(yǔ)言的解釋是:Java 編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο蟆⒎植际?、解釋性、健壯、安全與系統(tǒng)無關(guān)、可移植、高性能、多線程和動(dòng)態(tài)的語(yǔ)言。Java 平臺(tái)是基于 Java 語(yǔ)言的平臺(tái)。
用Java語(yǔ)言來編寫源代碼,把它編譯成Java Class文件,然后在Java VM中運(yùn)行class文件;當(dāng)編寫程序時(shí),通過調(diào)用類(Java API)中的方法來訪問系統(tǒng)資源,而當(dāng)程序運(yùn)行時(shí),它通過調(diào)用class文件中實(shí)現(xiàn)了Java API的方法也滿足程序的Java API調(diào)用。Java VM和Java API一起組成了一個(gè)“平臺(tái)“,所有Java程序都在其上編譯和運(yùn)行,因此,它們有時(shí)也被稱作Java運(yùn)行時(shí)環(huán)境。Java VM的主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。
Tomcat
Sun推出的JSP(Java Server Pages)是一種運(yùn)行于服務(wù)器端的動(dòng)態(tài)網(wǎng)頁(yè)開發(fā)技術(shù),它基于Java技術(shù)。執(zhí)行JSP時(shí)需要在Web服務(wù)器上架設(shè)一個(gè)編譯JSP網(wǎng)頁(yè)的引擎。Tomcat服務(wù)器是Apache組織開發(fā)的一種JSP引擎同時(shí)支持Servlet,本身具有Web服務(wù)器的功能,可以作為獨(dú)立的Web服務(wù)器來使用。但是,在作為Web服務(wù)器方面,Tomcat處理靜態(tài)HTML頁(yè)面時(shí)不如Apache迅速,也沒有Apache健壯,所以我們一般將Tomcat與Apache配合使用,讓Apache對(duì)網(wǎng)站的靜態(tài)頁(yè)面請(qǐng)求提供服務(wù),而Tomcat作為專用的JSP引擎,提供JSP解析,以得到更好的性能。并且Tomcat本身就是Apache的一個(gè)子項(xiàng)目,所以Tomcat對(duì)Apache提供了強(qiáng)有力的支持。對(duì)于大多數(shù)網(wǎng)站來說,Tomcat是一個(gè)很不錯(cuò)的選擇。
Tomcat 在嚴(yán)格意義上并不是一個(gè)真正的應(yīng)用服務(wù)器,它只是一個(gè)可以支持運(yùn)行Serlvet/JSP的Web容器,不過Tomcat也擴(kuò)展了一些應(yīng)用服務(wù)器的功能,如JNDI,數(shù)據(jù)庫(kù)連接池,用戶事務(wù)處理等等。Tomcat 是一種具有JSP環(huán)境的Servlet容器。Servlet容器是代替用戶管理和調(diào)用 Servlet的運(yùn)行時(shí)外殼。那么什么是Servlet容器呢?
Servlet容器,負(fù)責(zé)處理客戶請(qǐng)求。當(dāng)客戶請(qǐng)求來到時(shí),Servlet容器獲取請(qǐng)求,然后調(diào)用某個(gè)Servlet,并把Servlet的執(zhí)行結(jié)果返回給客戶。當(dāng)客戶請(qǐng)求某個(gè)資源時(shí),Servlet容器使SERVLETREQUEST對(duì)象把客戶的請(qǐng)求信息封裝起來,然后調(diào)用JAVA Servlet API中定義的Servlet的一些生命周期方法,完成Servlet的執(zhí)行,接著把Servlet執(zhí)行的要返回給客戶的結(jié)果封裝到SERVLETRESPONSE對(duì)象中,最后SERVLET容器把客戶的請(qǐng)求發(fā)送給客戶,完成為客戶的一次服務(wù)過程。
Tomcat 體系結(jié)構(gòu)
Tomcat 體系結(jié)構(gòu)
Tomcat 支持Servlet 2.5和JSP 2.1的規(guī)范,它由一組嵌套的層次和組件組成,一般可分為以下四類:
頂級(jí)組件:位于配置層次的頂級(jí),并且彼此間有著嚴(yán)格的對(duì)應(yīng)關(guān)系(如,Server、Service);
連接器:連接客戶端(可以是瀏覽器或Web服務(wù)器)請(qǐng)求至Servlet容器,
容器:包含一組其它組件,如Engine、Host、Content;
被嵌套的組件:位于一個(gè)容器當(dāng)中,但不能包含其它組件(如,Realm(用戶賬戶數(shù)據(jù)庫(kù))、valve(基于用戶的認(rèn)證)、logger(記錄日志));
頂級(jí)組件:
(1).服務(wù)器(server):Tomcat的一個(gè)實(shí)例,通常一個(gè)JVM只能包含一個(gè)Tomcat實(shí)例;因此,一臺(tái)物理服務(wù)器上可以在啟動(dòng)多個(gè)JVM的情況下在每一個(gè)JVM中啟動(dòng)一個(gè)Tomcat實(shí)例,每個(gè)實(shí)例分屬于一個(gè)獨(dú)立的管理端口。這是一個(gè)頂級(jí)組件。
(2).服務(wù)(service):一個(gè)服務(wù)組件通常包含一個(gè)引擎和與此引擎相關(guān)聯(lián)的一個(gè)或多個(gè)連接器。給服務(wù)命名可以方便管理員在日志文件中識(shí)別不同服務(wù)產(chǎn)生的日志。一個(gè)server可以包含多個(gè)service組件,但通常情下只為一個(gè)service指派一個(gè)server。
連接器類組件:
連接器(connectors):負(fù)責(zé)連接客戶端(可以是瀏覽器或Web服務(wù)器)請(qǐng)求至Servlet容器內(nèi)的Web應(yīng)用程序,通常指的是接收客戶發(fā)來請(qǐng)求的位置及服務(wù)器端分配的端口。默認(rèn)端口通常是HTTP協(xié)議的8080,管理員也可以根據(jù)自己的需要改變此端口。一個(gè)引擎可以配置多個(gè)連接器,但這些連接器必須使用不同的端口。默認(rèn)的連接器是基于HTTP/1.1的Coyote。同時(shí),Tomcat也支持AJP、JServ和JK2連接器。
容器類組件:
(1).引擎(Engine):引擎通是指處理請(qǐng)求的Servlet引擎組件,即Catalina Servlet引擎,它檢查每一個(gè)請(qǐng)求的HTTP首部信息以辨別此請(qǐng)求應(yīng)該發(fā)往哪個(gè)host或context,并將請(qǐng)求處理后的結(jié)果返回的相應(yīng)的客戶端。嚴(yán)格意義上來說,容器不必非得通過引擎來實(shí)現(xiàn),它也可以是只是一個(gè)容器。如果Tomcat被配置成為獨(dú)立服務(wù)器,默認(rèn)引擎就是已經(jīng)定義好的引擎。而如果Tomcat被配置為Apache Web服務(wù)器的提供Servlet功能的后端,默認(rèn)引擎將被忽略,因?yàn)閃eb服務(wù)器自身就能確定將用戶請(qǐng)求發(fā)往何處。一個(gè)引擎可以包含多個(gè)host組件。
(2).主機(jī)(Host):主機(jī)組件類似于Apache中的虛擬主機(jī),但在Tomcat中只支持基于FQDN的“虛擬主機(jī)”。一個(gè)引擎至少要包含一個(gè)主機(jī)組件。
上下文(Context)
Context組件是最內(nèi)層次的組件,它表示W(wǎng)eb應(yīng)用程序本身。配置一個(gè)Context最主要的是指定Web應(yīng)用程序的根目錄,以便Servlet容器能夠?qū)⒂脩粽?qǐng)求發(fā)往正確的位置。Context組件也可包含自定義的錯(cuò)誤頁(yè),以實(shí)現(xiàn)在用戶訪問發(fā)生錯(cuò)誤時(shí)提供友好的提示信息。
被嵌套類(nested)組件
這類組件通常包含于容器類組件中以提供具有管理功能的服務(wù),它們不能包含其它組件,但有些卻可以由不同層次的容器各自配置。
閥門(Valve)
用來攔截請(qǐng)求并在將其轉(zhuǎn)至目標(biāo)之前進(jìn)行某種處理操作,類似于Servlet規(guī)范中定義的過濾器。Valve可以定義在任何容器類的組件中。Valve常被用來記錄客戶端請(qǐng)求、客戶端IP地址和服務(wù)器等信息,這種處理技術(shù)通常被稱作請(qǐng)求轉(zhuǎn)儲(chǔ)(request dumping)。請(qǐng)求轉(zhuǎn)儲(chǔ)valve記錄請(qǐng)求客戶端請(qǐng)求數(shù)據(jù)包中的HTTP首部信息和cookie信息文件中,響應(yīng)轉(zhuǎn)儲(chǔ)valve則記錄響應(yīng)數(shù)據(jù)包首部信息和cookie信息至文件中。
日志記錄器(Logger)
用于記錄組件內(nèi)部的狀態(tài)信息,可被用于除Context之外的任何容器中。日志記錄的功能可被繼承,因此,一個(gè)引擎級(jí)別的Logger將會(huì)記錄引擎內(nèi)部所有組件相關(guān)的信息,除非某內(nèi)部組件定義了自己的Logger組件。
領(lǐng)域(Realm)
用于用戶的認(rèn)證和授權(quán);在配置一個(gè)應(yīng)用程序時(shí),管理員可以為每個(gè)資源或資源組定義角色及權(quán)限,而這些訪問控制功能的生效需要通過Realm來實(shí)現(xiàn)。Realm的認(rèn)證可以基于文本文件、數(shù)據(jù)庫(kù)表、LDAP服務(wù)等來實(shí)現(xiàn)。Realm的效用會(huì)遍及整個(gè)引擎或頂級(jí)容器,因此,一個(gè)容器內(nèi)的所有應(yīng)用程序?qū)⒐蚕碛脩糍Y源。同時(shí),Realm可以被其所在組件的子組件繼承,也可以被子組件中定義的Realm所覆蓋。
引擎(Engine)
引擎是指處理請(qǐng)求的Servlet引擎組件,即Catalina Servlet引擎,它從HTTPconnector接收請(qǐng)求并響應(yīng)請(qǐng)求。它檢查每一個(gè)請(qǐng)求的HTTP首部信息以辨別此請(qǐng)求應(yīng)該發(fā)往哪個(gè)host或context,并將請(qǐng)求處理后的結(jié)果返回的相應(yīng)的客戶端。嚴(yán)格意義上來說,容器不必非得通過引擎來實(shí)現(xiàn),它也可以是只是一個(gè)容器。如果Tomcat被配置成為獨(dú)立服務(wù)器,默認(rèn)引擎就是已經(jīng)定義好的引擎。而如果Tomcat被配置為Apache Web服務(wù)器的提供Servlet功能的后端,默認(rèn)引擎將被忽略,因?yàn)閃eb服務(wù)器自身就能確定將用戶請(qǐng)求發(fā)往何處。一個(gè)引擎可以包含多個(gè)host組件。
Tomcat連接器架構(gòu):基于Apache做為Tomcat前端的架構(gòu)來講,Apache通過mod_jk、mod_jk2或mod_proxy模塊與后端的Tomcat進(jìn)行數(shù)據(jù)交換。而對(duì)Tomcat來說,每個(gè)Web容器實(shí)例都有一個(gè)Java語(yǔ)言開發(fā)的連接器模塊組件,在Tomcat中,這個(gè)連接器是org.apache.catalina.Connector類。這個(gè)類的構(gòu)造器可以構(gòu)造兩種類別的連接器:HTTP/1.1負(fù)責(zé)響應(yīng)基于HTTP/HTTPS協(xié)議的請(qǐng)求,AJP/1.3負(fù)責(zé)響應(yīng)基于AJP的請(qǐng)求。但可以簡(jiǎn)單地通過在server.xml配置文件中實(shí)現(xiàn)連接器的創(chuàng)建,但創(chuàng)建時(shí)所使用的類根據(jù)系統(tǒng)是支持APR(Apache Portable Runtime)而有所不同。APR是附加在提供了通用和標(biāo)準(zhǔn)API的操作系統(tǒng)之上一個(gè)通訊層的本地庫(kù)的集合,它能夠?yàn)槭褂昧薃PR的應(yīng)用程序在與Apache通信時(shí)提供較好伸縮能力時(shí)帶去平衡效用。同時(shí),需要說明的是,mod_jk2模塊目前已經(jīng)不再被支持了,mod_jk模塊目前還apache被支持,但其項(xiàng)目活躍度已經(jīng)大大降低。因此,目前更常用 的方式是使用mod_proxy模塊。
如果支持APR:
HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol
AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
如果不支持APR:
HTTP/1.1: org.apache.coyote.http11.Http11Protocol
AJP/1.3: org.apache.jk.server.JkCoyoteHandler
連接器協(xié)議:
Tomcat的Web服務(wù)器連接器支持兩種協(xié)議:AJP和HTTP,它們均定義了以二進(jìn)制格式在Web服務(wù)器和Tomcat之間進(jìn)行數(shù)據(jù)傳輸,并提供相應(yīng)的控制命令。
AJP(Apache JServ Protocol)協(xié)議:目前正在使用的AJP協(xié)議的版本是通過JK和JK2連接器提供支持的AJP13,它基于二進(jìn)制的格式在Web服務(wù)器和Tomcat之間傳輸數(shù)據(jù),而此前的版本AJP10和AJP11則使用文本格式傳輸數(shù)據(jù)。
HTTP協(xié)議:誠(chéng)如其名稱所表示,其是使用HTTP或HTTPS協(xié)議在Web服務(wù)器和Tomcat之間建立通信,此時(shí),Tomcat就是一個(gè)完全功能的HTTP服務(wù)器,它需要監(jiān)聽在某端口上以接收來自于商前服務(wù)器的請(qǐng)求。
Tomcat 工作模式
獨(dú)立的Servlet容器
Tomcat 的默認(rèn)工作模式,作為獨(dú)立的Servlet容器,是內(nèi)置在Web服務(wù)器中的一部分,是指使用基于JAVA的Web服務(wù)器的情形。其他兩種方式是TOMCAT與其他服務(wù)器集成的方式。
進(jìn)程內(nèi)的Servlet容器
Servlet容器作為Web服務(wù)器的插件和JAVA容器的實(shí)現(xiàn)。Web服務(wù)器的插件在內(nèi)部地址空間打開一個(gè)JVM(JAVA VIRTUAL MACHINE)使JAVA容器得以在內(nèi)部運(yùn)行。如有某個(gè)需要調(diào)用Servlet的請(qǐng)求,插件將取得對(duì)此請(qǐng)求的控制并將它傳遞(使用JNI)給JAVA容器。進(jìn)程內(nèi)的容器對(duì)于多線程、單進(jìn)程的服務(wù)器非常適合,并且提供了很好的運(yùn)行速度,只是伸縮性有所不足。
注,JNI是JAVA NATIVE INTERFACE的縮寫,是JAVA本地調(diào)用接口,通過JNI,JAVA程序可以和其他語(yǔ)言編寫的本地程序進(jìn)行通信。
進(jìn)程外的Servlet容器
Servlet容器運(yùn)行于Web服務(wù)器之外的地址空間,并且作為Web服務(wù)器的插件和JVM使用IPC(如TCP/IP)進(jìn)行通信。進(jìn)程外容器的反應(yīng)時(shí)間不如進(jìn)程內(nèi)的容器,但有較好的伸縮性、穩(wěn)定性等性能。
IPC INTERPROCESS COMMUNICATION(進(jìn)程間通信)的簡(jiǎn)寫,它是實(shí)現(xiàn)進(jìn)程間通信的一種技術(shù)。
Tomcat 的組織結(jié)構(gòu)
Tomcat是一個(gè)基于組件的服務(wù)器,它的構(gòu)成組件都是可配置的,其中最外層的給件是CATALINA SERVLET容器,其他的組件按照一定的格式要求配置在這個(gè)頂層容器中。Tomcat的各個(gè)組件是server.xml文件中配置的,Tomcat服務(wù)器默認(rèn)情況下對(duì)各種組件都有默認(rèn)的實(shí)現(xiàn),下面通過分析server.xml文件來理解Tomcat的各個(gè)組件是如何組織的。
Tomcat中真正處理客戶請(qǐng)求與生成響應(yīng)的三個(gè)組件是Engine 、Host、 Context。為了幫助大家更好的理解Tomcat的組織結(jié)構(gòu),請(qǐng)看下圖:
Tomcat
到這里,Tomcat服務(wù)器詳解就結(jié)束了,,不足之處還望大家多多包涵??!覺得收獲的話可以點(diǎn)個(gè)關(guān)注收藏轉(zhuǎn)發(fā)一波喔,謝謝大佬們支持。(吹一波,233~~)
下面和大家交流幾點(diǎn)編程的經(jīng)驗(yàn):
1、多寫多敲代碼,好的代碼與扎實(shí)的基礎(chǔ)知識(shí)一定是實(shí)踐出來的
2丶 測(cè)試、測(cè)試再測(cè)試,如果你不徹底測(cè)試自己的代碼,那恐怕你開發(fā)的就不只是代碼,可能還會(huì)聲名狼藉。
3丶 簡(jiǎn)化算法,代碼如惡魔,在你完成編碼后,應(yīng)回頭并且優(yōu)化它。從長(zhǎng)遠(yuǎn)來看,這里或那里一些的改進(jìn),會(huì)讓后來的支持人員更加輕松。
4、可以去騰訊課堂的圖靈學(xué)院學(xué)習(xí)一下java架構(gòu)實(shí)戰(zhàn)案例,還挺不錯(cuò)的。
最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完。希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起學(xué)習(xí)、一起進(jìn)步。
內(nèi)部交流群469717771 歡迎各位前來交流和分享, 驗(yàn)證:(009)必過!!
聯(lián)系客服