在以往的tomcat使用中本人一直都沒有注意到tomcat的conf目錄下配置文件的作用,都是“拿來主義”的思想,從未深究。但是最近遇到很多有關tomcat配置的問題,很是頭大,所以才稍作整理。
我們可以發現該目錄下有web.xml、tomcat-users.xml、server.xml以及context.xml這四個配置文件。首先我們分別來看看這幾個配置文件分別有哪些作用。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
web.xml的作用:
web.xml的文件格式定義在Servlet規范中,因此所有符合Servlet規范的Java Servlet Container都會用到它。當tomcat部署應用程序時(在激活過程中,或加載應用程序後),它都會讀取通用的conf/web.xml,然後再讀取web應用程序中的WEB-INF/web.xml。(此文件一般不會涉及修改,可以不用過多了解,實話是筆者也不太了解。)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tomcat-users.xml的作用:
顧名思義,"uesrs"那肯定是與用戶相關的啦。打開之後,我們可以在文件最下面看到一段被注釋的代碼:
1 <!-- 2 <role rolename="tomcat"/> 3 <role rolename="role1"/> 4 <user username="tomcat" password="tomcat" roles="tomcat"/> 5 <user username="both" password="tomcat" roles="tomcat,role1"/> 6 <user username="role1" password="tomcat" roles="role1"/> 7 -->
很明顯這是配置用戶名、密碼以及用戶的權限的。只要在這段注釋的代碼後加入一行,就可以實現用戶的配置:
1 <user username="admin" password="1234" roles="manager-gui"/>
這樣我們就成功地添加了用戶名為:admin,密碼為:1234的管理員用戶(manager-gui為管理員角色)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
server.xml的作用:
在筆者看來server.xml在如今的tomcat版本中主要作用還是處理來自客戶端的訪問請求的,想要知道server.xml的作用,還是得了解其中各個標簽的含義。
至於各個標簽的詳細含義,本文就不再指出,有意者請查看筆者專門總結的server.xml作用的文章,就指出server處理一個訪問請求的大體流程。
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對象返回給客戶端浏覽器。
需要指出的是,在tomcat 5.5 之後的版本有關context的配置已經可以不在server.xml中配置,而是在/conf/context.xml中進行獨立的配置。
原因:因為 server.xml 是不可動態重加載的資源,服務器一旦啟動了以後,要修改這個文件,就得重啟服務器才能重新加載。而 context.xml
文件則不然, tomcat 服務器會定時去掃描這個文件。一旦發現文件被修改(時間戳改變了),就會自動重新加載這個文件,而不需要重啟服務器 。
然而,官方貌似還是保留了server.xml中配置context的寫法,我想這樣做的主要原因是相對舊版本的兼容吧。(不推薦在server.xml中配置context)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
context.xml的作用:
從上文可知,每個<Context元素代表了運行在虛擬主機上的單個Web應用。
1 <Context 2 path="/SmartStore" 3 reloadable="false" 4 docBase="D:\SmartStore\workspaceSmartStore\SmartStore\src\main\webapp" 5 workDir="D:\SmartStore\workspaceSmartStore\SmartStore\work" > 6 <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/> 7 </Context>
1、path:即要建立的虛擬目錄,,注意是/kaka,它指定訪問Web應用的 上下文根,如http://localhost:8080/SmartStore/****
2、docBase:為應用程序的路徑或WAR文件存放的路徑 ,可以是絕對路徑 ,也可是相對路徑,相對路徑是相對於<Host >(此處的host對應server.xml中的host元素)
3、reloadable:如果這個屬性設為true,Tomcat服務器在運行狀態下會監視在WEB-INF/classes和Web-INF/lib目錄CLASS文件的改變,如果監視到有class文件被更新,服務器自動重新加載Web應用,這樣我們可以在不重起tomcat的情況下改變應用程序。
4、workDir:jsp運行時都要先轉換成servlet,使用tomcat時會在tomcat安裝目錄下的work生成一系列的文件夾和.java文件和.class文件。設置該屬性後可改變生成的java和class文件的存儲路徑。
Tips:一個Host元素中嵌套任意多的Context元素。每個Context的路徑必須是惟一的,由path屬性定義。另外,你必須定義一個path=“”的context,這個Context稱為該虛擬主機的缺省web應用,用來處理那些不能匹配任何Context的Context路徑的請求。
context.xml中其他標簽:
<Context path="/kaka" docBase="kaka" debug="0" reloadbale="true" privileged="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>WEB-INF/kaka.xml</WatchedResource> 監控資源文件,如果web.xml || kaka.xml改變了,則自動重新加載改應用。 <Resource name="jdbc/testSiteds" 表示指定的jndi名稱 auth="Container" 表示認證方式,一般為Container type="javax.sql.DataSource" maxActive="100" 連接池支持的最大連接數 maxIdle="30" 連接池中最多可空閒maxIdle個連接 maxWait="10000" 連接池中連接用完時,新的請求等待時間,毫秒 username="root" 表示數據庫用戶名 password="root" 表示數據庫用戶的密碼 driverClassName="com.mysql.jdbc.Driver" 表示JDBC DRIVER url="jdbc:mysql://localhost:3306/testSite" /> 表示數據庫URL地址 </Context>
The last:
context.xml的三個作用范圍
---------------------------------------------------------------
1. tomcat server級別:
在/conf/context.xml裡配置
2. Host級別:
在/conf/Catalina/${hostName}裡添加context.xml,繼而進行配置
3. web app 級別:
在/conf/Catalina/${hostName}裡添加${webAppName}.xml,繼而進行配置