















一圖勝千言,下面圖解均來自Program Creek 網(wǎng)站的Java教程,目前它們擁有最多的票選。如果圖解沒有闡明問題,那么你可以借助它的標(biāo)題來一窺究竟。
1、字符串不變性
下面這張圖展示了這段代碼做了什么
String s = "abcd"``;
s = s.concat(``"ef"``);
image

2、equals()方法、hashCode()方法的區(qū)別
HashCode被設(shè)計(jì)用來提高性能。equals()方法與hashCode()方法的區(qū)別在于:
- 如果兩個(gè)對(duì)象相等(equal),那么他們一定有相同的哈希值。
- 如果兩個(gè)對(duì)象的哈希值相同,但他們未必相等(equal)。
3、Java異常類的層次結(jié)構(gòu)
圖中紅色部分為受檢查異常。它們必須被捕獲,或者在函數(shù)中聲明為拋出該異常。
4、集合類的層次結(jié)構(gòu)
注意Collections和Collection的區(qū)別。(Collections包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法)
5、Java同步
Java同步機(jī)制可通過類比建筑物來闡明。
6、別名
別名意味著有多個(gè)變量指向同一可被更新的內(nèi)存塊,這些別名分別是不同的對(duì)象類型。
7、堆和棧
圖解表明了方法和對(duì)象在運(yùn)行時(shí)內(nèi)存中的位置。
8、Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域
圖解展示了整個(gè)虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域的情況。



Tomcat和JVM:
一個(gè)Tomcat只會(huì)啟動(dòng)一個(gè)JVM,所有webapps公用一個(gè)JVM進(jìn)程,所以System.exit()會(huì)導(dǎo)致影響同個(gè)Tomcat中的其他應(yīng)用。Tomcat通過調(diào)用配置的JDK或JRE來啟動(dòng)JVM。
體系結(jié)構(gòu):
Server:A Server element represents the entire Catalina servlet container. (Singleton)
Service:它由一個(gè)或者多個(gè)Connector組成,以及一個(gè)Engine,負(fù)責(zé)處理所有Connector所獲得的客戶請(qǐng)求。
Connector:
- TOMCAT有兩個(gè)典型的Connector,一個(gè)直接偵聽來自browser的http請(qǐng)求,一個(gè)偵聽來自其它WebServer的請(qǐng)求
- Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請(qǐng)求
- Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請(qǐng)求
Engine:
- Engine下可以配置多個(gè)虛擬主機(jī)Virtual Host,每個(gè)虛擬主機(jī)都有一個(gè)域名
- 當(dāng)Engine獲得一個(gè)請(qǐng)求時(shí),它把該請(qǐng)求匹配到某個(gè)Host上,然后把該請(qǐng)求交給該Host來處理
- Engine有一個(gè)默認(rèn)虛擬主機(jī),當(dāng)請(qǐng)求無法匹配到任何一個(gè)Host上的時(shí)候,將交給該默認(rèn)Host來處理
Host:
- 代表一個(gè)Virtual Host,虛擬主機(jī),每個(gè)虛擬主機(jī)和某個(gè)網(wǎng)絡(luò)域名Domain Name相匹配
- 每個(gè)虛擬主機(jī)下都可以部署(deploy)一個(gè)或者多個(gè)Web App,每個(gè)Web App對(duì)應(yīng)于一個(gè)Context,有一個(gè)Context path
- 當(dāng)Host獲得一個(gè)請(qǐng)求時(shí),將把該請(qǐng)求匹配到某個(gè)Context上,然后把該請(qǐng)求交給該Context來處理
- 匹配的方法是“最長匹配”,所以一個(gè)path==”"的Context將成為該Host的默認(rèn)Context
- 所有無法和其它Context的路徑名匹配的請(qǐng)求都將最終和該默認(rèn)Context匹配
Context:
- 一個(gè)Context對(duì)應(yīng)于一個(gè)Web Application,一個(gè)Web Application由一個(gè)或者多個(gè)Servlet組成
- Context在創(chuàng)建的時(shí)候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
- 當(dāng)Context獲得請(qǐng)求時(shí),將在自己的映射表(mapping table)中尋找相匹配的Servlet類
- 如果找到,則執(zhí)行該類,獲得請(qǐng)求的回應(yīng),并返回
另外一個(gè)架構(gòu)圖:
Tomcat Server處理一個(gè)http請(qǐng)求的過程
假設(shè)來自客戶的請(qǐng)求為:
http://localhost:8080/wsota/wsota_index.jsp
- 請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請(qǐng)求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
- Engine獲得請(qǐng)求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機(jī)Host
- Engine匹配到名為localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))
- localhost Host獲得請(qǐng)求/wsota/wsota_index.jsp,匹配它所擁有的所有Context
- Host匹配到路徑為/wsota的Context(如果匹配不到就把該請(qǐng)求交給路徑名為”"的Context去處理)
- path=”/wsota”的Context獲得請(qǐng)求/wsota_index.jsp,在它的mapping table中尋找對(duì)應(yīng)的servlet
- Context匹配到URL PATTERN為*.jsp的servlet,對(duì)應(yīng)于JspServlet類
- 構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
10)Context把執(zhí)行完了之后的HttpServletResponse對(duì)象返回給Host
11)Host把HttpServletResponse對(duì)象返回給Engine
12)Engine把HttpServletResponse對(duì)象返回給Connector
13)Connector把HttpServletResponse對(duì)象返回給客戶browser
安裝和配置:
- 下載:tomcat.apache.org(分Unix 和 windows版)
- 解壓到Windows或Unix目錄下
- 配置端口:server.xml
- 配置Tomcat登錄用戶名密碼:tomcat-user.xml,
<tomcat-users> <user name="admin" password="admin" roles="admin-gui,manager-gui" /> </tomcat-users> - 配置好JDK,配置JAVA_HOME環(huán)境變量
- 修改端口:<Connector port="80" protocol="HTTP/1.1" ……/>
-
啟動(dòng):
- Windows: startup.bat (可以在文件末尾加入pause指令,方便查看啟動(dòng)結(jié)果)
- Unix: ./startup.sh(觀察log:tail -f catalina.log)
-
關(guān)閉:
- Windows: shutdown.bat
- Unix: ./shutdown.sh
Tomcat目錄結(jié)構(gòu):
bin --- 存放tomcat啟動(dòng)關(guān)閉程序
conf --- 存放tomcat配置文件
lib --- tomcat運(yùn)行需要jar包
logs --- tomcat日志文件
webapps --- 網(wǎng)站發(fā)布目錄(所有網(wǎng)站可以發(fā)布到該目錄)
work --- 存放工程運(yùn)行時(shí),產(chǎn)生數(shù)據(jù)文件(JSP翻譯Servlet、Session持久化數(shù)據(jù))
站點(diǎn)根目錄:
------- 靜態(tài)web資源、jsp
------- WEB-INF目錄
------- classes目錄 (保存,class文件)
-------- lib 目錄 (當(dāng)前網(wǎng)站需要jar包)
-------- web.xml (網(wǎng)站配置文件)
- WEB-INF目錄不是必須的,沒有java動(dòng)態(tài)程序代碼, 可以沒有WEB-INF 目錄
- WEB-INF目錄下資源不能被瀏覽器直接訪問
如何設(shè)置tomcat壓縮:
通過設(shè)置tomcat/conf/server.xml設(shè)置響應(yīng)數(shù)據(jù)壓縮
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
**compression="on"**
** compressionMinSize="256"**
compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,application/json"/>
注:compressionMinSize推薦值在150和1000之間
清除瀏覽器緩存,重啟tomcat
支持下載文件名為中文的文件:
<Connector port="8080"
URIEncoding="utf-8"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Jetty的基本架構(gòu)

jetty的主要組件的類圖

整個(gè) Jetty 的核心是圍繞著 Server 類來構(gòu)建,Server 類繼承了 Handler,關(guān)聯(lián)了 Connector 和 Container。Container 是管理 Mbean 的容器。
Jetty 的 Server 的擴(kuò)展主要是實(shí)現(xiàn)一個(gè)個(gè) Handler 并將 Handler 加到 Server 中,Server 中提供了調(diào)用這些 Handler 的訪問規(guī)則。
整個(gè) Jetty 的所有組件的生命周期管理是基于觀察者模板設(shè)計(jì),它和 Tomcat 的管理是類似的。下面是 LifeCycle 的類關(guān)系圖

Handler 的體系結(jié)構(gòu)

Jetty 主要提供了兩種 Handler 類型,一種是 HandlerWrapper,它可以將一個(gè) Handler 委托給另外一個(gè)類去執(zhí)行,如我們要將一個(gè) Handler 加到 Jetty 中,那么就必須將這個(gè) Handler 委托給 Server 去調(diào)用。配合 ScopeHandler 類我們可以攔截 Handler 的執(zhí)行,在調(diào)用 Handler 之前或之后,可以做一些另外的事情,類似于 Tomcat 中的 Valve;
另外一個(gè) Handler 類型是 HandlerCollection,這個(gè) Handler 類可以將多個(gè) Handler 組裝在一起,構(gòu)成一個(gè) Handler 鏈,方便我們做擴(kuò)展。





















