Servlet:我還活着呢!

轉自:碼農翻身(微信號:coderising)程序員

我是Servlet, 因爲不少框架把我深深地隱藏了起來,我變得彷佛可有可無了,不少人也選擇性的把我給遺忘了。 其實,我還活得好好的呢, 只不過是從前臺明星慢慢退居幕後而已。
好基友Servlet + JSPweb

想當年我剛剛誕生的時候,無數人對我趨之若鶩。數據庫

由於那個時候Web服務器只能處理靜態的HTML頁面,圖片,JavaScript這樣的東西, 好比Apache 這個著名的Web服務器。編程

人類想要看一點動態的內容,好比什麼留言板,購物網站等,還得靠極爲難用的CGI。後端

我一出生, 他們就歡呼着把CGI給拋棄,紛紛改用Java寫Servlet程序, 再後來個人好兄弟JSP問世,咱們簡直造成了絕配。瀏覽器

我負責控制,JSP負責視圖,再加上負責數據的Java Bean, MVC三駕馬車正式造成,風靡一時,想當年,著名的開源論壇軟件Jive就是咱們的巔峯之做。安全

clipboard.png
提及JSP,這小子有時候還不太服我,常常振振有詞地說:「你Servlet沒什麼了不得的,我也能夠當Controller!」服務器

JSP確實能夠當Controller, 早些年我還真的見過,一個長達6000多行的JSP,行使着Controller的職責,每當程序員要改這些代碼就膽顫心驚,叫苦連天。微信

其實JSP不知道,它本質上也就是Servlet ,JSP只不過穿了一件漂亮的外衣,給了程序員們一個輕鬆寫動態頁面的工具而已,實際運行的時候會被編譯成Servlet類, 本質上咱們是同樣的。網絡

我和JSP都生活在Servlet Container當中,Container這個詞有點高大上,可是說白了,無非就是能執行Servlet和JSP的一個東西,好比說Tomcat, 好比說Jetty。

可是不管是我仍是JSP, 咱們能處理的只是HTTP請求,必須得有人把HTTP請求轉發給咱們才能夠。

這件事情只有讓Tomcat, Jetty他們來作了,他們本身能夠接收HTTP請求,而後轉發給咱們;

他們也能夠從別人,例如Apache那裏接收HTTP請求,而後發給咱們處理,處理完了再轉發給Apache, Apache再發給人類的瀏覽器。

雖然有點麻煩, 可是這種方式確實很是靈活,各司其職,擴展性比較好,好比,一個Apache能夠把請求分發給後臺多個Tomcat中的一個。

Apache,Nginx 他們專心致志地去處理靜態內容(HTML, JS, 圖片) ,咱們這裏心無旁騖地執地執行「不講邏輯的」業務邏輯,訪問數據庫,而後生成頁面返回。

clipboard.png

Application Server

日子過得波瀾不驚,我一度認爲,這個世界就將這麼運行下去。

應用程序越開發越多,出現了一些通用的需求,好比安全,事務,分佈式等等,這些需求應用程序不肯意處理,想丟給操做系統,操做系統也不肯意處理, 那怎麼辦?

不知道是誰提了一個叫作中間件的概念: 大家不肯意作的,咱們中間件來作。

Java 世界也不敢怠慢,也搞出了一大堆的規範,像什麼EJB,JMS,JTA等等,把我和JSP也合併到其中,造成一個大「雜燴」,叫作J2EE。

其中最春風得意的就是EJB這傢伙,獨自生活在EJB Container中(又是Container!),號稱能支持真正地分佈式計算:一個EJB能夠有多個實例,分佈到多個服務器中,應對用戶的請求, 聽起來很高深的技術。

他們把Servlet Container稱爲Web Container , 和EJB Container 一塊兒,還有其餘的一些東西,被合併到一個叫作Application Server當中去了。 最知名的幾個Application Server 就是 Weblogic , WebSphere , JBoss。

國內的金蝶也實現過一個,叫作Apusic,雖然影響力不如前面那幾位,但值得讚揚。

clipboard.png
退居幕後

我和JSP都沒有料到,EJB搶了咱們的風頭,成了系統的中心, 讓咱們極爲不爽。

我和JSP豈能善罷甘休? 咱們決定抓住EJB的弱點進行反擊, 咱們和人類一個叫作Rod Johnson的聯合,讓他出面,列舉出EJB的36大罪狀,昭告天下,這些罪狀包括但不限於:笨重,性能低下,難於測試,昂貴…

EJB確實是個扶不起的阿斗, 很快就被人批得體無完膚,你們紛紛投入Rod Johnson 建立的Spring的懷抱。

我鬆了一口氣, 但是很快就發現事情不對勁,你們紛紛用起了框架! 好比Struts, SpringMVC…

在這些框架中,我雖然處於一個很是重要的角色, 可是一般狀況下只要配置一下web.xml,就能夠把我扔到一邊了。

Container 照例把HTTP請求傳遞給我,可是我卻不能親手處理,我須要傳遞給框架,框架分派給Controller,沒我什麼事了!

那些程序員們要作的事情就是寫Controller, Service , DAO這些和我八班杆子打不着的東西。

我恨框架, 可是看到程序員們寫代碼寫得那麼高興,又無話可說,畢竟框架極大地減小了他們的工做量:

以前對於每一個HTTP請求,程序員得手工地去解析URL, 調用相關的Java Bean。
如今只須要用個配置文件或者註解就能夠把URL給映射到一個Java 類。

以前對於HTTP請求中的參數, 程序員也得手工解析和驗證。
如今也能夠直接映射到Java 對象或者變量

用起來這麼簡單,他們不用纔怪。

clipboard.png
更讓人生氣的是,Rod他們後來倒騰出來一個叫作Spring Boot的東西,完全地把我給隱藏起來了!

尤爲是對於一個新手來講,甚至徹底不知道個人存在。

Tomcat和Jetty這樣的Servlet Container也很悲催,他們居然被內嵌到了Spring Boot中! 程序員開發出的Web應用,就像一個普通的Java程序同樣,從main函數開始運行。

咱們完全地退居幕後了!

不過我有義務提醒一下學習後端編程的同窗,不要一上來就學習框架,不要被框架迷住你的雙眼!

仍是應該好好看看最基本的Java Web, 就是我和個人兄弟JSP。

一鍵生成基於SSH框架的功能代碼

威脅來臨

雖然是退居幕後,可是個人核心地位依然穩固,是Java Web應用的中堅力量,我生活在Servlet Container中,專門處理HTTP請求,這麼多年難逢敵手。

直到有一天,有個叫作Netty的傢伙上門挑戰。

這個Netty竟然徹底不用Servlet Container,或者換句話說,人家本身就是一個「Container」 , 這對我來講絕對是釜底抽薪的攻擊, 我引覺得傲的Servlet 規範, Servlet API通通無論用了。

我只能處理HTTP, 但是這個Netty支持各類各樣的協議:HTTP, FTP, UDP, 它還支持實現各類各樣自定義的協議! 這就意味着程序員徹底能夠自定義一套本身應用的RPC協議,而後放到Netty上運行。

它的底層是Java NIO,又封裝了Java NIO那些複雜的底層細節,能夠輕鬆實現高性能、高可靠的網絡服務器, 這實在是太可怕了。

我彷佛看到了一個可怕的場景: 用Netty 開發的服務器端,運行着衆多的Web 服務,他們之間使用私有的協議在互相調用,效率極高,性能極高, 根本沒有Servlet, HTTP, Tomcat什麼事。

讓我稍感安慰的是,直接使用Netty的程序員們還很少,雖然說有很多人在使用基於Netty的Dubbo, 可是Netty也被封裝隱藏起來了。 我估計真正具備鑽研精神的程序員才願意去研究他吧。

相關文章
相關標籤/搜索