首先看一下Tomcat的目錄結構以及每一個目錄的主要做用
Tomcat的全部配置都放在了conf文件夾中,裏面的server.xml是配置的核心文件。
若是想要修改Tomcat的默認啓動端口,能夠修改server.xml的Connect配置的port屬性。html
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
注意,一旦修改了conf的.xml文件,就要重啓tomcat,訪問Tomcat服務器時也要以新的訪問端口去訪問。
bin目錄下的這兩個負責啓動和關閉tomcat服務器java
web應用開發好以後,若想提供給外界訪問,須要將web應用所在目錄交給web服務器管理,這個過程就叫虛擬目錄的映射。Tomcat有如下幾種映射方式:web
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
在Host標籤下添加Context標籤,如:apache
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/JavaWebApp" docBase="F:\JavaWebDemoProject" /> </Host>
這樣就能夠將F盤下的JavaWebDemoProject項目映射到JavaWebApp這個虛擬目錄上,JavaWebApp這個虛擬目錄是由Tomcat服務器管理的,它自己是一個硬盤上不存在的目錄,也就是一個虛擬目錄。其中,Context表示上下文,表明的就是一個javaWeb應用,context有兩個屬性:
1.path: 用來配置虛擬目錄,必須以"/"開頭
2.docBase: 配置此虛擬目錄對應着硬盤上Web應用所在目錄
這裏訪問/JavaWebApp/1.jsp就至關於訪問F:/JavaWebDemoProject/1.jsp
注意,Tomcat6之後就不在建議經過這種方式來添加虛擬目錄的映射,由於每次修改server.xml以後都要重啓tomcat服務器來加載server.xml文件。windows
Tomcat服務器會自動管理webapps目錄下的全部web應用,並把它映射成虛擬目錄。也就是說,tomcat服務器的webapps目錄下的全部web應用,外界能夠直接訪問。
所以能夠直接將F盤下的JavaWebDemoProject這個應用copy到tomcat服務器的webapps目錄下便可。如圖:
這時Tomcat服務器就會自動爲JavaWebDemoProject這個應用映射一個同名的虛擬目錄"/JavaWebDemoProject",而後你就能夠用瀏覽器訪問這個資源了,如圖:
瀏覽器
在Tomcat服務器的\conf\Catalina\locahost目錄下添加一個xml文件,虛擬目錄的名稱就是該xml文件名。
以前在方法一中Context元素的path屬性跟這裏的xml文件名的做用是同樣的。如:
在aa.xml文件中添加Context元素映射JavaWeb應用,代碼以下:tomcat
<Context docBase="F:\JavaWebDemoProject" /> //在aa.xml中就不用path屬性了
訪問地址:http://localhost:8080/aa/1.jsp
使用這種方式的好處是修改了配置文件以後不用重啓Tomcat服務器,Tomcat服務器會自動加載配置文件。服務器
配置虛擬主機其實就是配置一個網站。只須要修改conf文件下的server.xml,使用Host元素進行配置便可。app
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
這個配文件中的name="localhost"其實就是定義了一個name爲localhost的虛擬主機,這臺虛擬主機管理webapps文件夾下的全部web應用,這樣咱們就能夠經過"http://localhost:端口號/JavaWebAppName"來訪問了。若是使用以下的方式配置一個虛擬主機:webapp
<Host name="www.gacl.cn" appBase="F:\JavaWebApps"> </Host>
也就是說,配置了一個name爲"www.gacl.cn"的虛擬主機,該虛擬主機管理着F:\JavaWebApps下的全部web應用。要想訪問"http://www.gacl.cn:端口號/JavaWebAppName",還須要在windows系統中註冊"www.gacl.cn"這個域名。
配置的主機要想經過域名被外部訪問,必須在DNS服務器或windows系統中註冊訪問網站時使用的域名。
找到"C:\Windows\System32\drivers\etc"目錄下的hosts文件,以下圖所示:
將新添加的網站的域名和IP地址綁定在一塊兒,那麼咱們在瀏覽器中使用www.gacl.cn這個域名來訪問虛擬主機管理的那些web應用了。
這樣就能夠訪問了。
當咱們在瀏覽器的地址欄中輸入URL地址,如"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去訪問服務器上的1.jsp事,服務器和瀏覽器都作了什麼呢,咱們又是怎樣看到1.jsp這個web資源裏的內容的呢?
整個交互過程以下:
1. 瀏覽器根據主機名"www.gacl.cn"去操做系統的hosts文件查找主機名對應的IP地址;
2. 若是沒找到,就去互聯網上DNS服務器上查找"www.gacl.cn"這臺主機對應的IP地址;
3. 找到這臺主機對應的IP地址後,就用IP地址鏈接到Web服務器;
4. 瀏覽器鏈接到Web服務器後,就使用http協議向服務器發送請求,發送請求的過程當中,瀏覽器會向Web服務器以stream的形式傳輸數據,告訴web服務器要訪問裏面的哪一個web應用下的web資源,以下圖所示:
這個就是瀏覽器向web服務器發送請求時傳輸的數據:
GET /JavaWebDemo1/1.jsp:瀏覽器以get的方式向服務器發送請求,請求的是avaWebDemo1裏的1.jsp這個Web資源。
Host: www.gacl.cn:8080: 訪問的是www.gacl.cn對應的IP地址,和8080端口。
5. 瀏覽器作完上面4步以後,開始等待,等待web服務器把本身想要訪問的1.jsp這個資源傳輸給它;
6. 服務器接收到瀏覽器傳輸的數據以後,開始進行解析,將讀到的內容再以stream的形式傳輸給瀏覽器,如圖:
HTTP/1.1 200 OK:使用的HTTP協議1.1的版本,200表示請求成功
這個就是Web服務器傳輸給瀏覽器的數據。
7. 瀏覽器拿到服務器傳輸給它的數據後,將數據展示出來,如圖:
Tomcat服務器的啓動是基於server.xml這個文件的,Tomcat啓動時先啓動一個Server,Server裏就會啓動Service,Service裏啓動多個Conntector(鏈接器),每個鏈接器都在等待客戶機的鏈接,當有用戶使用瀏覽器去訪問服務器上的web資源時,首先是鏈接到Connector,Connector是不處理用戶請求的,而是將用戶請求直接交給Engine(引擎)去處理,Engine接收到請求後就會解析到用戶想要訪問的Host,而後將請求交給相應的Host,Host收到請求後就會解析用戶想要訪問這個Host下面的哪個web應用,一個web應用對應了一個Context。
整個的過程跟server.xml的配置是對應的:
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="123456"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="www.gacl.cn" appBase="F:\JavaWebApps"> <Context path="" docBase="F:\JavaWebApps\JavaWebDemo1"/> </Host> </Engine> </Service> </Server>
一個JavaWeb項目,不一樣類型的文件有嚴格的存放規則,不然不只可能會使web應用沒法訪問,還會致使web服務器啓動報錯。
WebRoot:web應用所在目錄,通常狀況下虛擬目錄要配置到此文件夾當中。
WEB-INF:此文件夾必須位於WebRoot文件夾裏面,並且必須以這樣的形式去命名,字母都要大寫。
web.xml:配置文件,有格式要求,此文件必須以這樣的形式去命名,而且必須放置到WEB-INF文件夾中。
JAVA中使用jar命令將項目打包成一個war包,具體的使用方法以下:
如,將JavaWebDemoProject這個JavaWeb應用打包成war包
執行完以後,會獲得JavaWebDemoProject.war文件,而後將這個war包放到Tomcat服務器的webapps目錄下,當服務器啓動時,就會自動將該目錄下的war包解壓。