Servlet已經被很多框架深深地隱藏了起來
## Servlet + JSP
當時的Web 服務器只能處理靜態的HTML頁面,圖片,JavaScript這樣的東西,比如Apache的這個著名的Web服務器。
人類想要看一點動態的內容,比如什么留言板,購物網站等,還得靠極為難用的 CGI。
后來的Servlet一出現,CGI就被拋棄了。

著名的開源論壇軟件 Jive 就是Jsp+ Servlet的巔峰之作
其他JSP也可以當Controller,但是代碼太過冗長。JSP本質上也是Servlet,只是穿上了一層外衣,可以讓程序員們輕松寫動態頁面,實際運行的時候還是會編譯成Servlet類。
所以Servlet和JSP都生活在Servlet Container當中,所謂Container就是可以執行Servlet和JSP的一個東西,比如說Tomcat或者說Jetty
但是不論是JSP還是Servlet,能處理的只有HTTPQ請求,必須有人把HTTP請求發給他們。
一般這種事情可以讓Tomcat,Jetty來做,他們自己可以接收HTTP請求,然后轉發給JSP或者Servlet
當然Tomcat也可以從Apache那里接收HTTP請求,然后發給Servlet處理,處理完了以后再轉發給Apache,最后給到人類的瀏覽器。
這種方法雖然麻煩,但是好處在于非常靈活,擴展性好,比如一個Apache可以把請求分發給后臺多個Tomcat之一
Apache,Nginx 他們專心致志地去處理靜態內容 (HTML, JS, 圖片),Tomcat等執行業務邏輯,訪問數據庫,生成頁面返回

## 應用服務器
當應用程序開發越來越多的時候,出現了一些通用的需求,比如安全、事務、分布式等。
這些需求應用程序不愿意處理,操作系統也不愿意處理,那么的可以把這些大家都不愿意做的事給中間件來做。
所以Java搞出了一大堆規范,比如EJB,JMS,JTA等,也把Servlet和JSP合并到其中,形成了J2EE
其中EJB生活在EJBContainer中,號稱可以支持真正的分布式計算:一個EJB可以有多個實例,分布到多個服務器中,應對用戶的請求。
人們把 Servlet Container 稱為 Web Container , 和 EJB Container 一起,還有其他的一些東西,被合并到一個叫做 Application Server 當中去了。 最知名的幾個 Application Server 就是 Weblogic , WebSphere , JBoss。
國內的金蝶也實現過一個,叫做 Apusic

## 退居幕后
EJB卻是一個扶不起的阿斗,它笨重、性能低下、難于測試,昂貴。
大家紛紛開始使用框架,比如Structs,SpringMVC
在這些框架里面Servelt雖然處于一個非常重要的角色,但是通常情況下只需要配置Web.xml就可以了。
Container把HTTP請求傳遞給Servelt,但是它卻不能禽獸處理,需要傳遞給框架,框架再分派給Controller
而程序員所需要做的事情就是寫Controller,Service,DAO等
框架極大的減少了人們的工作量:
之前對于每個 HTTP 請求,程序員得手工地去解析 URL, 調用相關的 Java Bean。
現在只需要用個配置文件或者注解就可以把 URL 給映射到一個 Java 類。
之前對于 HTTP 請求中的參數, 程序員也得手工解析和驗證。
現在也可以直接映射到 Java 對象或者變量

后來出現了一個Spring Boot的東西,Servlet徹底給隱藏了。
像Tomcat和Jetty這樣的Servlet Container也被內嵌到了Spring Boot中,程序員開發的Web應用,竟然可以像一個普通的Java程序一樣從main開始運行。
## 威脅來臨
雖然Servet退居幕后,但是核心地位依然穩固,專門處理HTTP請求。
直到Netty出現,它完全不用Servlet Container,也就是說人家本來就是一個Container
Servlet只能處理HTTP,而Netty可以支持各種各樣的協議:HTTP,FTP,UDP等。
甚至還支持自定義協議。程序員完全可以自定義一套應用的RPC協議,放到Netty上運行。
Netty的底層是Java NIO,又封裝了Java NIO復雜的技術細節,可以輕松實現高性能、高可靠的網絡服務器。
所以有可能以后就是用Netty開發的服務器端,運行著眾多的Web 服務器,他們之間使用私有的協議互相調用,效率極高,性能極高。
不過目前直接使用Netty的程序員不多,雖然有不少人在使用基于Netty的Dubbo,但是Netty也被封裝隱藏起來了。