Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache免都、Sun 和其他一些公司及個人共同開發(fā)而成廊酣。由于有了Sun 的參與和支持能耻,最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn)。因為Tomcat 技術(shù)先進亡驰、性能穩(wěn)定晓猛,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發(fā)商的認(rèn)可凡辱,成為目前比較流行的Web 應(yīng)用服務(wù)器戒职。目前最新版本是8.0。
Tomcat服務(wù)器是一個免費的開放源代碼的Web 應(yīng)用服務(wù)器透乾,屬于輕量級應(yīng)用服務(wù)器洪燥,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選续徽。對于一個初學(xué)者來說蚓曼,可以這樣認(rèn)為,當(dāng)在一臺機器上配置好Apache 服務(wù)器钦扭,可利用它響應(yīng)HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個應(yīng)用)頁面的訪問請求纫版。實際上Tomcat 部分是Apache 服務(wù)器的擴展,但它是獨立運行的客情,所以當(dāng)你運行tomcat 時其弊,它實際上作為一個與Apache 獨立的進程單獨運行的癞己。
更多資料可以查看tomcat的官網(wǎng):http://tomcat.apache.org/
一、tomcat的安裝
注:在安裝tomcat之前梭伐,你需要安裝JDK痹雅,并且配置好環(huán)境變量
tomcat下載后解壓即可使用,需要配置以下的環(huán)境變量:
CATALINA_HOME
PATH中加入:%CATALINA_HOME%\bin;%CATALINA_HOME%\lib
二糊识、tomcat目錄介紹
bin:存放各種平臺下啟動和關(guān)閉Tomcat的腳本文件
conf:存放Tomcat服務(wù)器的各種全局配置文件绩社,其中最重要的是server.xml和web.xml
lib:存放Tomcat運行需要的庫文件(JARS);
logs:存放Tomcat執(zhí)行時的LOG文件赂苗;
temp: 存放Tomcat運行時所產(chǎn)生的臨時文件
webapps:Tomcat的主要Web發(fā)布目錄愉耙,默認(rèn)情況下把Web應(yīng)用文件放于此目錄
work:存放jsp編譯后產(chǎn)生的class文件;
conf目錄中一些關(guān)鍵文件說明:
server.xml文件:該文件用于配置和server相關(guān)的信息拌滋,比如tomcat啟動的端口號朴沿、配置host主機、配置Context
web.xml文件:部署描述文件败砂,這個web.xml中描述了一些默認(rèn)的servlet赌渣,部署每個webapp時,都會調(diào)用這個文件昌犹,配置該web應(yīng)用的默認(rèn)servlet坚芜。
tomcat-users.xml文件:配置tomcat的用戶密碼與權(quán)限。
context.xml:定義web應(yīng)用的默認(rèn)行為祭隔。
三货岭、Tomcat Server的組成部分
1.1 - Server
A Server element represents the entire Catalina servlet container. (Singleton)
1.2 - Service
A Service element represents the combination of one or more Connector components that share a single Engine
Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine疾渴,負(fù)責(zé)處理所有Connector所獲得的客戶請求
1.3 - Connector
一個Connector將在某個指定端口上偵聽客戶請求千贯,并將獲得的請求交給Engine來處理,從Engine處獲得回應(yīng)并返回客戶
TOMCAT有兩個典型的Connector搞坝,一個直接偵聽來自browser的http請求搔谴,一個偵聽來自其它WebServer的請求
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
1.4 - Engine
The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名
當(dāng)Engine獲得一個請求時桩撮,它把該請求匹配到某個Host上敦第,然后把該請求交給該Host來處理
Engine有一個默認(rèn)虛擬主機,當(dāng)請求無法匹配到任何一個Host上的時候店量,將交給該默認(rèn)Host來處理
1.5 - Host
代表一個Virtual Host芜果,虛擬主機,每個虛擬主機和某個網(wǎng)絡(luò)域名Domain Name相匹配
每個虛擬主機下都可以部署(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匹配
1.6 - 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),并返回
四邢羔、Tomcat Server的結(jié)構(gòu)圖
【Tomcat的啟動過程】
Tomcat 先根據(jù)/conf/server.xml 下的配置啟動Server驼抹,再加載Service,對于與Engine相匹配的Host拜鹤,每個Host 下面都有一個或多個Context砂蔽。
注意:Context 既可配置在server.xml 下,也可配置成一單獨的文件署惯,放在conf\Catalina\localhost 下,簡稱應(yīng)用配置文件镣隶。
Web Application 對應(yīng)一個Context极谊,每個Web Application 由一個或多個Servlet 組成。當(dāng)一個Web Application 被初始化的時候安岂,它將用自己的ClassLoader 對象載入部署配置文件web.xml 中定義的每個Servlet 類:它首先載入在$CATALINA_HOME/conf/web.xml中部署的Servlet 類轻猖,然后載入在自己的Web Application 根目錄下WEB-INF/web.xml 中部署的Servlet 類。
web.xml 文件有兩部分:Servlet 類定義和Servlet 映射定義域那。
每個被載入的Servlet 類都有一個名字咙边,且被填入該Context 的映射表(mapping table)中,和某種URL 路徑對應(yīng)次员。當(dāng)該Context 獲得請求時败许,將查詢mapping table,找到被請求的Servlet淑蔚,并執(zhí)行以獲得請求響應(yīng)市殷。
所以,對于Tomcat 來說刹衫,主要就是以下這幾個文件:conf 下的server.xml醋寝、web.xml,以及項目下的web.xml带迟,加載就是讀取這些配置文件音羞。
五、server.xml說明
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>
<Service name="Tomcat-Standalone">
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080"
minProcessors="5" maxProcessors="75" acceptCount="100"
enableLookups="true"
redirectPort="8443"
debug="0"
connectionTimeout="20000"
useURIValidationHack="false"
disableUploadTimeout="true" />
<Engine name="Standalone" defaultHost="localhost" debug="0">
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<Context path="" docBase="mycontext" debug="0"/>
<Context path="/wsota" docBase="wsotaProject" debug="0"/>
</Host>
</Engine>
</Service>
</Server>
六仓犬、conf目錄中context.xml和server.xml的Context節(jié)點說明
1嗅绰、在tomcat 5.5之前
Context體現(xiàn)在/conf/server.xml中的<Host>里的<Context>元素,它由Context接口定義。每個<Context>元素代表了運行在虛擬主機上的單個Web應(yīng)用
① path:即要建立的虛擬目錄办陷,,注意是/kaka貌夕,訪問Web應(yīng)用的 上下文根,如http://localhost:8080/kaka/****民镜。這個屬性必須是唯一的啡专,對應(yīng)一個webapp。
② docBase:為應(yīng)用程序的路徑或WAR文件存放的路徑 制圈,可以是絕對路徑 们童,也可是相對路徑,相對路徑是相對于<Host >
③ reloadable:如果這個屬性設(shè)為true鲸鹦,Tomcat服務(wù)器在運行狀態(tài)下會監(jiān)視在WEB-INF/classes和Web-INF /lib目錄CLASS文件的改變慧库,如果監(jiān)視到有class文件被更新,服務(wù)器自動重新加載Web應(yīng)用馋嗜,這樣我們可以在不重起tomcat的情況下改變應(yīng) 用程序
一個Host元素中嵌套任意多的Context元素齐板。每個Context的路徑必須是惟一的,由path屬性定義葛菇。另外甘磨,你必須定義一個path=“”的context,這個Context稱為該虛擬主機的缺省web應(yīng)用眯停,用來處理那些不能匹配任何Context的Context路徑的請求济舆。
2、在tomcat 5.5之后
不推薦在server.xml中進行配置莺债,而是在/conf/context.xml中進行獨立的配置滋觉。因 為 server.xml 是不可動態(tài)重加載的資源,服務(wù)器一旦啟動了以后齐邦,要修改這個文件椎侠,就得重啟服務(wù)器才能重新加載。而 context.xml 文件則不然侄旬, tomcat 服務(wù)器會定時去掃描這個文件肺蔚。一旦發(fā)現(xiàn)文件被修改(時間戳改變了),就會自動重新加載這個文件儡羔,而不需要重啟服務(wù)器*宣羊。
<Context path="/kaka" docBase="kaka" debug="0" reloadbale="true" privileged="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/kaka.xml</WatchedResource> 監(jiān)控資源文件,如果web.xml || kaka.xml改變了汰蜘,則自動重新加載改應(yīng)用仇冯。 <Resource name="jdbc/testSiteds" 表示指定的jndi名稱
auth="Container" 表示認(rèn)證方式,一般為Container
type="javax.sql.DataSource" maxActive="100" 連接池支持的最大連接數(shù)
maxIdle="30" 連接池中最多可空閑maxIdle個連接
maxWait="10000" 連接池中連接用完時,新的請求等待時間,毫秒
username="root" 表示數(shù)據(jù)庫用戶名
password="root" 表示數(shù)據(jù)庫用戶的密碼
driverClassName="com.mysql.jdbc.Driver" 表示JDBC DRIVER
url="jdbc:mysql://localhost:3306/testSite" /> 表示數(shù)據(jù)庫URL地址 </Context></pre>
3族操、context.xml的三個作用范圍
① tomcat server級別:
在/conf/context.xml里配置苛坚。(因為這個contex.xml是每個webapp都會讀取的比被,所以在這個文件里面定義的節(jié)點都是全局性的,即每個webapp都會出現(xiàn))
② Host級別:(有多個虛擬主機的時候才會用到)
在/conf/Catalina/${hostName}里添加context.xml泼舱,繼而進行配置
③ web app 級別:(這個context.xml是對應(yīng)各自特定webapp的等缀,屬于webapp內(nèi)部)
在/conf/Catalina/${hostName}里添加${webAppName}.xml,繼而進行配置(這個Context)
七娇昙、Tomcat Server處理一個http請求的過程
假設(shè)來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp
- 請求被發(fā)送到本機端口8080尺迂,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
- Engine獲得請求localhost/wsota/wsota_index.jsp冒掌,匹配它所擁有的所有虛擬主機Host
- Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理噪裕,因為該Host被定義為該Engine的默認(rèn)主機)
- 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