日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]從第一次接觸 Servlet 到之后的很長一段時間內(nèi),我都沒理解 Servlet 是個什么玩意? 為什么要有 Servlet ? 為什么要有 Servlet 容器? 啥又是 Web 容器、HTTP 服務(wù)器? 今兒咱們就來盤盤!

以下代碼相信大家都很熟悉,大學(xué)時學(xué) Java Web 都寫過這樣的代碼。

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

從第一次接觸 Servlet 到之后的很長一段時間內(nèi),我都沒理解 Servlet 是個什么玩意?

為什么要有 Servlet ?

為什么要有 Servlet 容器?

啥又是 Web 容器、HTTP 服務(wù)器?

今兒咱們就來盤盤,并且從中來看看架構(gòu)和框架的設(shè)計套路。

看完之后可能對接口、抽象會有進一步的認識。

來,上車!

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

正文

首先瀏覽器發(fā)起 HTTP 請求,像早期的時候只會請求一些靜態(tài)資源,這時候需要一個服務(wù)器來處理 HTTP 請求,并且將相應(yīng)的靜態(tài)資源返回。

這個服務(wù)器叫 HTTP 服務(wù)器。

簡單點說就是解析請求,然后得知需要服務(wù)器上面哪個文件夾下哪個名字的靜態(tài)文件,找到返回即可。

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

而隨著互聯(lián)網(wǎng)的發(fā)展,交互越發(fā)得重要,單純的靜態(tài)文件滿足不了需求。

業(yè)務(wù)變得復(fù)雜,需要我們編寫代碼來處理諸多業(yè)務(wù)。

需要根據(jù) HTTP 請求調(diào)用不同的業(yè)務(wù)邏輯來響應(yīng),但是我們的業(yè)務(wù)代碼不能跟 HTTP 服務(wù)器耦合起來。

總不能在 HTTP 服務(wù)器的具體實現(xiàn)里面來做判斷到底需要調(diào)用哪個業(yè)務(wù)類吧?

這就把非業(yè)務(wù)和業(yè)務(wù)強相關(guān)了。

所以需要做一層抽象,將 HTTP 的解析和具體的業(yè)務(wù)隔離。

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

本質(zhì)上的需求就是根據(jù) HTTP 請求找到對應(yīng)的業(yè)務(wù)實現(xiàn)類然后執(zhí)行邏輯再返回。

業(yè)務(wù)千千萬,所以需要規(guī)定一個接口,所以業(yè)務(wù)類都實現(xiàn)這個接口這樣才好對接。

這就是接口的含義,就像 USB。

這個接口就是 Servlet,當然這是最狹義的解釋。

Servlet 其實是 Server Applet,全稱 Java Servlet,指的是用Java 編寫的服務(wù)端程序。

其實指代的是實現(xiàn) Servlet 接口的那些業(yè)務(wù)類。

這就是 Servlet 的由來。

而 Servlet 容器其實就是用來管理和加載這些 Servlet 類的,根據(jù) HTTP 請求找到對應(yīng)的 Servlet 類這就是 Servlet 容器要做的事情。

看到這是不是覺得還能再抽一層?因為這好像也和具體的業(yè)務(wù)實現(xiàn)沒關(guān)系?

是的,還能抽一層。

沒必要把 Servlet 容器做的事情和具體的業(yè)務(wù)耦合起來,業(yè)務(wù)反正照著 Servlet 接口實現(xiàn)就行,這樣 Servlet 容器就可以加載它和管理它。

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

把請求和哪個 Servlet 對應(yīng)關(guān)系也抽象出來,就是 web.xml 了,咱們在配置里面告訴 Servlet 容器對應(yīng)關(guān)系即可。

我圖中的業(yè)務(wù)實現(xiàn)其實對應(yīng)的就是我們平常的?war 包,這就是業(yè)務(wù)和?Servlet?容器的解耦。

想必你也聽過 Servlet 規(guī)范,其實 Servlet 接口和 Servlet 容器這一整套包括目錄命名啊啥的合起來就叫 Servlet 規(guī)范。

所有相關(guān)的中間件按照 Servlet 規(guī)范實現(xiàn),我們也按 Servlet 規(guī)范來實現(xiàn)業(yè)務(wù)代碼,這樣我們就能在不同場景選擇不同的 Web 中間件。

反正規(guī)范的目的就是為了對接方便,減少對接成本。

至此 HTTP 服務(wù)器、Servlet 、Servlet 容器想必都清晰了。

而 Web 容器其實就是 HTTP 服務(wù)器 + Servlet 容器,因為單單 Servlet 容器沒有解析 HTTP 請求、通信等相關(guān)功能。

所以把 Tomcat、Jetty 等實現(xiàn)包含了 HTTP 服務(wù)器和 Servlet 容器的功能,稱之為 Web 容器。

從我們的分析一層一層的剝離,一層一層的抽象,相信你對 Web 有了更進一步的認識,我再畫個 Tomcat 的分析圖,應(yīng)該就很清晰了。

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

從上面的一步步分析可以看出:其實架構(gòu)的設(shè)計就是一系列相關(guān)的抽象。

先是抽象出 HTTP 服務(wù),用來通信和解析協(xié)議。

再因為業(yè)務(wù)的復(fù)雜,為了不和 HTTP 服務(wù)耦合又抽象了一層 Servlet。

由 Servlet 加載和管理 Servlet ,來控制請求轉(zhuǎn)發(fā)到指定的 Servlet 實現(xiàn)類。

然后我們安心的開發(fā)業(yè)務(wù)即可。

因為抽象所以靈活易擴展,比如現(xiàn)在是 HTTP1.1 服務(wù),可以換成 HTTP 2。

現(xiàn)在用 Tomcat 來作為 Servlet 容器,也可以換成 Jetty。

現(xiàn)在用原生的實現(xiàn) Servlet 來做業(yè)務(wù),也可以換成 SpringMVC。

隨意變更,因為都抽象出來了,就很好替換,只要遵循約定的接口實現(xiàn)即可。

框架設(shè)計的一個套路

看完了架構(gòu)設(shè)計的套路,再說說框架套路。

接口和抽象類。

所有中間件設(shè)計必用的套路,當然我們自己的代碼也會這樣用。

定義一個接口來約定一些動作,能做啥做啥。

然后再定義一個抽象類來實現(xiàn)這個接口,用來實現(xiàn)一些通用的邏輯,做到代碼的復(fù)用。

然后再搞一些常用的實現(xiàn)類繼承抽象類,方便開發(fā)者的使用。

剩下的就留給開發(fā)者自行擴展即可。

然后抽象類都會使用模板方法,也就是定義執(zhí)行的流程,具體實現(xiàn)邏輯由子類自行實現(xiàn)。

這就是必用的套路。

接口約束、抽象類代碼復(fù)用、實現(xiàn)常用實現(xiàn)類方便使用、剩下的自行擴展。

拿 Servlet 舉例,首先定義 Servlet 接口。

public?interface?Servlet?{
????void?init(ServletConfig?config)?throws?ServletException;
????ServletConfig?getServletConfig();
????void?service(ServletRequest?req,?ServletResponse?res)throws?ServletException,?IOException;
????String?getServletInfo();
????void?destroy();
}

然后搞了個通用抽象類 GenericServlet,不過這個抽象類邏輯比較簡單。

public?abstract?class?GenericServlet?implements?Servlet,?ServletConfig,
????????java.io.Serializable?{
??................省略一些.............
???@Override
????public?ServletConfig?getServletConfig()?{
????????return?config;
????}
????@Override
????public?ServletContext?getServletContext()?{
????????return?getServletConfig().getServletContext();
????}
????@Override
????public?void?init(ServletConfig?config)?throws?ServletException?{
????????this.config?=?config;
????????this.init();
????}
................省略一些.....................
}

然后搞了個常用的 HttpServlet 繼承了 GenericServlet。

public?abstract?class?HttpServlet?extends?GenericServlet?{

????private?static?final?long?serialVersionUID?=?1L;

????private?static?final?String?METHOD_DELETE?=?"DELETE";
????private?static?final?String?METHOD_HEAD?=?"HEAD";
????private?static?final?String?METHOD_GET?=?"GET";
??....................
}

套路就是這么個套路,之后面試官問你接口和抽象類的問題,相信你也能答出來了。

最后

套路大家應(yīng)該都 GET 到了。

想必大家都聽過“計算機科學(xué)中的每個問題都可以用一間接層解決”。

是的,基本上所有問題抽象一層都能解決。

如果一層不夠,那就兩層。

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

長按訂閱更多精彩▼

從Servlet入手帶你看架構(gòu)和框架設(shè)計的套路

如有收獲,點個在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉