欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【深入揭秘Tomcat服務(wù)器底層原理】扒下這只又愛(ài)又恨的“Tom貓”

Tomcat是什么?

Tomcat是開(kāi)源的 Java Web 應用服務(wù)器,實(shí)現了 Java EE 的部分技術(shù)規范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 Sun 公 司為企業(yè)級應用推出的標準平臺,定義了一系列用于企業(yè)級開(kāi)發(fā)的技術(shù)規范。除了上述的之外,還有 EJB、Java Mail、JPA、JTA、JMS 等,而這些都依賴(lài)具體容器的實(shí)現。

上圖對比了 Java EE 容器的實(shí)現情況,Tomcat 和 Jetty 都只提供了 Java Web 容器必需的 Servlet 和 JSP 規范,開(kāi)發(fā)者要想實(shí)現其他的功能,需要自己依賴(lài)其他開(kāi)源實(shí)現。

Glassfish 是由 sun 公司推出,Java EE 最新規范出來(lái)之后,首先會(huì )在 Glassfish 上進(jìn)行實(shí)現,所以是研究 Java EE 最新技術(shù)的首選。

最常見(jiàn)的情況是使用 Tomcat 作為 Java Web 服務(wù)器,使用 Spring 提供的開(kāi)箱即用的強大功能,并依賴(lài)其他開(kāi)源庫來(lái)完成負責的業(yè)務(wù)功能實(shí)現。

Servlet容器

Tomcat 組成

如下圖所示,主要有 Container 和 Connector 以及相關(guān)組件構成。

  • Server:指的就是整個(gè) Tomcat 服 務(wù)器,包含多組服務(wù),負責管理和 啟動(dòng)各個(gè) Service,同時(shí)監聽(tīng) 8005 端口發(fā)過(guò)來(lái)的 shutdown 命令,用 于關(guān)閉整個(gè)容器 ;
  • Service:Tomcat 封裝的、對外提 供完整的、基于組件的 web 服務(wù), 包含 Connectors、Container 兩個(gè) 核心組件,以及多個(gè)功能組件,各 個(gè) Service 之間是獨立的,但是共享 同一 JVM 的資源 ;
  • Connector:Tomcat 與外部世界的連接器,監聽(tīng)固定端口接收外部請求,傳遞給 Container,并 將 Container 處理的結果返回給外部
  • Container:Catalina,Servlet 容器,內部有多層容器組成,用于管理 Servlet 生命周期,調用 servlet 相關(guān)方法
  • Loader:封裝了 Java ClassLoader,用于 Container 加載類(lèi)文件;Realm:Tomcat 中為 web 應用程序提供訪(fǎng)問(wèn)認證和角色管理的機制;
  • JMX:Java SE 中定義技術(shù)規范,是一個(gè)為應用程序、設備、系統等植入管理功能的框架,通過(guò) JMX 可以遠程監控 Tomcat 的運行狀態(tài)
  • Jasper:Tomcat 的 Jsp 解析引擎,用于將 Jsp 轉換成 Java 文件,并編譯成 class 文件。Session:負責管理和創(chuàng )建 session,以及 Session 的持久化(可自定義),支持 session 的集群。
  • Pipeline:在容器中充當管道的作用,管道中可以設置各種 valve(閥門(mén)),請求和響應在經(jīng)由管 道中各個(gè)閥門(mén)處理,提供了一種靈活可配置的處理請求和響應的機制。
  • Naming:命名服務(wù),JNDI, Java 命名和目錄接口,是一組在 Java 應用中訪(fǎng)問(wèn)命名和目錄服務(wù)的 API。命名服務(wù)將名稱(chēng)和對象聯(lián)系起來(lái),使得我們可以用名稱(chēng)訪(fǎng)問(wèn)對象,目錄服務(wù)也是一種命名 服務(wù),對象不但有名稱(chēng),還有屬性。Tomcat 中可以使用 JNDI 定義數據源、配置信息,用于開(kāi)發(fā) 與部署的分離。

Container組成

  • Engine:Servlet 的頂層容器,包含一 個(gè)或多個(gè) Host 子容器;
  • Host:虛擬主機,負責 web 應用的部 署和 Context 的創(chuàng )建;
  • Context:Web 應用上下文,包含多個(gè) Wrapper,負責 web 配置的解析、管 理所有的 Web 資源;
  • Wrapper:最底層的容器,是對 Servlet 的封裝,負責 Servlet 實(shí)例的創(chuàng ) 建、執行和銷(xiāo)毀。

生命周期管理

Tomcat 為了方便管理組件和容器的生命周期,定義了從創(chuàng )建、啟動(dòng)、到停止、銷(xiāo)毀共 12 種狀態(tài)

tomcat 生命周期管理了內部狀態(tài)變化的規則控制,組件和容器只需實(shí)現相應的生命周期方法,即可完成各生命周期內的操作(initInternal、startInternal、stopInternal、 destroyInternal);

比如執行初始化操作時(shí),會(huì )判斷當前狀態(tài)是否 New,如果不是則拋出生命周期異常;是的話(huà)則設置當前狀態(tài)為 Initializing,并執行 initInternal 方法,由子類(lèi)實(shí)現,方法執行成功則設置當前狀態(tài)為 Initialized,執行失敗則設置為 Failed 狀態(tài);

Tomcat 的生命周期管理引入了事件機制,在組件或容器的生命周期狀態(tài)發(fā)生變化時(shí)會(huì )通知事件監聽(tīng)器,監聽(tīng)器通過(guò)判斷事件的類(lèi)型來(lái)進(jìn)行相應的操作。事件監聽(tīng)器的添加可以在 server.xml 文件中進(jìn)行配置;

Tomcat 各類(lèi)容器的配置過(guò)程是通過(guò)添加 listener 的方式來(lái)進(jìn)行的,從而達到配置邏輯與容器的解耦。如 EngineConfig、HostConfig、ContextConfig。

  • EngineConfig:主要打印啟動(dòng)和停止日志
  • HostConfig:主要處理部署應用,解析應用 META-INF/context.xml 并創(chuàng )建應用
  • Context ContextConfig:主要解析并合并 web.xml,掃描應用的各類(lèi) web 資源 (filter、servlet、listener)

Tomcat 的啟動(dòng)過(guò)程

啟動(dòng)從 Tomcat 提供的 start.sh 腳本開(kāi)始,shell 腳本會(huì )調用 Bootstrap 的 main 方法,實(shí)際調用了 Catalina 相應的 load、start 方法。

load 方法會(huì )通過(guò) Digester 進(jìn)行 config/server.xml 的解析,在解析的過(guò)程中會(huì )根據 xml 中的關(guān)系 和配置信息來(lái)創(chuàng )建容器,并設置相關(guān)的屬性。

接著(zhù) Catalina 會(huì )調用 StandardServer 的 init 和 start 方法進(jìn)行容器的初始化和啟動(dòng)。

按照 xml 的配置關(guān)系,server 的子元素是 service,service 的子元素是頂層容器 Engine,每層容器都持有自己的子容器,而這些元素都實(shí)現了生命周期管理的各個(gè)方法,因此就很容易的完成整個(gè)容器的啟動(dòng)、關(guān)閉等生命周期的管理。

StandardServer 完成 init 和 start 方法調用后,會(huì )一直監聽(tīng)來(lái)自 8005 端口(可配置)

如果接收 到 shutdown 命令,則會(huì )退出循環(huán)監聽(tīng),執行后續的 stop 和 destroy 方法,完成 Tomcat 容器的關(guān)閉。

同時(shí)也會(huì )調用 JVM 的 Runtime.getRuntime()?.addShutdownHook 方法,在虛擬機意外退出的時(shí)候來(lái)關(guān)閉容器。

所有容器都是繼承自 ContainerBase,基類(lèi)中封裝了容器中的重復工作,負責啟動(dòng)容器相關(guān)的組件 Loader、Logger、Manager、Cluster、Pipeline,啟動(dòng)子容器(線(xiàn)程池并發(fā)啟動(dòng)子容器,通過(guò)線(xiàn)程池 submit 多個(gè)線(xiàn)程,調用后返回 Future 對象,線(xiàn)程內部啟動(dòng)子容器,接著(zhù)調用 Future 對象 的 get 方法來(lái)等待執行結果)。

List<future> results = new ArrayList<future>();

for (int i = 0; i < children.length; i++) {

results.add(startStopExecutor.submit(new StartChild(children[i])));

}

boolean fail = false;

for (Futureresult :results) {

try {

result.get();

} catch (Exception e) {

log.error(sm.getString('containerBase.threadedStartFailed'), e);

fail = true;

}

}

Web 應用的部署方式

注:catalina.home:安裝目錄;catalina.base:工作目錄;默認值 user.dir

  • Server.xml 配置 Host 元素,指定 appBase 屬性,默認\$catalina.base/webapps/
  • Server.xml 配置 Context 元素,指定 docBase,元素,指定 web 應用的路徑
  • 自定義配置:在\$catalina.base/EngineName/HostName/XXX.xml 配置 Context 元素

HostConfig 監聽(tīng)了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:

  • 掃描 appbase 路徑下的所有文件夾和 war 包,解析各個(gè)應用的 META-INF/context.xml,并 創(chuàng )建 StandardContext,并將 Context 加入到 Host 的子容器中。
  • 解析$catalina.base/EngineName/HostName/下的所有 Context 配置,找到相應 web 應 用的位置,解析各個(gè)應用的 META-INF/context.xml,并創(chuàng )建 StandardContext,并將 Context 加入到 Host 的子容器中。

注:

  • HostConfig 并沒(méi)有實(shí)際解析 Context.xml,而是在 ContextConfig 中進(jìn)行的。
  • HostConfig 中會(huì )定期檢查 watched 資源文件(context.xml 配置文件)

ContextConfig 解析 context.xml 順序:

  • 先解析全局的配置 config/context.xml
  • 然后解析 Host 的默認配置 EngineName/HostName/context.xml.default
  • 最后解析應用的 META-INF/context.xml

ContextConfig 解析 web.xml 順序:

  • 先解析全局的配置 config/web.xml
  • 然后解析 Host 的默認配置 EngineName/HostName/web.xml.default 接著(zhù)解析應用的 MEB-INF/web.xml
  • 掃描應用 WEB-INF/lib/下的 jar 文件,解析其中的 META-INF/web-fragment.xml 最后合并 xml 封裝成 WebXml,并設置 Context

注:

  • 掃描 web 應用和 jar 中的注解(Filter、Listener、Servlet)就是上述步驟中進(jìn)行的。
  • 容器的定期執行:backgroundProcess,由 ContainerBase 來(lái)實(shí)現的,并且只有在頂層容器 中才會(huì )開(kāi)啟線(xiàn)程。(backgroundProcessorDelay=10 標志位來(lái)控制)

Servlet 生命周期

Servlet 是用 Java 編寫(xiě)的服務(wù)器端程序,其主要功能在于交互式地瀏覽和修改數據,生成動(dòng)態(tài) Web 內容。

  1. 請求到達 server 端,server 根據 url 映射到相應的 Servlet
  2. 判斷 Servlet 實(shí)例是否存在,不存在則加載和實(shí)例化 Servlet 并調用 init 方法
  3. Server 分別創(chuàng )建 Request 和 Response 對象,調用 Servlet 實(shí)例的 service 方法(service 方法 內部會(huì )根據 http 請求方法類(lèi)型調用相應的 doXXX 方法)
  4. doXXX 方法內為業(yè)務(wù)邏輯實(shí)現,從 Request 對象獲取請求參數,處理完畢之后將結果通過(guò) response 對象返回給調用方
  5. 當 Server 不再需要 Servlet 時(shí)(一般當 Server 關(guān)閉時(shí)),Server 調用 Servlet 的 destroy() 方 法。

load on startup

當值為 0 或者大于 0 時(shí),表示容器在應用啟動(dòng)時(shí)就加載這個(gè) servlet; 當是一個(gè)負數時(shí)或者沒(méi)有指定時(shí),則指示容器在該 servlet 被選擇時(shí)才加載; 正數的值越小,啟動(dòng)該 servlet 的優(yōu)先級越高;

single thread model

每次訪(fǎng)問(wèn) servlet,新建 servlet 實(shí)體對象,但并不能保證線(xiàn)程安全,同時(shí) tomcat 會(huì )限制 servlet 的實(shí)例數目

最佳實(shí)踐:不要使用該模型,servlet 中不要有全局變量

請求處理過(guò)程

  1. 根據 server.xml 配置的指定的 connector 以及端口監聽(tīng) http、或者 ajp 請求
  2. 請求到來(lái)時(shí)建立連接,解析請求參數,創(chuàng )建 Request 和 Response 對象,調用頂層容器 pipeline 的 invoke 方法
  3. 容器之間層層調用,最終調用業(yè)務(wù) servlet 的 service 方法
  4. Connector 將 response 流中的數據寫(xiě)到 socket 中

Pipeline 與 Valve

Pipeline 可以理解為現實(shí)中的管道,Valve 為管道中的閥門(mén),Request 和 Response 對象在管道中 經(jīng)過(guò)各個(gè)閥門(mén)的處理和控制。

每個(gè)容器的管道中都有一個(gè)必不可少的 basic valve,其他的都是可選的,basic valve 在管道中最 后調用,同時(shí)負責調用子容器的第一個(gè) valve。

Valve 中主要的三個(gè)方法:setNext、getNext、invoke;valve 之間的關(guān)系是單向鏈式結構,本身 invoke 方法中會(huì )調用下一個(gè) valve 的 invoke 方法。

各層容器對應的 basic valve 分別是 StandardEngineValve、StandardHostValve、 StandardContextValve、StandardWrapperValve。

JSP引擎

JSP 生命周期

  • 編譯階段:servlet 容器編譯 servlet 源文
  • 件,生成 servlet 類(lèi)
  • 初始化階段:加載與 JSP 對應的 servlet 類(lèi), 創(chuàng )建其實(shí)例,并調用它的初始化方法
  • 執行階段:調用與 JSP 對應的 servlet 實(shí)例的 服務(wù)方法
  • 銷(xiāo)毀階段:調用與 JSP 對應的 servlet 實(shí)例的 銷(xiāo)毀方法,然后銷(xiāo)毀 servlet 實(shí)例

JSP元素

代碼片段:<%>

JSP聲明:<%! ...=''>

JSP表達式:<%=>

JSP注釋?zhuān)?lt;%-->

JSP指令:<%@ directive='' attribute='“value”'>

JSP行為:

HTML元素:html/head/body/div/p/…

JSP隱式對象:request、response、out、session、application、config、pageContext、page、Exception

JSP 元素說(shuō)明

  • 代碼片段:包含任意量的 Java 語(yǔ)句、變量、方法或表達式;
  • JSP 聲明:一個(gè)聲明語(yǔ)句可以聲明一個(gè)或多個(gè)變量、方法,供后面的 Java 代碼使用;
  • JSP 表達式:輸出 Java 表達式的值,String 形式;
  • JSP 注釋:為代碼作注釋以及將某段代碼注釋掉
  • JSP 指令:用來(lái)設置與整個(gè) JSP 頁(yè)面相關(guān)的屬性
  • <%@ page='' ...=''>定義頁(yè)面的依賴(lài)屬性,比如 language、contentType、errorPage、 isErrorPage、import、isThreadSafe、session 等等
  • <%@ include='' ...=''>包含其他的 JSP 文件、HTML 文件或文本文件,是該 JSP 文件的一部分,會(huì )被同時(shí)編譯執行
  • <%@ taglib='' ...=''>引入標簽庫的定義,可以是自定義標簽

  • JSP 行為:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward

Jsp 解析過(guò)程

  • 代碼片段:在_jspService()方法內直接輸出
  • JSP 聲明: 在 servlet 類(lèi)中進(jìn)行輸出
  • JSP 表達式:在_jspService()方法內直接輸出
  • JSP 注釋:直接忽略,不輸出
  • JSP 指令:根據不同指令進(jìn)行區分,include:對引入的文件進(jìn)行解析;page 相關(guān)的屬性會(huì )做為 JSP 的屬性,影響的是解析和請求處理時(shí)的行為
  • JSP 行為:不同的行為有不同的處理方式,jsp:useBean 為例,會(huì )從 pageContext 根據 scope 的 類(lèi)別獲取 bean 對象,如果沒(méi)有會(huì )創(chuàng )建 bean,同時(shí)存到相應 scope 的 pageContext 中
  • HTML:在_jspService()方法內直接輸出
  • JSP 隱式對象:在_jspService()方法會(huì )進(jìn)行聲明,只能在方法中使用;

Connector

Http:HTTP 是超文本傳輸協(xié)議,是客戶(hù)端瀏覽器或其他程序與 Web 服務(wù)器之間的應用層通信協(xié) 議

AJP:Apache JServ 協(xié)議(AJP)是一種二進(jìn)制協(xié)議,專(zhuān)門(mén)代理從 Web 服務(wù)器到位于后端的應用 程序服務(wù)器的入站請求

阻塞 IO

非阻塞 IO

IO多路復用

阻塞與非阻塞的區別在于進(jìn)行讀操作和寫(xiě)操作的系統調用時(shí),如果此時(shí)內核態(tài)沒(méi)有數據可讀或者沒(méi)有緩沖空間可寫(xiě)時(shí),是否阻塞。

IO多路復用的好處在于可同時(shí)監聽(tīng)多個(gè)socket的可讀和可寫(xiě)事件,這樣就能使得應用可以同時(shí)監聽(tīng)多個(gè)socket,釋放了應用線(xiàn)程資源。

Tomcat各類(lèi)Connector對比

Connector的實(shí)現模式有三種,分別是BIO、NIO、APR,可以在server.xml中指定。

  • JIO:用java.io編寫(xiě)的TCP模塊,阻塞IO
  • NIO:用java.nio編寫(xiě)的TCP模塊,非阻塞IO,(IO多路復用)
  • APR:全稱(chēng)Apache Portable Runtime,使用JNI的方式來(lái)進(jìn)行讀取文件以及進(jìn)行網(wǎng)絡(luò )傳輸

Apache Portable Runtime是一個(gè)高度可移植的庫,它是Apache HTTP Server 2.x的核心。

APR具有許多用途,包括訪(fǎng)問(wèn)高級IO功能(如sendfile,epoll和OpenSSL),操作系統級功能(隨機數生成,系統狀態(tài)等)和本地進(jìn)程處理(共享內存,NT管道和Unix套接字)

表格中字段含義說(shuō)明:

  • Support Polling:是否支持基于IO多路復用的socket事件輪詢(xún)
  • Polling Size:輪詢(xún)的最大連接數
  • Wait for next Request:在等待下一個(gè)請求時(shí),處理線(xiàn)程是否釋放,BIO是沒(méi)有釋放的,所以在keep-alive=true的情況下處理的并發(fā)連接數有限
  • Read Request Headers:由于request header數據較少,可以由容器提前解析完畢,不需要阻塞
  • Read Request Body:讀取request body的數據是應用業(yè)務(wù)邏輯的事情,同時(shí)Servlet的限制,是需要阻塞讀取的
  • Write Response:跟讀取request body的邏輯類(lèi)似,同樣需要阻塞寫(xiě)

NIO處理相關(guān)類(lèi)

Acceptor線(xiàn)程負責接收連接,調用accept方法阻塞接收建立的連接,并對socket進(jìn)行封裝成PollerEvent,指定注冊的事件為op_read,并放入到EventQueue隊列中,PollerEvent的run方法邏輯的是將Selector注冊到socket的指定事件;

Poller線(xiàn)程從EventQueue獲取PollerEvent,并執行PollerEvent的run方法,調用Selector的select方法,如果有可讀的Socket則創(chuàng )建Http11NioProcessor,放入到線(xiàn)程池中執行

CoyoteAdapter是Connector到Container的適配器,Http11NioProcessor調用其提供的service方法,內部創(chuàng )建Request和Response對象,并調用最頂層容器的Pipeline中的第一個(gè)Valve的invoke方法

Mapper主要處理http url 到servlet的映射規則的解析,對外提供map方法

NIO Connector主要參數

Comet

Comet是一種用于web的推送技術(shù),能使服務(wù)器實(shí)時(shí)地將更新的信息傳送到客戶(hù)端,而無(wú)須客戶(hù)端發(fā)出請求

在WebSocket出來(lái)之前,如果不適用comet,只能通過(guò)瀏覽器端輪詢(xún)Server來(lái)模擬實(shí)現服務(wù)器端推送。

Comet支持servlet異步處理IO,當連接上數據可讀時(shí)觸發(fā)事件,并異步寫(xiě)數據(阻塞)

Tomcat要實(shí)現Comet,只需繼承HttpServlet同時(shí),實(shí)現CometProcessor接口

  • Begin:新的請求連接接入調用,可進(jìn)行與Request和Response相關(guān)的對象初始化操作,并保存response對象,用于后續寫(xiě)入數據
  • Read:請求連接有數據可讀時(shí)調用
  • End:當數據可用時(shí),如果讀取到文件結束或者response被關(guān)閉時(shí)則被調用
  • Error:在連接上發(fā)生異常時(shí)調用,數據讀取異常、連接斷開(kāi)、處理異常、socket超時(shí)

Note:

  • Read:在post請求有數據,但在begin事件中沒(méi)有處理,則會(huì )調用read,如果read沒(méi)有讀取數據,在會(huì )觸發(fā)Error回調,關(guān)閉socket
  • End:當socket超時(shí),并且response被關(guān)閉時(shí)也會(huì )調用;server被關(guān)閉時(shí)調用
  • Error:除了socket超時(shí)不會(huì )關(guān)閉socket,其他都會(huì )關(guān)閉socket
  • End和Error時(shí)間觸發(fā)時(shí)應關(guān)閉當前comet會(huì )話(huà),即調用CometEvent的close方法
  • Note:在事件觸發(fā)時(shí)要做好線(xiàn)程安全的操作

異步Servlet

傳統流程:

  • 首先,Servlet 接收到請求之后,request數據解析;
  • 接著(zhù),調用業(yè)務(wù)接口的某些方法,以完成業(yè)務(wù)處理;
  • 最后,根據處理的結果提交響應,Servlet 線(xiàn)程結束

異步處理流程:

  • 客戶(hù)端發(fā)送一個(gè)請求
  • Servlet容器分配一個(gè)線(xiàn)程來(lái)處理容器中的一個(gè)servlet
  • servlet調用request.startAsync(),保存AsyncContext, 然后返回
  • 任何方式存在的容器線(xiàn)程都將退出,但是response仍然保持開(kāi)放
  • 業(yè)務(wù)線(xiàn)程使用保存的AsyncContext來(lái)完成響應(線(xiàn)程池)
  • 客戶(hù)端收到響應

Servlet 線(xiàn)程將請求轉交給一個(gè)異步線(xiàn)程來(lái)執行業(yè)務(wù)處理,線(xiàn)程本身返回至容器,此時(shí) Servlet 還沒(méi)有生成響應數據,異步線(xiàn)程處理完業(yè)務(wù)以后,可以直接生成響應數據(異步線(xiàn)程擁有 ServletRequest 和 ServletResponse 對象的引用)

為什么web應用中支持異步?

推出異步,主要是針對那些比較耗時(shí)的請求:比如一次緩慢的數據庫查詢(xún),一次外部REST API調用, 或者是其他一些I/O密集型操作。這種耗時(shí)的請求會(huì )很快的耗光Servlet容器的線(xiàn)程池,繼而影響可擴展性。

Note:從客戶(hù)端的角度來(lái)看,request仍然像任何其他的HTTP的request-response交互一樣,只是耗費了更長(cháng)的時(shí)間而已

異步事件監聽(tīng)

  • onStartAsync:Request調用startAsync方法時(shí)觸發(fā)
  • onComplete:syncContext調用complete方法時(shí)觸發(fā)
  • onError:處理請求的過(guò)程出現異常時(shí)觸發(fā)
  • onTimeout:socket超時(shí)觸發(fā)

Note :

onError/ onTimeout觸發(fā)后,會(huì )緊接著(zhù)回調onComplete

onComplete 執行后,就不可再操作request和response

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Servlet/JSP深入詳解:基于Tomcat的Web開(kāi)發(fā)第一章02
Tomcat介紹
JavaWeb——Servlet
tomcate
一個(gè)計算機專(zhuān)業(yè)學(xué)生幾年的編程經(jīng)驗匯總
tomcat中catalina是什么
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久