您好,登錄后才能下訂單哦!
這篇文章主要介紹“Tomcat環境怎么搭建”,在日常操作中,相信很多人在Tomcat環境怎么搭建問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Tomcat環境怎么搭建”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
No.1 搭建環境
1.1、下載tomcat源碼
進入tomcat官網:https://tomcat.apache.org/ 下載對應版本的源碼
1.2、導入Eclipse
新建一個Java項目
將Tomcat源碼包中的java目錄下的文件拷貝到src目錄
導入外部依賴包
ant.jar ecj-4.4.jar jaxrpc.jar wsdl4j-1.5.2.jar
No.2 Tomcat頂層結構
上圖大概展示了tomcat的結構,主要包括如下幾個模塊:
Server:
服務器的意思,代表整個tomcat服務器,一個tomcat只有一個Server;
Service:
Server中的一個邏輯功能層,一個Server可以包含多個Service;
Connector:
稱作連接器,是Service的核心組件之一,一個Service可以有多個Connector,主要是連接客戶端請求;
Container:
Service的另一個核心組件,按照層級有Engine,Host,Context,Wrapper四種,一個Service只有一個Engine,其主要作用是執行業務邏輯;
Jasper:
JSP引擎;
Session:
會話管理;
No.3 Server
Server是Tomcat最頂層的容器,代表著整個服務器,即一個Tomcat只有一個Server,Server中包含至少一個Service組件,用于提供具體服務。
這個在配置文件中也得到很好的體現(port=”8005” shutdown=”SHUTDOWN”是在8005端口監聽到”SHUTDOWN”命令,服務器就會停止)。
tomcat中定義了一個Server接口,其聲明如下:
public interface Server extends Lifecycle {
它繼承了Lifecycle接口,這樣當調用start()和stop()方法時,所有已定義的Services也會啟動或停止。
它的標準實現是:org.apache.catalina.core.StandardServer 類。
Server元素表示整個Catalina servlet容器。
它的屬性代表整個servlet容器的特征。
服務器可能包含一個或多個服務,以及***命名資源集。
它的具體實現應該在其構造函數中使用ServerFactory類注冊(singleton)實例。
No.4 Service
前面我們講過,一個Server至少包含一個Service組件來提供具體的服務。
那Service的基本功能大致是接收客戶端的請求,然后解析請求,完成相應的業務邏輯,然后把處理后的結果返回給客戶端。
一般會提供兩個節本方法,一個start打開服務Socket連接,監聽服務端口,一個stop停止服務釋放網絡資源。
tomcat中定義一個Service接口,其聲明如下:
public interface Service extends Lifecycle {
一個Service是一組包含一個或多個Connectors,這些Connectors共享一個Container來處理請求。
Connector負責處理請求監聽,Container負責處理請求處理
從conf/server.xml文件的配置可以知道,Service相當于Connector和Engine組件的包裝器,將一個或者多個Connector和一個Engine建立關聯關系。在默認的配置文件中,定義了一個叫Catalina 的服務,它將HTTP/1.1和AJP/1.3這兩個Connector與一個名為Catalina 的Engine關聯起來。
一個Server可以包含多個Service(它們相互獨立,只是公用一個JVM及類庫),一個Service負責維護多個Connector和一個Container。
No.5 Connector
Connector是連接器,用于接受請求并將請求封裝成Request和Response,然后交給Container進行處理,Container處理完之后在交給Connector返回給客戶端。
server.xml默認配置了兩個Connector:
監聽端口8080,這個端口值可以修改,connectionTimeout定義了連接超時時間,單位是毫秒,redirectPort 定義了ssl的重定向接口,根據上述配置,Connector會將ssl請求轉發到8443端口。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
監聽端口8009,AJP表示Apache Jserv Protocol,它將處理Tomcat和Apache http服務器之間的交互,此連接器用于處理我們將Tomcat和Apache http服務器結合使用的情況,如在同一臺物理Server上部署一個Apache http服務器和多臺Tomcat服務器,通過Apache服務器來處理靜態資源以及負載均衡時,針對不同的Tomcat實例需要AJP監聽不同的端口。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Connector在tomcat中的設計大致如下:
Connector使用ProtocolHandler來處理請求的,不同的ProtocolHandler代表不同的連接類型
ProtocolHandler由包含了三個部件:Endpoint、Processor、Adapter
Endpoint由于是處理底層的Socket網絡連接,因此Endpoint是用來實現TCP/IP協議的
Processor用于將Endpoint接收到的Socket封裝成Request,Processor用來實現HTTP協議的
Adapter充當適配器,用于將Request轉換為ServletRequest交給Container進行具體的處理
No.6 Container
Container 用于封裝和管理 Servlet,以及具體處理 Request 請求,在Container內部包含了4個子容器,4個子容器的作用分別是:
Engine:
引擎,用來管理多個站點,一個Service最多只能有一個Engine;
Host:
代表一個站點,也可以叫虛擬主機,通過配置Host就可以添加站點;
Context:
代表一個應用程序,對應著平時開發的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件;
Wrapper:
每一Wrapper封裝著一個Servlet;
No.7 tomcat啟動流程
tomcat的啟動流程很標準化,入口是BootStrap,統一按照生命周期管理接口Lifecycle的定義進行啟動。
首先,調用init()方法逐級初始化,接著調用start()方法進行啟動,同時,每次調用伴隨著生命周期狀態變更事件的觸發。
org.apache.catalina.startup.Bootstrap的程序入口main方法,具體實現如下:
public static void main(String args[]) { if (daemon == null) { // Don't set daemon until init() has completed Bootstrap bootstrap = new Bootstrap(); try { bootstrap.init(); } catch (Throwable t) { handleThrowable(t); t.printStackTrace(); return; } daemon = bootstrap; } else { // When running as a service the call to stop will be on a new // thread so make sure the correct class loader is used to prevent // a range of class not found exceptions. Thread.currentThread().setContextClassLoader(daemon.catalinaLoader); } try { String command = "start"; if (args.length > 0) { command = args[args.length - 1]; } if (command.equals("startd")) { args[args.length - 1] = "start"; daemon.load(args); daemon.start(); } else if (command.equals("stopd")) { args[args.length - 1] = "stop"; daemon.stop(); } else if (command.equals("start")) { daemon.setAwait(true); daemon.load(args); daemon.start(); } else if (command.equals("stop")) { daemon.stopServer(args); } else if (command.equals("configtest")) { daemon.load(args); if (null==daemon.getServer()) { System.exit(1); } System.exit(0); } else { log.warn("Bootstrap: command \"" + command + "\" does not exist."); } } catch (Throwable t) { // Unwrap the Exception for clearer error reporting if (t instanceof InvocationTargetException && t.getCause() != null) { t = t.getCause(); } handleThrowable(t); t.printStackTrace(); System.exit(1); } }
org.apache.catalina.startup.Bootstrap的初始化方法,具體實現如下:
public void init() throws Exception { // 1、設置catalina.home的配置:將catalina.home系統屬性設置為當前工作目錄(如果尚未設置)。 setCatalinaHome(); // 2、設置catalina.base的配置:如果沒有設置的話,將當前的工作目錄為了catalina.base的設置 setCatalinaBase(); // 3、初始化類加載器:commonLoader、catalinaLoader、sharedLoader initClassLoaders(); Thread.currentThread().setContextClassLoader(catalinaLoader); SecurityClassLoad.securityClassLoad(catalinaLoader); // 加載我們的啟動類并調用其process()方法 if (log.isDebugEnabled()) log.debug("Loading startup class"); //4、加載啟動類 Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina"); //5、實例化啟動類 Object startupInstance = startupClass.newInstance(); if (log.isDebugEnabled()) log.debug("Setting startup class properties"); //6、設置方法參數 String methodName = "setParentClassLoader"; Class<?> paramTypes[] = new Class[1]; paramTypes[0] = Class.forName("java.lang.ClassLoader"); Object paramValues[] = new Object[1]; paramValues[0] = sharedLoader; Method method = startupInstance.getClass().getMethod(methodName, paramTypes); // 7、調用啟動類的setParentClassLoader方法設置共享擴展類加載器 method.invoke(startupInstance, paramValues); catalinaDaemon = startupInstance; }
org.apache.catalina.startup.Bootstrap的start()方法,具體實現如下:
/** * Start the Catalina daemon. */ public void start() throws Exception { // 如果啟動類為實例化,則調用init()方法 if( catalinaDaemon==null ) init(); //獲取啟動類的start方法 Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null); //調用啟動類的start方法,即調用org.apache.catalina.startup.Catalina的start()方法 method.invoke(catalinaDaemon, (Object [])null); }
到此,關于“Tomcat環境怎么搭建”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。