1. 結構
1.1 系統結構簡介
基礎結構劃分:C/S結構,B/S結構兩類。
技術選型劃分:Model1模型,Model2模型,MVC模型和三層架構+MVC模型。
部署方式劃分:一體化架構,垂直拆分架構,分布式架構,流動計算架構,微服務架構。
1.2 C/S結構
它指的是用戶端——伺服器的方式。其中C代表着Client,S代表着伺服器。C/S結構的系統設計圖如下:
1.3 B/S 結構
它指的是浏覽器一一伺服器的方式,其中 B 代表着Browser,S代表着伺服器。B/S結構 的系統設計圖如下:
1.4 兩種結構的差別及優略
兩種結構的差別
- 硬體環境不同,C/S 通常是建立在專用的網絡或小範圍的網絡環境上(即區域網路)且必須要安裝用戶端。而B/S 是建立在廣域網上的,适應範圍強,常用的作業系統和浏覽器就行
- B/S 結構維護更新比較簡單,而C/S 結構 維護更新相對困難
- C/S 結構比B/S 結構更安全,因為使用者群相對固定,對資訊保護更強
優略
- C/S : 是能充分發揮用戶端PC的處理能力,很多工作可以在用戶端處理後再送出給伺服器。對應的優點就是用戶端響應速度快。
- B/S 總體擁有成本低,維護友善,分布性強,開發簡單,可以不用安裝任何專門的軟體就能實作在任何地方進行操作,用戶端零維護,系統的擴充非常容易,隻要有一台能上網的電腦就能使用。
2. Tomcat
伺服器的概念非常的廣泛,它可以指代一台特殊的計算機(相比普通計算機運作更快、負載更高、價格更貴),也可以指代用于部署網站的應用。我們這裡說的伺服器,其實是web伺服器,或者應用伺服器。它本質就是一個軟體,一個應用。作用就是釋出我們的應用(工程),讓使用者可以通過浏覽器通路我們的應用。
常見的應用伺服器,請看下表:
伺服器名稱 | 說明 |
weblogic | 實作了javaEE規範,重量級伺服器,又稱為javaEE容器 |
websphereAS | 實作了javaEE規範,重量級伺服器。 |
JBOSSAS | 實作了JavaEE規範,重量級伺服器。免費的。 |
Tomcat | 實作了jsp/servlet規範,是一個輕量級伺服器,開源免費。 |
2.2 Tomcat下載下傳與安裝
Tomcat官網下載下傳位址
2.3 Tomcat 各版本所需支援
2.4 Tomcat目錄結構詳解
2.5 Tomcat 基本使用
2.5.1 啟動和停止
Tomcat 伺服器的啟動檔案在二進制檔案目錄中:
這兩個檔案就是 Tomcat 的啟動檔案。
arduino複制代碼 startup.bat #windows下啟動執行檔案
startup.sh #linux 下啟動執行檔案
Tomcat 伺服器的停止檔案也在二進制檔案目錄中:
這兩個檔案就是 Tomcat 的停止檔案。
2.5.2 啟動問題
- 啟動一閃而過
- 原因:沒有配置環境變量。
- 解決辦法:配置上 JAVA_HOME 環境變量
- Address already in use : JVM_Bind
- 原因:端口被占用
- 解決辦法:找到占用該端口的應用
- 程序不重要 :使用cmd指令:netstat -a -o 檢視pid 在任務管理器中結束占用端口的程序。
- 程序很重要 :修改自己的端口号。修改的是Tomcat 目錄下\conf\server.xml中的配置。
- 啟動産生很多異常,但能正常啟動
- 原因:Tomcat中部署着很多項目,每次啟動這些項目都會啟動。而這些項目中有啟動報異常的。
- 解決辦法:
- 能找到報異常的項目,就把它從釋出目錄中移除。
- 不能确定報異常的項目,就重新解壓一個新的Tomcat。
- tomcat控制台亂碼的解決
- 在 conf/logging.properties 檔案 将 utf-8 改成 gbk
- 其它問題
- 例如:啟動産生異常,但是不能正常啟動。此時就需要解壓一個新的Tomcat啟動,來确定是系統問題,還是Tomcat的問題。
- 是以,此時就需要具體問題,具體分析,然後再對症解決。
2.5.3 部署自己的項目
- 在 webapps 目錄下建立一個檔案夾
- 将資源放到該檔案夾裡
- 啟動 tomcat,在浏覽器位址欄中 輸入正确路徑
2.6 IDEA 內建 Tomcat 伺服器
第一步
第二步
第三步
第四步
2.7 Linux系統安裝Tomcat
2.7.1 下載下傳tomcat
進入Tomcat官網,找到對應版本點選download進入下載下傳頁面,如下圖:
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應用的建立
第一步
第二步
第三步
第四步
3.4 JavaWeb應用的部署
1)IDEA部署
第一步
第二步
第三步
2)war包釋出
第一步:使用 jar -cvf war 包的名稱 目前目錄中哪些資源要打入 war
第二步:把打好的war拷貝到tomcat的webapps目錄中
第三步:啟動服務時,tomcat會自動解壓。
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 配置虛拟目錄
虛拟目錄的配置,支援兩種方式。第一種是通過在主配置檔案中添加标簽實作。第二種是通過寫一個獨立配置檔案實作。
- 第一種方式:在server.xml的<Host>元素中加一個<Context path="" docBase=""/>元素。
- path:通路資源URI。URI名稱可以随便起,但是必須在前面加上一個 /
- 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:是否自動釋出
3.8 Tomcat 預設項配置
配置預設端口
Tomcat伺服器主配置檔案中配置着通路端口,它在配置檔案中寫的值是:8080。但是它不是Tomcat的預設端口。我們此處說的預設端口是,當使用預設值的時候,端口号可以省略。http 的預設端口是80
配置方式如下:
xml複制代碼 <Connector
port="80"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置預設應用
- 把要作為預設應用的應用,名稱改為ROOT。放到webapps目錄中。
- 寫一個獨立的配置檔案,檔案名稱為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
- 請求被發送到本機端口8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
- Engine獲得請求localhost/wsota/wsota_index.jsp,比對它所擁有的所有虛拟主機Host
- Engine比對到名為localhost的Host(即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
- localhost Host獲得請求/wsota/wsota_index.jsp,比對它所擁有的所有Context
- Host比對到路徑為/wsota的Context(如果比對不到就把該請求交給路徑名為""的Context去處理)
- path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
- Context比對到URL PATTERN為*.jsp的servlet,對應于JspServlet類
- 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法
- Context把執行完了之後的HttpServletResponse對象傳回給Host
- Host把HttpServletResponse對象傳回給Engine
- Engine把HttpServletResponse對象傳回給Connector
- 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實際時就将各種系統變量加以總結,輸出成這個指令。