天天看點

Tomcat安裝及配置,Tomcat處理http請求的過程

作者:極速星空4DO

1. 結構

1.1 系統結構簡介

基礎結構劃分:C/S結構,B/S結構兩類。

技術選型劃分:Model1模型,Model2模型,MVC模型和三層架構+MVC模型。

部署方式劃分:一體化架構,垂直拆分架構,分布式架構,流動計算架構,微服務架構。

1.2 C/S結構

它指的是用戶端——伺服器的方式。其中C代表着Client,S代表着伺服器。C/S結構的系統設計圖如下:

Tomcat安裝及配置,Tomcat處理http請求的過程

1.3 B/S 結構

它指的是浏覽器一一伺服器的方式,其中 B 代表着Browser,S代表着伺服器。B/S結構 的系統設計圖如下:

Tomcat安裝及配置,Tomcat處理http請求的過程

1.4 兩種結構的差別及優略

兩種結構的差別

  1. 硬體環境不同,C/S 通常是建立在專用的網絡或小範圍的網絡環境上(即區域網路)且必須要安裝用戶端。而B/S 是建立在廣域網上的,适應範圍強,常用的作業系統和浏覽器就行
  2. B/S 結構維護更新比較簡單,而C/S 結構 維護更新相對困難
  3. C/S 結構比B/S 結構更安全,因為使用者群相對固定,對資訊保護更強

優略

  1. C/S : 是能充分發揮用戶端PC的處理能力,很多工作可以在用戶端處理後再送出給伺服器。對應的優點就是用戶端響應速度快。
  2. B/S 總體擁有成本低,維護友善,分布性強,開發簡單,可以不用安裝任何專門的軟體就能實作在任何地方進行操作,用戶端零維護,系統的擴充非常容易,隻要有一台能上網的電腦就能使用。

2. Tomcat

伺服器的概念非常的廣泛,它可以指代一台特殊的計算機(相比普通計算機運作更快、負載更高、價格更貴),也可以指代用于部署網站的應用。我們這裡說的伺服器,其實是web伺服器,或者應用伺服器。它本質就是一個軟體,一個應用。作用就是釋出我們的應用(工程),讓使用者可以通過浏覽器通路我們的應用。

常見的應用伺服器,請看下表:

伺服器名稱 說明
weblogic 實作了javaEE規範,重量級伺服器,又稱為javaEE容器
websphereAS 實作了javaEE規範,重量級伺服器。
JBOSSAS 實作了JavaEE規範,重量級伺服器。免費的。
Tomcat 實作了jsp/servlet規範,是一個輕量級伺服器,開源免費。

2.2 Tomcat下載下傳與安裝

Tomcat官網下載下傳位址

Tomcat安裝及配置,Tomcat處理http請求的過程

2.3 Tomcat 各版本所需支援

Tomcat安裝及配置,Tomcat處理http請求的過程

2.4 Tomcat目錄結構詳解

Tomcat安裝及配置,Tomcat處理http請求的過程

2.5 Tomcat 基本使用

2.5.1 啟動和停止

Tomcat 伺服器的啟動檔案在二進制檔案目錄中:

這兩個檔案就是 Tomcat 的啟動檔案。
arduino複制代碼    startup.bat  #windows下啟動執行檔案
    startup.sh  #linux 下啟動執行檔案
           

Tomcat 伺服器的停止檔案也在二進制檔案目錄中:

這兩個檔案就是 Tomcat 的停止檔案。

2.5.2 啟動問題

  1. 啟動一閃而過
  2. 原因:沒有配置環境變量。
  3. 解決辦法:配置上 JAVA_HOME 環境變量
  4. Address already in use : JVM_Bind
  5. 原因:端口被占用
  6. 解決辦法:找到占用該端口的應用
  7. 程序不重要 :使用cmd指令:netstat -a -o 檢視pid 在任務管理器中結束占用端口的程序。
  8. 程序很重要 :修改自己的端口号。修改的是Tomcat 目錄下\conf\server.xml中的配置。
  9. 啟動産生很多異常,但能正常啟動
  10. 原因:Tomcat中部署着很多項目,每次啟動這些項目都會啟動。而這些項目中有啟動報異常的。
  11. 解決辦法:
  12. 能找到報異常的項目,就把它從釋出目錄中移除。
  13. ​ 不能确定報異常的項目,就重新解壓一個新的Tomcat。
  14. tomcat控制台亂碼的解決
  15. 在 conf/logging.properties 檔案 将 utf-8 改成 gbk
  16. 其它問題
  17. 例如:啟動産生異常,但是不能正常啟動。此時就需要解壓一個新的Tomcat啟動,來确定是系統問題,還是Tomcat的問題。
  18. 是以,此時就需要具體問題,具體分析,然後再對症解決。

2.5.3 部署自己的項目

  1. 在 webapps 目錄下建立一個檔案夾
  2. 将資源放到該檔案夾裡
  3. 啟動 tomcat,在浏覽器位址欄中 輸入正确路徑

2.6 IDEA 內建 Tomcat 伺服器

第一步

Tomcat安裝及配置,Tomcat處理http請求的過程

第二步

Tomcat安裝及配置,Tomcat處理http請求的過程

第三步

Tomcat安裝及配置,Tomcat處理http請求的過程

第四步

Tomcat安裝及配置,Tomcat處理http請求的過程

2.7 Linux系統安裝Tomcat

2.7.1 下載下傳tomcat

進入Tomcat官網,找到對應版本點選download進入下載下傳頁面,如下圖:

Tomcat安裝及配置,Tomcat處理http請求的過程

2.7.2上傳到 linux

在 crt上 使用 alt+p

将 windows 上的軟體拖進去即可(root目錄)

2.7.3 在/usr/local 建立一個檔案夾 tomcat

linux複制代碼mkdir /usr/local/tomcat
           

2.7.4 移動

移動 **tomcat...tar.gz 到 /usr/local/tomcat

linux複制代碼    mv apache-tomcat-8.5.32.tar.gz /usr/local/tomcat/
           

2.7.5 解壓Tomcat

進入/usr/local/tomcat目錄,解壓 Tomcat

linux複制代碼    cd /usr/local/tomcat
    tar -xvf apache-tomcat-8.5.32.tar.gz
           

2.7.6 進入

進入 /usr/local/tomcat/apache-tomcat-8.5.32/bin

linux複制代碼   cd /usr/local/tomcat/apache-tomcat-8.5.32/bin
           

2.7.7 啟動

linux複制代碼    方式1:
      sh startup.sh
    方式2:
      ./startup.sh
           

2.7.8 修改防火牆

powershell複制代碼方式1:service iptables stop  關閉防火牆(不建議);
      用到哪一個端口号就放行哪一個(80,8080,3306...)

方式2:放行8080 端口
  修改配置檔案
    cd /etc/sysconfig
    vi iptables
      複制(yy , p)  
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
      改成
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
    重新開機加載防火牆或者重新開機防火牆
      service iptables reload  
      或者
      service iptables restart
           

3. JavaWeb應用

JavaWeb應用是一個全新的應用種類。這類應用程式指供浏覽器通路的程式,通常也簡稱為web應用。

一個web應用由多個靜态web資源和動态web資源組成,例如:html、css、js檔案,jsp檔案、java程式、支援jar包、工程配置檔案、圖檔、音視訊等等。

Web應用開發好後,若想供外界通路,需要把web應用所在目錄交給Web伺服器管理(Tomcat就是Web伺服器之一),這個過程稱之為虛似目錄的映射。

3.1 JavaWeb 應用目錄結構詳解

lua複制代碼myapp--------------應用名稱
    1.html
    css/css.css
    js/demo.js
    WEB-INF--------如果有web.xml或者.class檔案時,該目錄必須存在,且嚴格區分大小寫。
           --------該目錄下的資源,用戶端是無法直接通路的。
--------目錄中内容如下:
classes目錄----------------web應用的class檔案(加載順序:我們的class,lib目錄中的jar包,tomcat的lib目錄中的jar包。優先級依次降低)
lib目錄--------------------web應用所需的jar包(tomcat的lib目錄下jar為所有應用共享)
web.xml-------------------web應用的主配置檔案
           

3.3 JavaWeb應用的建立

第一步

Tomcat安裝及配置,Tomcat處理http請求的過程

第二步

Tomcat安裝及配置,Tomcat處理http請求的過程

第三步

Tomcat安裝及配置,Tomcat處理http請求的過程

第四步

Tomcat安裝及配置,Tomcat處理http請求的過程

3.4 JavaWeb應用的部署

1)IDEA部署

第一步

Tomcat安裝及配置,Tomcat處理http請求的過程

第二步

Tomcat安裝及配置,Tomcat處理http請求的過程

第三步

Tomcat安裝及配置,Tomcat處理http請求的過程

2)war包釋出

第一步:使用 jar -cvf war 包的名稱 目前目錄中哪些資源要打入 war

Tomcat安裝及配置,Tomcat處理http請求的過程
Tomcat安裝及配置,Tomcat處理http請求的過程

第二步:把打好的war拷貝到tomcat的webapps目錄中

Tomcat安裝及配置,Tomcat處理http請求的過程

第三步:啟動服務時,tomcat會自動解壓。

Tomcat安裝及配置,Tomcat處理http請求的過程

3.5 Tomcat 配置檔案

1) 主配置檔案 server.xml

js複制代碼    <Connector 
    port="8080"
    protocol="HTTP/1.1" 
    connectionTimeout="20000" 
    redirectPort="8443" />
           

8080 端口:tomcat 服務預設端口号。通路url 位址後必須手動寫:8080

80 端口: HTTP協定采用的端口。通路 url 位址後不用寫: 80

2) server.xml 詳解

json複制代碼<?xml version="1.0" encoding="UTF-8"?>
<!--代表整個Servlet容器元件,是最頂層元素。它裡面可以有多個Service标簽-->
<Server port="8005" shutdown="SHUTDOWN">
    <!--Tomcat運作所需的監聽器-->
    <!--預設的生命周期監聽器:在server初始化之前列印作業系統、JVM及伺服器的版本資訊-->
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <!-- 預設的生命周期監聽器:在server初始化之前加載APR庫,并在server停止後銷毀 -->
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    <!-- 預設的生命周期監聽器:server初始化之前調用,解決單例對象建立導緻的jVM記憶體洩露問題以及鎖檔案問題 -->
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <!-- 預設的生命周期監聽器:Server啟動時将JNDI資源注冊為MBean進行管理 -->
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <!-- 預設的生命周期監聽器:在context停止時重建Executor池中的線程,避免記憶體洩露 -->
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <!--全局資源配置, 解析到此節點時開始建立JNDI上下文 -->
    <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>
    <!--配置的是Tomcat的服務包含<Engine>元素和<Connector>元素。其中<Connector>可以是一個,也可以是多個,且他們共享引擎<Engine>的配置-->
    <Service name="Catalina">
        <!-- 配置共享線程池:預設的線程池實作為StandardThreadExecutor,可以通過标簽的className屬性指定Catalina共享線程池的級别為Service,預設情況下不配置共享線程池-->
        <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>-->

        <!--配置的是連接配接器,其中包括連接配接的端口和使用協定
            port:指定端口号
            protocol:指定協定名稱
            connectionTimeout:連接配接逾時時間
            redirectPort:當資源必須以https協定通路時,tomcat會重定向此端口通路。
        -->
        <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        <!--配置引擎
            name:引擎名稱
            defaultHost:虛拟主機的引用-->
        <Engine name="Catalina" defaultHost="localhost">
            <!--配置Tomcat的Realm域,安全空間-->
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
            </Realm>
            <!--配置虛拟主機。
                   name:主機名稱
                   appBase:應用預設釋出目錄
                   unpackWARs:是否自動解壓war包
                   autoDeploy:是否自動釋出-->
            <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
                <!-- 日志的valve攔截 -->
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t "%r" %s %b" />
                <!--配置具體應用項目。
                    docBase是項目的位置,可以是絕對路徑,也可以是相對路徑。如果是相對路徑,則必須釋出在虛拟主機的應用預設釋出目錄下。
                    path是指定通路該Web應用的URI
                    reloadable是指定是否重新加載/WEB-INF/classes和/WEB-INF/lib目錄下改動後的内容-->
                <!--<Context docBase="tomcat" path="/tomcat" reloadable="true"/>-->
            </Host>
        </Engine>
    </Service>
</Server>
           

3.6 Tomcal 配置虛拟目錄

虛拟目錄的配置,支援兩種方式。第一種是通過在主配置檔案中添加标簽實作。第二種是通過寫一個獨立配置檔案實作。

  1. 第一種方式:在server.xml的<Host>元素中加一個<Context path="" docBase=""/>元素。
  2. path:通路資源URI。URI名稱可以随便起,但是必須在前面加上一個 /
  3. docBase:資源所在的磁盤實體路徑

1 . 第二種方式:是寫一個獨立的xml檔案,該檔案名可以随便起。在檔案内寫一個<Context/>元素。

該檔案要放在Tomcat目錄中的conf\Catalina\localhost目錄下。需要注意的是,在使用了獨立的配置檔案之後,通路資源URI就變成了 檔案的名稱,而Context的path屬性就失效了。

3.7 Tomcat 配置虛拟主機

在<Engine>元素中添加一個<Host name="" appBase="" unparkWARs="" autoDeploy="" />,其中:

  • name:指定主機的名稱 ​
  • appBase:目前主機的應用釋出目錄 ​
  • unparkWARs:啟動時是否自動解壓war包
  • autoDeploy:是否自動釋出
Tomcat安裝及配置,Tomcat處理http請求的過程

3.8 Tomcat 預設項配置

配置預設端口

Tomcat伺服器主配置檔案中配置着通路端口,它在配置檔案中寫的值是:8080。但是它不是Tomcat的預設端口。我們此處說的預設端口是,當使用預設值的時候,端口号可以省略。http 的預設端口是80

配置方式如下:

xml複制代碼    <Connector 
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000" 
    redirectPort="8443" />		
           

配置預設應用

  1. 把要作為預設應用的應用,名稱改為ROOT。放到webapps目錄中。
  2. 寫一個獨立的配置檔案,檔案名稱為ROOT.xml。 注意:ROOT必須大寫。當使用了獨立的ROOT.xml檔案時,webapps下ROOT應用就不是預設應用了。

配置預設首頁

首先要明确的是,配置預設首頁是針對應用說的。是應用的預設首頁。 在應用的 web.xml中配置:

xml複制代碼<welcome-file-list>
    <welcome-file>預設首頁</welcome-file>
</welcome-file-list>
           

例如:

xml複制代碼<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
           

4 Tomcat 處理一個http請求的過程

假設來自客戶的請求為:http://localhost:8080/wsota/wsota_index.jsp
  1. 請求被發送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得
  2. Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
  3. Engine獲得請求localhost/wsota/wsota_index.jsp,比對它所擁有的所有虛拟主機Host
  4. Engine比對到名為localhost的Host(即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
  5. localhost Host獲得請求/wsota/wsota_index.jsp,比對它所擁有的所有Context
  6. Host比對到路徑為/wsota的Context(如果比對不到就把該請求交給路徑名為""的Context去處理)
  7. path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的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對象傳回給客戶browser

5 web.xml講解

xml複制代碼<web-app>    
<display-name></display-name>定義了WEB應用的名字    
 
<description></description> 聲明WEB應用的描述資訊    
 
<context-param></context-param> context-param元素聲明應用範圍内的初始化參數。    
 
<filter></filter> 過濾器元素将一個名字與一個實作javax.servlet.Filter接口的類相關聯。    
<filter-mapping></filter-mapping> 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。 
 
<listener></listener>servlet API的版本2.3增加了對事件監聽程式的支援,事件監聽程式在建立、修改和删除會話或servlet環境時得到通知.Listener元素指出事件監聽程式類。    
 
<servlet></servlet> 在向servlet或JSP頁面制定初始化參數或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。    
 
<servlet-mapping></servlet-mapping> 伺服器一般為servlet提供一個預設的URL:http://host/webAppPrefix/servlet/ServletName。    
 
但是,常常會更改這個URL,以便servlet可以通路初始化參數或更容易地處理相對URL。在更改預設URL時,使用servlet-mapping元素。    
 
<session-config></session-config> 如果某個會話在一定時間内未被通路,伺服器可以抛棄它以節省記憶體。    
 
可通過使用HttpSession的setMaxInactiveInterval方法明确設定單個會話對象的逾時值,或者可利用session-config元素制定預設逾時值。    
 
<mime-mapping></mime-mapping>如果Web應用具有想到特殊的檔案,希望能保證給他們配置設定特定的MIME類型,則mime-mapping元素提供這種保證。
 
<welcome-file-list></welcome-file-list> 訓示伺服器在收到引用一個目錄名而不是檔案名的URL時,使用哪個檔案。  
 
<error-page></error-page> 在傳回特定HTTP狀态代碼時,或者特定類型的異常被抛出時,能夠制定将要顯示的頁面。    
 
<taglib></taglib> 對标記庫描述符檔案(Tag Libraryu Descriptor file)指定别名。此功能使你能夠更改TLD檔案的位置,而不用編輯使用這些檔案的JSP頁面。  
 
<resource-env-ref></resource-env-ref>聲明與資源相關的一個管理對象。 
 
<resource-ref></resource-ref> 聲明一個資源工廠使用的外部資源。
 
<security-constraint></security-constraint> 制定應該保護的URL。它與login-config元素聯合使用   
 
<login-config></login-config> 指定伺服器應該怎樣給試圖通路受保護頁面的使用者授權。它與sercurity-constraint元素聯合使用。  
 
<security-role></security-role>給出安全角色的一個清單,這些角色将出現在servlet元素内的security-role-ref元素的role-name子元素中。分别地聲明角色可使進階IDE處理安全資訊更為容易。  
 
<env-entry></env-entry>聲明Web應用的環境項。 
 
<ejb-ref></ejb-ref>聲明一個EJB的主目錄的引用。 
 
<ejb-local-ref></ejb-local-ref>聲明一個EJB的本地主目錄的應用。   
 
</web-app>  
           

6 Catalina.bat 講解

Catalina.bat是tomcat所有腳本中最重要的腳本,完成幾乎所有的tomcat操作。如啟動,關閉等等,都是由catalina.bat腳本來完成的。接下來,我将對Tomcat catalina.bat腳本進行分析。

首先省去catalina.bat開頭諸多注解,這些注解主要是講解各個變量是幹什麼的。需要的話,自己看下英文就可以了。這裡就不翻譯了。

java複制代碼rem Guess CATALINA_HOME if not defined  檢視是否在tomcat目錄下,與startup.bat裡相同,不解釋了。需要的話可以看我的另一篇部落格。 
set CURRENT_DIR=%cd% 
if not "%CATALINA_HOME%" == "" goto gotHome 
set CATALINA_HOME=%CURRENT_DIR% 
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 
cd .. 
set CATALINA_HOME=%cd% 
cd %CURRENT_DIR% 
:gotHome 
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 
echo The CATALINA_HOME environment variable is not defined correctly 
echo This environment variable is needed to run this program 
goto end 
:okHome 

rem Get standard environment variables 
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" 如果存在setenv.bat腳本,調用它,我的tomcat 沒有這個腳本 

rem Get standard Java environment variables 
if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath 檢視是否存在setclasspath.bat腳本,如果存在,轉到okSetclasspath位置 
echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat 否則輸出下面兩行,并退出 
echo This file is needed to run this program 
goto end 
:okSetclasspath    okSetclasspath位置 

set BASEDIR=%CATALINA_HOME%   設定BASEDIR變量與CATALINA_HOME變量值相同 
call "%CATALINA_HOME%\bin\setclasspath.bat" %1   調用setclasspath.bat腳本并加上參數 
if errorlevel 1 goto end      如果存在錯誤 退出 

rem Add on extra jar files to CLASSPATH   設定JSSE_HOME變量,如果存在加入CLASSPATH,不存在跳過 

if "%JSSE_HOME%" == "" goto noJsse    檢查是否存在JSSE_HOME變量 
set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar 如果有加入到CLASSPATH變量後面 
:noJsse                                   
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar  将bootstrap.jar加入到CLASSPATH裡 

if not "%CATALINA_BASE%" == "" goto gotBase  如果CATALINA_BASE變量不為空,跳過,轉到gotBase位置 
set CATALINA_BASE=%CATALINA_HOME%  如果為空,将CATALINA_BASE設為CATALINA_HOME變量的值 
:gotBase 

if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir   CATALINA_TMPDIR不為空,跳過,轉到gotTmpdir位置 
set CATALINA_TMPDIR=%CATALINA_BASE%\temp   如果為空,将 CATALINA_TMPDIR設為%CATALINA_BASE%\temp變量的值(即tomcat\temp) 
:gotTmpdir 

if not exist "%CATALINA_HOME%\bin\tomcat-juli.jar" goto noJuli  如果不存在tomcat-juli.jar這個類,轉到noJuli位置 
set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager - Djava.util.logging.config.file="%CATALINA_BASE%\conf \logging.properties"  如果存在,将變量加入到JAVA_OPTS裡 
:noJuli 


set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -Dfile .encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config  設定JAVA_OPTS變量 

echo Using CATALINA_BASE:   %CATALINA_BASE%     輸出CATALINA_BASE變量值 
echo Using CATALINA_HOME:   %CATALINA_HOME%     輸出CATALINA_HOME變量值 
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% 輸出CATALINA_TMPDIR變量值 
if ""%1"" == ""debug"" goto use_jdk        如果變量%1裡存在debug ,轉到use_jdk位置 
echo Using JRE_HOME:        %JRE_HOME%     輸出JRE_HOME變量值 
goto java_dir_displayed      轉到java_dir_displayed 
:use_jdk 
echo Using JAVA_HOME:       %JAVA_HOME%    輸出JAVA_HOME變量值 
:java_dir_displayed 
                        下面幾行設定相應變量 
set _EXECJAVA=%_RUNJAVA%        
set MAINCLASS=org.apache.catalina.startup.Bootstrap 
set ACTION=start 
set SECURITY_POLICY_FILE= 
set DEBUG_OPTS= 
set JPDA= 

if not ""%1"" == ""jpda"" goto noJpda 
set JPDA=jpda 
if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport 
set JPDA_TRANSPORT=dt_shmem 
:gotJpdaTransport 
if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress 
set JPDA_ADDRESS=jdbconn 
:gotJpdaAddress 
if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend 
set JPDA_SUSPEND=n 
:gotJpdaSuspend 
if not "%JPDA_OPTS%" == "" goto gotJpdaOpts 
set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
:gotJpdaOpts 
shift 
:noJpda 

if ""%1"" == ""debug"" goto doDebug    如果%1為debug,轉到doDebug,運作debug模式 
if ""%1"" == ""run"" goto doRun        如果%1為run,轉到doRun,運作正常模式 
if ""%1"" == ""start"" goto doStart    如果%1為start,轉到doStart,啟動tomcat 
if ""%1"" == ""stop"" goto doStop      如果%1為stop,轉到doStop,關閉tocmat 
if ""%1"" == ""version"" goto doVersion 如果%1為version,轉到doVersion,顯示tomcat的版本号 

echo Usage:  catalina ( commands ... ) 如果%1沒有上述内容,輸出下面幾行,并結束 
echo commands: 
echo   debug             Start Catalina in a debugger 
echo   debug -security   Debug Catalina with a security manager 
echo   jpda start        Start Catalina under JPDA debugger 
echo   run               Start Catalina in the current window 

echo   run -security     Start in the current window with security manager 
echo   start             Start Catalina in a separate window 
echo   start -security   Start in a separate window with security manager 
echo   stop              Stop Catalina 
echo   version           What version of tomcat are you running? 
goto end 

:doDebug 
shift                    将%2裡的值轉到%1 
set _EXECJAVA=%_RUNJDB%  将變量 _EXECJAVA設為_RUNJDB變量的值 
set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share"  
設定DEBUG_OPTS變量 

if not ""%1"" == ""-security"" goto execCmd    
如果%1不為-security,轉到execCmd位置 

shift       将%2裡的值轉到%1 
echo Using Security Manager       輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy 
設定SECURITY_POLICY_FILE變量的值 

goto execCmd     轉到execCmd位置 

:doRun 
shift        将%2裡的值轉到%1 
if not ""%1"" == ""-security"" goto execCmd   如果%1不為-security,轉到execCmd位置 
shift        将%2裡的值轉到%1 
echo Using Security Manager   輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy 
設定SECURITY_POLICY_FILE變量的值 

goto execCmd  轉到execCmd位置 

:doStart 
shift        将%2裡的值轉到%1 
if not "%OS%" == "Windows_NT" goto noTitle  如果OS變量不為Windows_NT,轉到noTitle 
set _EXECJAVA=start "Tomcat" %_RUNJAVA%       設定_EXECJAVA變量的值 
goto gotTitle      轉到gotTitle位置 
:noTitle 
set _EXECJAVA=start %_RUNJAVA%    設定 _EXECJAVA 變量的值 
:gotTitle               
if not ""%1"" == ""-security"" goto execCmd   如果%1不為-security,轉到execCmd位置 
shift                    将%2裡的值轉到%1 
echo Using Security Manager        輸出該行 
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy   
設定SECURITY_POLICY_FILE變量的值 

goto execCmd       轉到execCmd位置 

:doStop 
shift                 将%2裡的值轉到%1 
set ACTION=stop       将ACTION的變量設為stop 
set CATALINA_OPTS=    設CATALINA_OPTS為空 

goto execCmd          轉到execCmd位置 

:doVersion            顯示tomcat版本号 
%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\catalina.jar" org.apache.catalina.util.ServerInfo   執行該指令 
goto end              結束該程式 

:execCmd           
rem Get remaining unshifted command line arguments and save them in the 
以下幾行将指令參數存入CMD_LINE_ARGS變量中 

set CMD_LINE_ARGS= 
:setArgs 
if ""%1""=="""" goto doneSetArgs 
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 
shift 
goto setArgs 
:doneSetArgs 

rem Execute Java with the applicable properties 
if not "%JPDA%" == "" goto doJpda        如果JPDA變量不為空,轉到doJpda位置 
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity 
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurity位置 

如果都沒有執行下面指令,并結束該程式 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doSecurity        執行下面指令,并結束該程式 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doJpda   
如果SECURITY_POLICY_FILE變量不為空,轉到doSecurityJpda位置,為空執行下面指令,并結束該程式   

if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 
:doSecurityJpda  執行下面指令,并結束該程式 
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 
goto end 

:end 

           

終結:

catalina.bat咋一看還以為是什麼windows程式,可以輕按兩下運作,實際上就是調用java指令運作Bootstrap類。從上面代碼可以看 出tomcat确實是一個純java的程式,腳本最後都變成直接使用java指令執行程式,與我們普通寫的java程式,沒有什麼不同。隻不過由于 tomcat可以使用各種衆多的模式(如debug,Security等),以及各種需要各種參數是以不得不使用腳本來執行。

如果你想看看你到底使用了什麼指令可以在if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity這行下面添加兩行。 echo %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dir ....(下面那段,是一行但太長,折行了) pause 第一行的指令是列印這具話,系統會将% %裡面的變量提換成找到的值并輸出。第二行是暫停程式,你可以通過任意鍵來恢複運作。 下面是我的程式列印的結果:

ini複制代碼start "Tomcat" "C:\Program Files\Java\jdk1.6.0_01\bin\java"  -
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -
Djava.util.logging.config.file="C:\work\tomcat\conf\logging.properties" -Xms128m -Xmx512m -
Dfile.encoding=UTF8 -Duser.timezone=GMT -
Djava.security.auth.login.config=C:\work\tomcat/conf/jaas.config   -
Djava.endorsed.dirs="C:\work\tomcat\common\endorsed" -classpath "C:\Program 
Files\Java\jdk1.6.0_01\lib\tools.jar;C:\work\tomcat\bin\bootstrap.jar" -
Dcatalina.base="C:\work\tomcat" -Dcatalina.home="C:\work\tomcat" -
Djava.io.tmpdir="C:\work\tomcat\temp" org.apache.catalina.startup.Bootstrap  start 

           

start "tomcat"是另開一個視窗,視窗名是tomcat的意思,你可以去掉這部分,完将你程式列印的拷貝到指令行下,點回車,看是不是一樣運作 tomcat了。Catalina.bat startup實際時就将各種系統變量加以總結,輸出成這個指令。

繼續閱讀