日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JAVA WEB中Servlet和Servlet容器的區別

瀏覽:160日期:2022-08-30 10:11:30

Servlet

很多同學可能跟我一樣始終沒有搞清楚到底什么是 Servlet,什么是 Servlet 容器。網上看了很多帖子,或許人家說的很清楚,但是自己的那個彎彎就是拐不過來。

想了很久說一下自己的理解。

Java web 開發中為啥要有 Servlet 呢?是否可以不要。

web開發的本質就一句話:客戶端和服務器交換數據。于是你使用 Java 的 Socket 套接字進行編程,去處理客戶端來的 tcp 請求,經過編解碼處理讀取請求體,獲取請求行,然后找到請求行對應的處理邏輯步入服務器的處理中,處理完畢把對應的結果返回給當前的 Socket 鏈接,響應完畢,關閉 Socket。

以上過程,你有沒有發現其實是兩個部分:

建立連接,傳輸數據,關閉連接,你肯定知道這些步驟不是你所開發的web服務去處理的,而是tomcat容器幫你做了這些事情。

拿到請求行之后去找對應的 url 路由,這一部分是誰做的呢?在如今 SpringBoot 橫行的時代,去配置化已經成為趨勢,編程越來越簡單導致的后果就是越來越難以理解事物最開始的樣子。還記得 SpringMVC工程中的 web.xml文件嗎?是否還記得在web.xml中有這么一段配置呢:

<servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/spring/SpringMVC-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

Spring 的核心就是一個 Servlet,它攔截了所有的請求,將請求交給 DispatcherServlet 去處理。我們再來問一遍,Servlet 到底是什么,它就是一段處理 web 請求的邏輯,并不是很高深的東西。

再來看 Java 中的 Servlet,它只是一個接口:

package javax.servlet;import java.io.IOException;public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; public String getServletInfo(); public void destroy();}

Servlet 接口規定請求從容器到達 web 服務端的規范,最重要的三個步驟是:

init():初始化請求的時候要做什么; service():拿到請求的時候要做什么; destory():處理完請求銷毀的時候要做什么。

所有實現 Servlet 的實現方都是在這個規范的基礎上進行開發。那么 Servlet 中的數據是從哪里來的呢?答案就是 Servlet 容器。容器才是真正與客戶端打交道的那一方。Servlet容器只有一個,而 Servlet 可以有多個。常見的Servlet容器Tomcat,它監聽了客戶端的請求端口,根據請求行信息確定將請求交給哪個Servlet 處理,找到處理的Servlet之后,調用該Servlet的 service() 方法,處理完畢將對應的處理結果包裝成ServletResponse 對象返回給客戶端。

Servlet 容器

上面說過,Servlet 只是一個處理請求的應用程序,光有Servlet是無法運行起來的,需要有一個 main 方法去調用你的這段 Servlet 程序才行。所以這里出現了Servlet 容器的概念。Servlet容器的主要作用是:

建立連接; 調用Servlet處理請求; 響應請求給客戶端; 釋放連接;

這上面的四步,如果是你來設計的話是否可以用一個模板方法搞定,1,3,4都是固定的步驟,不會因為請求不同而有很大的變化。2卻會因為對應的請求不同需要業務邏輯自己去實現不同的處理。所以這里抽象出來了 Servlet,Servlet想怎么玩就怎么玩,這是你自己的事情。容器幫你做的是你不想做的臟活累活。

另外,既然叫做容器肯定是能裝多個Servlet,并且可以管理Servlet的聲明周期。這些功能應該是容器必備的。

上面提到了 web.xml 中的 DispatcherServlet,它是 Spring 中定義的一個 Servlet,實現了 Servlet 接口,本質也是一個 Servlet。只是它是 HttpServlet 的繼承者,主要處理 http 請求。所以 Spring 程序本質是就是一個 Servlet。SpringMVC 幫你做了本該你去實現的邏輯,你看不到并不代表它不是。

好啦,以上通俗的語言解釋了什么是 Servlet,什么是 Servlet 容器,以及 Servlet 和 Servlet 容器之間的關系。

Tomcat

Tomcat是啥呢?本質上是一個 Servlet 容器,實現了對 Java Servlet 規范的支持。同時 Tomcat 也提供了處理HTTP請求的能力,所以也可以作為一個Web服務器。了解到Tomcat有 Web服務器和 Servlet容器的功能,那么 Tomcat總體是如何設計的呢?我們來看一張簡圖:

JAVA WEB中Servlet和Servlet容器的區別

Java web 應用如果部署到 Tomcat 中,一個Tomcat就表示一個服務。一個 Server 服務器可以包含多個 Service 服務,Tomcat 默認的 Service 服務是 Catalina,而一個 Service 服務可以包含多個連接器,因為 Tomcat 支持多種網絡協議,包括 HTTP/1.1、HTTP/2、AJP 等等,一個 Service 服務還會包括一個容器,容器外部會有一層 Engine 引擎所包裹,負責與處理連接器的請求與響應,連接器與容器之間通過 ServletRequest 和 ServletResponse 對象進行交流。

Tomcat容器的設計提現在一個核心文件中:server.xml。這個文件充分展示了Tomcat的高度抽象設計:

<Server port='8005' shutdown='SHUTDOWN'> <Service name='Catalina'> <Connector port='8080' protocol='HTTP/1.1' connectionTimeout='20000' redirectPort='8443'/> <Connector port='8009' protocol='AJP/1.3' redirectPort='8443'/><Engine name='Catalina' defaultHost='localhost'> <Host name='localhost' appBase='webapps' unpackWARs='true' autoDeploy='true'> </Host> </Engine> </Service></Server>

其中:

1. Server 組件是管理 tomcat 實例的組件,可以監聽一個端口,從此端口上可以遠程向該實例發送 shutdown 關閉命令。

2. Service 組件是一個邏輯組件,用于綁定 connector 和 container,有了 service 表示可以向外提供服務,就像是一般的 daemon 類服務的 service。可以認為一個 service 就啟動一個JVM,更嚴格地說,一個 engine 組件才對應一個 JVM (定義負載均衡時,jvmRoute 就定義在 Engine 組件上用來標識這個 JVM ),只不過 connector 也工作在 JVM 中。

小故事:

是否關注到 Service name = Catalina,實際上 Tomcat 的前身就是 Catalina,這是一個島的名字,而

Catalina 只是一個 Servlet 容器,為Servlet和 JavaServer Pages(JSP)實現了Sun Microsystems的規范。

Tomcat 的作者 詹姆斯·鄧肯·戴維森,Sun Microsystems 的軟件架構師在后來 Sun Microsystems 向 Apache Software Foundation 捐贈該項目中發揮了重要作用。當時他認為許多開源項目都有與 O’Reilly 相關的書籍,封面上有動物,所以他想以動物命名。后來這位老哥想到了貓🐈。他認為這只動物代表著某種可以自己生存的東西,當2003年 O’Reilly 發行帶有雪豹的 Tomcat 書籍時,他希望看到動物封面的愿望終于實現了。

3. Connector 組件是監聽組件,它有四個作用:

開啟監聽套接字,監聽外界請求,并和客戶端建立 TCP 連接; 使用 protocolHandler 解析請求中的協議和端口等信息,如 http 協議、AJP 協議; 根據解析到的信息,使用 processer 將分析后的請求轉發給綁定的 Engine; 接收響應數據并返回給客戶端。

上面的 server.xml 配置我們能看到有兩個 Connector。

<Connector port='8080' protocol='HTTP/1.1' connectionTimeout='20000' redirectPort='8443'/>

這個 Connector 表示通過 8080 端口使用 HTTP/1.1版本的協議來訪問 Tomcat。

我們知道 80 端口是為 HTTP(HyperText Transport Protocol) 即 超文本傳輸協議 開放的,主要用于萬維網傳輸信息的協議。而我們一般在 Tomcat 中監聽的是一個非 80 端口。那為啥不直接在 Tomcat 中寫上 80 端口,即所有 HTTP 請求都可以收到。這是因為在生產環境中,一般不會直接暴露原始服務給外網,一方面是安全性,另一方面是 負載均衡處理 和 靜態資源處理。所以會在原始服務上加一層代理,代理來監聽 80 端口,再將服務暴露端口的請求轉發給對應服務。

第二個 Connector:

<Connector port='8009' protocol='AJP/1.3' redirectPort='8443'/>

這個 Connector 監聽 8009 端口的 AJP 協議連接。AJP 協議負責和其他的 HTTP 服務器(如 Apache )建立連接;在把 Tomcat 與其他 HTTP 服務器集成時,就需要用到這個連接器。之所以使用 Tomcat 和其他服務器集成,是因為 Tomcat 可以用作 Servlet/JSP 容器,但是對靜態資源的處理速度較慢,不如 Apache 和 IIS 等 HTTP 服務器。因此常常將 Tomcat 與 Apache 等集成,前者作 Servlet 容器,后者處理靜態資源,而 AJP 協議便負責 Tomcat 和 Apache 的連接。

Container 表示一類組件,在配置文件(server.xml)中沒有體現出來。它包含4個容器類組件:Engine容器、Host容器、Context容器 和 wrapper容器。

Engine 容器用于從 Connector 組件處接收已建立的 TCP 連接,還用于接收客戶端發送的 HTTP 請求并分析請求,然后按照分析的結果將相關參數傳遞給匹配出的虛擬主機。Engine 還用于指定默認的虛擬主機。

Host 容器定義虛擬主機,對應了服務器中一個網絡名實體(如”www.baidu.com”,或IP地址”23.0.32.1”)。為了使用戶可以通過域名連接 Tomcat 服務器,這個域名應該在域名服務器已經注冊過。

比如上例中的配置:

<Host name='localhost' appBase='webapps' unpackWARs='true' autoDeploy='true'>

name=localhost 表示當前對應的請求是本機,這是因為已經配置了Nginx代理的原因,如果沒有配置代理,那么這里就必須是真實的IP 或者域名。注意后面的 appBase,appBase表示當前 web資源所在的目錄。

Context 容器主要是根據 path 和 docBase 獲取一些信息,將結果交給其內的 wrapper 組件進行處理(它提供wrapper運行的環境,所以它叫上下文context)。一般來說,都采用默認的標準 wrapper 類,因此在 Context 容器中幾乎不會出現 wrapper 組件。

wrapper 容器對應 Servlet 的處理過程。它開啟 Servlet 的生命周期,根據 Context 給出的信息以及解析 web.xml 中的映射關系,負責裝載相關的類,初始化 servlet 對象 init()、執行 servlet 代碼 service() 以及服務結束時 servlet 對象的銷毀 destory()。

根據上面描述的 tomcat 組件體系結構,處理請求的大致過程其實很容易推導出來:

Client(request)-->Connector-->Engine-->Host-->Context-->Wrapper(response data)-->Connector(response header)-->Client

可以看到宏觀上 Tomcat 設計的真是非常精妙,層疊式的容器設計呈現出一種美感。Connector 和 Container 兩大組件涵蓋主要功能,這種復合組件化的設計思想我們是否可以應用在業務系統中呢。右面有空繼續分析 Tomcat 中各個模塊的設計。

以上就是JAVA WEB中Servlet和Servlet容器的區別的詳細內容,更多關于JAVA WEB Servlet和Servlet容器的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品免费不| 蜜桃视频第一区免费观看| 亚洲精品动态| 国产精品久久久久久久久免费高清 | 日韩av影院| 色爱综合网欧美| 日韩三区四区| 午夜一级在线看亚洲| 日本不卡免费高清视频在线| 日本不卡高清视频| 美女av在线免费看| 国产精品亚洲四区在线观看| 一区二区三区国产在线| 欧美成人基地| 欧美国产美女| 欧美国产免费| 国产精品igao视频网网址不卡日韩| 一本色道精品久久一区二区三区| 电影91久久久| 久久久久久婷| 国产成人精选| 美女av在线免费看| 色偷偷色偷偷色偷偷在线视频| 日本不卡在线视频| 午夜亚洲福利| 日韩精品三区四区| 国产欧美另类| 成人亚洲一区| 99精品一区| 亚洲激情另类| 日韩一区中文| 嫩草伊人久久精品少妇av杨幂 | av在线日韩| 亚洲国产专区校园欧美| 久久一区二区三区喷水| 尹人成人综合网| 中文字幕亚洲在线观看| 亚州国产精品| 国产在线观看www| 国产欧美一区二区精品久久久| 国产日本久久| 国产精品久久久久久久久久白浆 | 蜜桃91丨九色丨蝌蚪91桃色| 男女激情视频一区| 久久激五月天综合精品| 精品午夜av| 久久精品国语| 最新国产精品| 国产一区二区三区黄网站| 久久激情网站| 国产亚洲精品美女久久| 日本在线精品| 人人精品久久| 婷婷精品视频| 久久av网址| 九九综合在线| 欧美aⅴ一区二区三区视频| 亚洲高清影视| 久久av综合| 日本中文字幕不卡| 欧美综合另类| 国产欧美91| 欧美日韩一区二区综合 | 国产一区成人| 首页国产精品| 国产探花一区在线观看| 美女毛片一区二区三区四区 | 麻豆91小视频| 国产精品视频一区二区三区四蜜臂| 免费黄色成人| 精品精品99| 亚洲欧美日韩视频二区| 欧美亚洲国产一区| 婷婷激情一区| av资源亚洲| 在线天堂资源www在线污| 亚洲啊v在线| 精品国产乱码久久久| 欧美日韩亚洲一区二区三区在线| 亚洲一区日韩在线| 亚洲一区亚洲| jiujiure精品视频播放| 午夜精品久久久久久久久久蜜桃| 国内不卡的一区二区三区中文字幕| 免费在线观看精品| 亚洲一区日韩在线| 国产在线欧美| 91久久久精品国产| 欧美日韩尤物久久| 日韩欧美一区二区三区免费观看| 日韩一区精品| 日韩精品一区二区三区中文| 欧美在线观看天堂一区二区三区| 五月天久久久| 日韩二区三区在线观看| 国产乱码精品一区二区三区四区 | 亚洲精品福利| 国产欧美日韩综合一区在线播放| 欧美精品91| caoporn视频在线| 日本成人在线不卡视频| 日本亚州欧洲精品不卡| 欧美在线看片| 国内精品福利| 国产精品一二| 欧美成人亚洲| 国产精品日本一区二区不卡视频| 久久久久久久欧美精品| 国产精品97| 日韩国产欧美三级| 久久精品影视| 亚洲精品少妇| 精品视频黄色| 99视频精品全部免费在线视频| 免费人成网站在线观看欧美高清| 欧美成a人片免费观看久久五月天| 久久天堂成人| 国产精品亚洲片在线播放| 成人日韩精品| 国产精品日韩精品在线播放| 国产精品婷婷| 99成人超碰| 欧美精品99| 日本欧洲一区二区| 国产一区2区在线观看| 中文精品电影| 91久久久精品国产| 精品视频免费| 国产日韩一区二区三免费高清| 精品中文字幕一区二区三区av| 国产精久久一区二区| 日韩一区二区久久| 五月天激情综合网| 精品久久在线| 精品亚洲成人| 久久精品人人| 国产精品久久久久久久久久齐齐| 亚洲三级国产| 欧美日韩一区二区三区在线电影| 日本在线成人| 日本国产一区| 日本中文字幕一区二区| 天堂av一区| 91九色综合| 国产精品15p| 成年男女免费视频网站不卡| 精品视频在线观看网站| 高清日韩中文字幕| 精品久久福利| 好吊日精品视频| 日韩成人午夜精品| 麻豆精品久久久| 日韩电影免费网址| 亚洲作爱视频| 国产精品视频3p| 999久久久国产精品| 蜜臀va亚洲va欧美va天堂| 日韩av网站在线观看| 麻豆91小视频| 国产一区二区高清| 麻豆精品视频在线| 亚洲免费观看| 久久精品三级| 激情久久婷婷| 日本成人手机在线| 婷婷激情一区| 九九九精品视频| 免费不卡在线观看| sm捆绑调教国产免费网站在线观看 | 麻豆亚洲精品| 日韩精品永久网址| 日本aⅴ亚洲精品中文乱码| 97精品国产| 中文字幕在线看片| 欧美影院精品| 日韩免费看片| 国产精品高清一区二区| 99久久亚洲精品蜜臀| 日本色综合中文字幕| 在线一区视频| 久久在线免费| 亚洲伦乱视频| 国产精品chinese| 日韩精品欧美精品| 久久最新视频| 久久不射中文字幕| 日韩午夜免费| 91成人精品| 亚洲小说欧美另类婷婷| 蜜桃精品在线| 精品一区二区三区在线观看视频| 日韩一区二区三免费高清在线观看 | 伊人久久亚洲热| 亚洲免费中文| 99国产一区| 亚洲精品电影| 视频在线观看一区| 亚洲精品字幕| 久久激情五月婷婷| 麻豆久久久久久|