這篇文章主要介紹“Tomcat環(huán)境怎么搭建”,在日常操作中,相信很多人在Tomcat環(huán)境怎么搭建問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Tomcat環(huán)境怎么搭建”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站專注于泰山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供泰山營(yíng)銷型網(wǎng)站建設(shè),泰山網(wǎng)站制作、泰山網(wǎng)頁(yè)設(shè)計(jì)、泰山網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造泰山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供泰山網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
No.1 搭建環(huán)境
1.1、下載tomcat源碼
進(jìn)入tomcat官網(wǎng):https://tomcat.apache.org/ 下載對(duì)應(yīng)版本的源碼
1.2、導(dǎo)入Eclipse
新建一個(gè)Java項(xiàng)目
將Tomcat源碼包中的java目錄下的文件拷貝到src目錄
導(dǎo)入外部依賴包
ant.jar ecj-4.4.jar jaxrpc.jar wsdl4j-1.5.2.jar
No.2 Tomcat頂層結(jié)構(gòu)
上圖大概展示了tomcat的結(jié)構(gòu),主要包括如下幾個(gè)模塊:
Server:
服務(wù)器的意思,代表整個(gè)tomcat服務(wù)器,一個(gè)tomcat只有一個(gè)Server;
Service:
Server中的一個(gè)邏輯功能層,一個(gè)Server可以包含多個(gè)Service;
Connector:
稱作連接器,是Service的核心組件之一,一個(gè)Service可以有多個(gè)Connector,主要是連接客戶端請(qǐng)求;
Container:
Service的另一個(gè)核心組件,按照層級(jí)有Engine,Host,Context,Wrapper四種,一個(gè)Service只有一個(gè)Engine,其主要作用是執(zhí)行業(yè)務(wù)邏輯;
Jasper:
JSP引擎;
Session:
會(huì)話管理;
No.3 Server
Server是Tomcat最頂層的容器,代表著整個(gè)服務(wù)器,即一個(gè)Tomcat只有一個(gè)Server,Server中包含至少一個(gè)Service組件,用于提供具體服務(wù)。
這個(gè)在配置文件中也得到很好的體現(xiàn)(port=”8005” shutdown=”SHUTDOWN”是在8005端口監(jiān)聽(tīng)到”SHUTDOWN”命令,服務(wù)器就會(huì)停止)。
tomcat中定義了一個(gè)Server接口,其聲明如下:
public interface Server extends Lifecycle {
它繼承了Lifecycle接口,這樣當(dāng)調(diào)用start()和stop()方法時(shí),所有已定義的Services也會(huì)啟動(dòng)或停止。
它的標(biāo)準(zhǔn)實(shí)現(xiàn)是:org.apache.catalina.core.StandardServer 類。
Server元素表示整個(gè)Catalina servlet容器。
它的屬性代表整個(gè)servlet容器的特征。
服務(wù)器可能包含一個(gè)或多個(gè)服務(wù),以及***命名資源集。
它的具體實(shí)現(xiàn)應(yīng)該在其構(gòu)造函數(shù)中使用ServerFactory類注冊(cè)(singleton)實(shí)例。
No.4 Service
前面我們講過(guò),一個(gè)Server至少包含一個(gè)Service組件來(lái)提供具體的服務(wù)。
那Service的基本功能大致是接收客戶端的請(qǐng)求,然后解析請(qǐng)求,完成相應(yīng)的業(yè)務(wù)邏輯,然后把處理后的結(jié)果返回給客戶端。
一般會(huì)提供兩個(gè)節(jié)本方法,一個(gè)start打開(kāi)服務(wù)Socket連接,監(jiān)聽(tīng)服務(wù)端口,一個(gè)stop停止服務(wù)釋放網(wǎng)絡(luò)資源。
tomcat中定義一個(gè)Service接口,其聲明如下:
public interface Service extends Lifecycle {
一個(gè)Service是一組包含一個(gè)或多個(gè)Connectors,這些Connectors共享一個(gè)Container來(lái)處理請(qǐng)求。
Connector負(fù)責(zé)處理請(qǐng)求監(jiān)聽(tīng),Container負(fù)責(zé)處理請(qǐng)求處理
從conf/server.xml文件的配置可以知道,Service相當(dāng)于Connector和Engine組件的包裝器,將一個(gè)或者多個(gè)Connector和一個(gè)Engine建立關(guān)聯(lián)關(guān)系。在默認(rèn)的配置文件中,定義了一個(gè)叫Catalina 的服務(wù),它將HTTP/1.1和AJP/1.3這兩個(gè)Connector與一個(gè)名為Catalina 的Engine關(guān)聯(lián)起來(lái)。
一個(gè)Server可以包含多個(gè)Service(它們相互獨(dú)立,只是公用一個(gè)JVM及類庫(kù)),一個(gè)Service負(fù)責(zé)維護(hù)多個(gè)Connector和一個(gè)Container。
No.5 Connector
Connector是連接器,用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container進(jìn)行處理,Container處理完之后在交給Connector返回給客戶端。
server.xml默認(rèn)配置了兩個(gè)Connector:
監(jiān)聽(tīng)端口8080,這個(gè)端口值可以修改,connectionTimeout定義了連接超時(shí)時(shí)間,單位是毫秒,redirectPort 定義了ssl的重定向接口,根據(jù)上述配置,Connector會(huì)將ssl請(qǐng)求轉(zhuǎn)發(fā)到8443端口。
監(jiān)聽(tīng)端口8009,AJP表示Apache Jserv Protocol,它將處理Tomcat和Apache http服務(wù)器之間的交互,此連接器用于處理我們將Tomcat和Apache http服務(wù)器結(jié)合使用的情況,如在同一臺(tái)物理Server上部署一個(gè)Apache http服務(wù)器和多臺(tái)Tomcat服務(wù)器,通過(guò)Apache服務(wù)器來(lái)處理靜態(tài)資源以及
Connector在tomcat中的設(shè)計(jì)大致如下:
Connector使用ProtocolHandler來(lái)處理請(qǐng)求的,不同的ProtocolHandler代表不同的連接類型
ProtocolHandler由包含了三個(gè)部件:Endpoint、Processor、Adapter
Endpoint由于是處理底層的Socket網(wǎng)絡(luò)連接,因此Endpoint是用來(lái)實(shí)現(xiàn)TCP/IP協(xié)議的
Processor用于將Endpoint接收到的Socket封裝成Request,Processor用來(lái)實(shí)現(xiàn)HTTP協(xié)議的
Adapter充當(dāng)適配器,用于將Request轉(zhuǎn)換為ServletRequest交給Container進(jìn)行具體的處理
No.6 Container
Container 用于封裝和管理 Servlet,以及具體處理 Request 請(qǐng)求,在Container內(nèi)部包含了4個(gè)子容器,4個(gè)子容器的作用分別是:
Engine:
引擎,用來(lái)管理多個(gè)站點(diǎn),一個(gè)Service最多只能有一個(gè)Engine;
Host:
代表一個(gè)站點(diǎn),也可以叫虛擬主機(jī),通過(guò)配置Host就可以添加站點(diǎn);
Context:
代表一個(gè)應(yīng)用程序,對(duì)應(yīng)著平時(shí)開(kāi)發(fā)的一套程序,或者一個(gè)WEB-INF目錄以及下面的web.xml文件;
Wrapper:
每一Wrapper封裝著一個(gè)Servlet;
No.7 tomcat啟動(dòng)流程
tomcat的啟動(dòng)流程很標(biāo)準(zhǔn)化,入口是BootStrap,統(tǒng)一按照生命周期管理接口Lifecycle的定義進(jìn)行啟動(dòng)。
首先,調(diào)用init()方法逐級(jí)初始化,接著調(diào)用start()方法進(jìn)行啟動(dòng),同時(shí),每次調(diào)用伴隨著生命周期狀態(tài)變更事件的觸發(fā)。
org.apache.catalina.startup.Bootstrap的程序入口main方法,具體實(shí)現(xiàn)如下:
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的初始化方法,具體實(shí)現(xiàn)如下:
public void init() throws Exception { // 1、設(shè)置catalina.home的配置:將catalina.home系統(tǒng)屬性設(shè)置為當(dāng)前工作目錄(如果尚未設(shè)置)。 setCatalinaHome(); // 2、設(shè)置catalina.base的配置:如果沒(méi)有設(shè)置的話,將當(dāng)前的工作目錄為了catalina.base的設(shè)置 setCatalinaBase(); // 3、初始化類加載器:commonLoader、catalinaLoader、sharedLoader initClassLoaders(); Thread.currentThread().setContextClassLoader(catalinaLoader); SecurityClassLoad.securityClassLoad(catalinaLoader); // 加載我們的啟動(dòng)類并調(diào)用其process()方法 if (log.isDebugEnabled()) log.debug("Loading startup class"); //4、加載啟動(dòng)類 Class> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina"); //5、實(shí)例化啟動(dòng)類 Object startupInstance = startupClass.newInstance(); if (log.isDebugEnabled()) log.debug("Setting startup class properties"); //6、設(shè)置方法參數(shù) 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、調(diào)用啟動(dòng)類的setParentClassLoader方法設(shè)置共享擴(kuò)展類加載器 method.invoke(startupInstance, paramValues); catalinaDaemon = startupInstance; }
org.apache.catalina.startup.Bootstrap的start()方法,具體實(shí)現(xiàn)如下:
/** * Start the Catalina daemon. */ public void start() throws Exception { // 如果啟動(dòng)類為實(shí)例化,則調(diào)用init()方法 if( catalinaDaemon==null ) init(); //獲取啟動(dòng)類的start方法 Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null); //調(diào)用啟動(dòng)類的start方法,即調(diào)用org.apache.catalina.startup.Catalina的start()方法 method.invoke(catalinaDaemon, (Object [])null); }
到此,關(guān)于“Tomcat環(huán)境怎么搭建”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!