一圖勝千言,下面圖解均來自Program Creek 網(wǎng)站的Java教程委可,目前它們擁有最多的票選。如果圖解沒有闡明問題腊嗡,那么你可以借助它的標(biāo)題來一窺究竟着倾。
1拾酝、字符串不變性
下面這張圖展示了這段代碼做了什么
String s =
"abcd"``;
s = s.concat(``"ef"``);
image
2、equals()方法卡者、hashCode()方法的區(qū)別
HashCode被設(shè)計用來提高性能蒿囤。equals()方法與hashCode()方法的區(qū)別在于:
- 如果兩個對象相等(equal),那么他們一定有相同的哈希值崇决。
- 如果兩個對象的哈希值相同蟋软,但他們未必相等(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、別名
別名意味著有多個變量指向同一可被更新的內(nèi)存塊罐氨,這些別名分別是不同的對象類型臀规。
7、堆和棧
圖解表明了方法和對象在運(yùn)行時內(nèi)存中的位置栅隐。
8塔嬉、Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)域
圖解展示了整個虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)域的情況。
Tomcat和JVM:
一個Tomcat只會啟動一個JVM租悄,所有webapps公用一個JVM進(jìn)程谨究,所以System.exit()會導(dǎo)致影響同個Tomcat中的其他應(yīng)用。Tomcat通過調(diào)用配置的JDK或JRE來啟動JVM泣棋。
體系結(jié)構(gòu):
Server:A Server element represents the entire Catalina servlet container. (Singleton)
Service:它由一個或者多個Connector組成胶哲,以及一個Engine,負(fù)責(zé)處理所有Connector所獲得的客戶請求潭辈。
Connector:
- TOMCAT有兩個典型的Connector鸯屿,一個直接偵聽來自browser的http請求,一個偵聽來自其它WebServer的請求
- Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
- Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
Engine:
- Engine下可以配置多個虛擬主機(jī)Virtual Host把敢,每個虛擬主機(jī)都有一個域名
- 當(dāng)Engine獲得一個請求時寄摆,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理
- Engine有一個默認(rèn)虛擬主機(jī)技竟,當(dāng)請求無法匹配到任何一個Host上的時候冰肴,將交給該默認(rèn)Host來處理
Host:
- 代表一個Virtual Host屈藐,虛擬主機(jī)榔组,每個虛擬主機(jī)和某個網(wǎng)絡(luò)域名Domain Name相匹配
- 每個虛擬主機(jī)下都可以部署(deploy)一個或者多個Web App熙尉,每個Web App對應(yīng)于一個Context,有一個Context path
- 當(dāng)Host獲得一個請求時搓扯,將把該請求匹配到某個Context上检痰,然后把該請求交給該Context來處理
- 匹配的方法是“最長匹配”,所以一個path==”"的Context將成為該Host的默認(rèn)Context
- 所有無法和其它Context的路徑名匹配的請求都將最終和該默認(rèn)Context匹配
Context:
- 一個Context對應(yīng)于一個Web Application锨推,一個Web Application由一個或者多個Servlet組成
- Context在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
- 當(dāng)Context獲得請求時铅歼,將在自己的映射表(mapping table)中尋找相匹配的Servlet類
- 如果找到,則執(zhí)行該類换可,獲得請求的回應(yīng)椎椰,并返回
另外一個架構(gòu)圖:
Tomcat Server處理一個http請求的過程
假設(shè)來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp
- 請求被發(fā)送到本機(jī)端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理沾鳄,并等待來自Engine的回應(yīng)
- Engine獲得請求localhost/wsota/wsota_index.jsp慨飘,匹配它所擁有的所有虛擬主機(jī)Host
- Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))
- localhost Host獲得請求/wsota/wsota_index.jsp译荞,匹配它所擁有的所有Context
- Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為”"的Context去處理)
- path=”/wsota”的Context獲得請求/wsota_index.jsp瓤的,在它的mapping table中尋找對應(yīng)的servlet
- Context匹配到URL PATTERN為*.jsp的servlet,對應(yīng)于JspServlet類
- 構(gòu)造HttpServletRequest對象和HttpServletResponse對象吞歼,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
10)Context把執(zhí)行完了之后的HttpServletResponse對象返回給Host
11)Host把HttpServletResponse對象返回給Engine
12)Engine把HttpServletResponse對象返回給Connector
13)Connector把HttpServletResponse對象返回給客戶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" ……/>
-
啟動:
- Windows: startup.bat (可以在文件末尾加入pause指令,方便查看啟動結(jié)果)
- Unix: ./startup.sh(觀察log:tail -f catalina.log)
-
關(guān)閉:
- Windows: shutdown.bat
- Unix: ./shutdown.sh
Tomcat目錄結(jié)構(gòu):
bin --- 存放tomcat啟動關(guān)閉程序
conf --- 存放tomcat配置文件
lib --- tomcat運(yùn)行需要jar包
logs --- tomcat日志文件
webapps --- 網(wǎng)站發(fā)布目錄(所有網(wǎng)站可以發(fā)布到該目錄)
work --- 存放工程運(yùn)行時篙骡,產(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動態(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的主要組件的類圖
整個 Jetty 的核心是圍繞著 Server 類來構(gòu)建叶骨,Server 類繼承了 Handler茫多,關(guān)聯(lián)了 Connector 和 Container。Container 是管理 Mbean 的容器忽刽。
Jetty 的 Server 的擴(kuò)展主要是實(shí)現(xiàn)一個個 Handler 并將 Handler 加到 Server 中天揖,Server 中提供了調(diào)用這些 Handler 的訪問規(guī)則。
整個 Jetty 的所有組件的生命周期管理是基于觀察者模板設(shè)計跪帝,它和 Tomcat 的管理是類似的今膊。下面是 LifeCycle 的類關(guān)系圖
Handler 的體系結(jié)構(gòu)
Jetty 主要提供了兩種 Handler 類型,一種是 HandlerWrapper伞剑,它可以將一個 Handler 委托給另外一個類去執(zhí)行斑唬,如我們要將一個 Handler 加到 Jetty 中,那么就必須將這個 Handler 委托給 Server 去調(diào)用。配合 ScopeHandler 類我們可以攔截 Handler 的執(zhí)行恕刘,在調(diào)用 Handler 之前或之后缤谎,可以做一些另外的事情,類似于 Tomcat 中的 Valve褐着;
另外一個 Handler 類型是 HandlerCollection坷澡,這個 Handler 類可以將多個 Handler 組裝在一起,構(gòu)成一個 Handler 鏈含蓉,方便我們做擴(kuò)展频敛。