程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> tomcat文件夾與文件解析

tomcat文件夾與文件解析

編輯:JAVA編程入門知識

今天看到一篇不錯的文章,如下:

/bin:存放啟動和關閉tomcat的腳本文件;

/conf:存放tomcat的各種配置文件,比如:server.xml/

server/lib:存放tomcat服務器所需要的各種jar文件(jar文件只可被tomcat 服務器訪問)

/server/webapps:存放tomcat自帶的兩個web應用:admin應用和manager應用。

/common/lib:存放tomcat服務器以及所有web應用都可以訪問的jar文件夾(web和tomcat服務器都可訪問此jar)

/shared/lib:存放web都可訪問的jar文件。(可以被所有的web訪問,但不能被tomcat訪問)

/logs:存放tomcat的日志文件

/webapps:當發布web應用時,默認情況下把web應用文件放於此目錄下

/work:tomcat把由jsp生成的Servlet放於此目錄

另:在web應用中,WEB-Inf目錄下,也可以建立lib子目錄,在此子目錄下可以存放各種jar文件,這些jar文件只能被當前web應用訪問。其中,在web-inf目錄下的lib與classes目錄,Tomcat類裝載器先裝載classes目錄下的類,再裝載lib目錄下的類。因為類同名時,classes優先。其中jsp運行時,查找class的順序為:項目文件夾(WEB-INF\lib)===》容器文件夾(tomcat\common\lib)==》jdk文件夾(jdk\jre\lib\ext)

 

Tomcat的配置文件

Tomcat的配置基於兩個配置文件: 1.server.xml - Tomcat的全局配置文件 

2.web.xml - 在Tomcat中配置不同的關系環境

server.xml server.xml是Tomcat的主配置文件.完成兩個目標:

1 提供Tomcat組件的初始配置. 

2 說明Tomcat的結構,含義,使得Tomcat通過實例化組件完成起動及構建自身, 如在server.xml所指定的

server.xml種的重要元素:

元素及其描述 Server server.xml文件中最重要的元素.Server定義了一個Tomcat服務器.一般你不用對他擔心太多.Server元素能包含Logger和ContextManager元素類型 Logger 此元素定義一個Logger對象,每個Logger都有一個名字去標識,也有一個紀錄Logger的輸出和冗余級別(描述此日志級別)和包含日志文件的路徑.通常有servlet的Logger(ServletContext.log()處),JSP和Tomcat運行時的Logger, ContextManager ContextManager說明一套ContextInterceptor, RequestInterceptor , Context和他們的Connectors的配置及結構.ContextManager有幾個隨同提供的特性:1. 用來紀錄調試信息的調試級別 2. webapps/,conf/,logs/和所有已定義的環境的基本位置.用來使Tomcat可以在TOMCAT_HOME外的其他目錄啟動. 3. 工作目錄的名字 ContextInterceptor&RequestInterceptor 這些偵聽器(interceptors)偵聽具體發生在ContextManager中的事件.例如,ContextInterceptor偵聽Tomcat的啟動及終止事件,RequestInterceptor監視在它服務過程中用戶請求需要通過的不同階段.Tomcat的管理員不必知道太多關於偵聽器的知識;另外,開發者應該知道這是如何在Tomcat中實現一個”全局”型的操作(例如安全性及每個請求日志) Connector Connector表示一個到用戶的聯接,不管是通過web服務器或直接到用戶浏覽器(在一個獨立配置中).Connector負責管理Tomcat的工作線程和 讀/寫 連接到不同用戶的端口的 請求/響應.Connector的配置包含如下信息: 1.句柄類 2.句柄監聽的TCP/IP端口 3.句柄服務器端口的TCP/IP的backlog. Context 每個Context提供一個指向你放置你Web項目的Tomcat的下屬目錄。每個Context包含如下配置:1. Context放置的路徑,可以是與ContextManager主目錄相關的路徑. 2.紀錄調試信息的調試級別 3.可重載的標志.開發Servlet時,重載更改後的Servlet,這是一個非常便利的特性,你可以調試或用Tomcat測試新代碼而不用停止或重新啟動Tomcat.要打開重載,把reloadable設為真即可.這雖花費時間但可檢測所發生的變化;更重要的事,鑒於,在一個裝載類對象裝入一個新的servlet時,類裝載觸發器可能會擲出一些錯誤.為避免這些問題,你可以設置可重載為假,這將停止重載功能.

web.xml

     Tomcat可以讓用戶通過將缺省的web.xml放入conf目錄中來定義所有關系環境的web.xml的缺省值.建立一個新的關系環境時,Tomcat使用缺省的web.xml文件作為基本設置和應用項目特定的web.xml(放在應用項目的WEB-INF/web.xml文件)來覆蓋這些缺省值.

 

Tomcat server 配置節點說明

1.1 Server Server代表整個Catalina servlet容器。在server.xml配置文件中必須是頂層元素且唯一,給它配置的屬性代表整個容器的屬性。 1.2 Service Service是這樣一個集合:它由一個或者多個Connector,以及一個共享的處理引擎(Engine)組成。Engine負責處理所有Connector所獲得的客戶請求。 1.3 Connector 一個連接器(Connector)將在某個指定端口上偵聽客戶請求,並將獲得的請求交給Engine來處理,從Engine處獲得響應結果,並返回給客戶端。 Tomcat有兩個典型的連接器,一個直接偵聽來自客戶端浏覽器的http請求,一個偵聽來自其它Web服務器的請求。 Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶浏覽器的http請求,Coyote JK2 Connector 在端口8009處偵聽來自其它Web服務器(比如Apache)的servlet/jsp代理請求。當使用Coyote Http/1.1 Connector時,Tomcat作為獨立的Web容器,同時扮演Web服務器和Servlet容器的雙重角色。當使用Coyote JK2 Connector時,Tomcat只扮演Servlet容器的角色,Web服務器則由Apache或者其他服務器來提供,由於這些專有的Web服務器在處理靜態資源的性能和效率上要比Tomcat提供的Web服務器要好,所以很多人將Tomcat和Apache配合使用。 1.4 Engine 處理引擎(Engine)代表一個Service所屬的請求處理機,它接受所有連接器傳遞過來的客戶端請求,將處理結果返回給連接器,由連接器將最終響應返回給客戶端。Engine必須配置在Service組件下。處理引擎下可以配置多個虛擬主機(Virtual Host),每個虛擬主機都有一個域名。當處理引擎獲得一個請求時,它把該請求匹配到某個虛擬主機上,把請求交給該虛擬主機來處理。處理引擎有一個默認虛擬主機,當請求無法匹配到任何一個虛擬主機上時,交給默認虛擬主機來處理。 1.5 Host 代表一個虛擬主機,每個虛擬主機和某個網絡域名(Domain Name)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個Web應用程序(Web Application),每個Web應用程序對應於一個Context,有一個Context path。當虛擬主機獲得一個請求時,將把該請求匹配到某個Context上,然後把該請求交給該Context來處理。匹配的方法是“最長匹配”,一個path=""的Context將成為該虛擬主機的默認Context。所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配。 在許多情況下,系統管理員希望將多個網絡域名綁定到同一個虛擬主機,這就需要使用“主機別名”技術來實現。 1.6 Context 一個Context對應於一個Web應用程序,一個Web應用程序由一個或者多個Servlet組成。Context在創建的時候將根據配置文件$CATALINA_HOME/conf/web.xml和$WebApp /Web-INF/web.xml載入Servlet類。當Context獲得請求時,將在自己的映射表(mapping table)中尋找相匹配的Servlet類。如果找到,則執行該類,獲得請求的響應,並返回。 2 Tomcat Server處理一個http請求的過程 假設來自客戶的請求為: http://localhost:8080/macy/index.jsp 1) 請求發送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得。 2) Connector把該請求交給它所在Service的Engine來處理,並等待來自Engine的響應。 3) Engine獲得請求localhost/macy/index.jsp,匹配它所擁有的所有虛擬主機Host。 4) Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認虛擬主機)。 5) localhost Host獲得請求/macy/index.jsp,匹配它所擁有的所有Context。 6) Host匹配到路徑為/macy的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)。 7) path="/macy"的Context獲得請求/index.jsp,在它的映射表中尋找對應的servlet。 8) Context匹配到URL PATTERN為*.jsp的servlet,對應於JspServlet類。 9) 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法。 10)Context把執行完了之後的HttpServletResponse對象返回給Host。 11)Host把HttpServletResponse對象返回給Engine。 12)Engine把HttpServletResponse對象返回給Connector。 13)Connector把HttpServletResponse對象返回給客戶端浏覽器。

如何正確編譯servlet & 兩個jre目錄和三個lib目錄

lib目錄下放置著jar包。程序中的import語句找的就是這些文件!例如:import javax.servlet.RequestDispatcher;     問題在於,在cmd模式下編譯,系統會提示:CheckAccount.java:5: 軟件包 javax.servlet 不存在!     在安裝jdk之後,仔細觀察下安裝路徑下的文件夾,其中共計兩處包含jre目錄!共有三處lib目錄!包含javax.servlet的jar包就應該被安置在其中的某一處。首先在tomcat的安裝目錄下,找到servlet-api.jar(位於D:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\servlet-api.jar)。這個包用winrar解壓之後看到內部結構為:         javax\servlet\http    同import語句的結構一致!     我的硬盤裡,lib文件夾的位置如下:         D:\Program Files\Java\jdk1.6.0_02\jre\lib         D:\Program Files\Java\jre1.6.0_02\lib         D:\Program Files\Java\jdk1.6.0_02\lib     分別為jdk下的lib;jre下的lib;jdk下的jre下的lib。

     經過驗證,把servlet-api.jar包拷貝進入jdk下的jre下的lib下的ext目錄後,import語句順利通過編譯!即:C:\Program Files\Java\jdk1.5.0_08\jre\lib\ext相關的,其他從外部導入的jar包,都放在這個目錄下。例如:在工程中導入mysql驅動jar包“mysql-connector-java-3.0.17-ga-bin.jar”,其本質是拷貝了該jar包到ext目錄下。其他情況,再添加oracle驅動jar包也類似處理。

再來解釋下,為什麼會有兩處jre目錄?三個lib目錄分別什麼作用?    安裝JDK後,Java目錄下有jdk和jre兩個文件夾,但jdk下還有一個jre文件夾,而且這個jre比前面那個jre在bin目錄下多了個server文件夾!     普通用戶裝jre即可。開發人員需要安裝jdk,其中包括jre。所以jdk目錄下包括jre目錄。兩個jre大體相同,有細微的差別。     兩套 jre ,是針對不同的工作職責!不同的 jre 負責各自范圍的內容。     當用戶只需要執行 java 的程序時,那麼C:\Program Files\Java\jre1.5.0_08的 jre 就 ok !     當用戶是 java 程序員,則需要 java 開發環境。編譯時,系統就會優先去找C:\Program Files\Java\jdk1.5.0_08\bin下的“ java 、 javac ”這些命令所在目錄或者他們的父目錄的 jre 。即開發環境下運行的是 jdk 下的 jre 。

再說三個lib目錄:    JDK下的lib包括java開發環境的jar包,是給JDK用的,例如JDK下有一些工具,可能要用該目錄中的文件。例如,編譯器等。     JRE下的lib只是運行java程序的jar包,是為JVM運行時候用的。包括所有的標准類庫,和擴展類。     JDK下的JRE下的lib是開發環境中,運行時需要的jar包。最典型的就是導入的外部驅動jar包。因為編譯時,系統找的是jdk下的jre。而不是最外層的jre。-----------------------------------------     最後我在這裡補充幾點:     1. 在使用Eclipse的時候不需要指定的CLASSPATH,Eclipse會自己搜索.     2. 獨立目錄下的jre是通用jre,安裝時是可選的(選擇了,則會覆蓋已有版本)。jdk目錄下的jre則是必須的。如果你在eclipse裡指定jdk的路徑(jre的路徑不用你指定,會自己去找的),那麼用的就是這個jre。而java, web, start等,用的則是通用jre。

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved