走進JavaWeb技術世界2:JSP與Servlet的曾經與如今

轉載自:碼農翻身
轉自: 劉欣 碼農翻身 1周前
我是Servlet, 因爲不少框架把我深深地隱藏了起來,我變得彷佛可有可無了,不少人也選擇性的把我給遺忘了。 其實,我還活得好好的呢, 只不過是從前臺明星慢慢退居幕後而已。
好基友Servlet + JSP
想當年我剛剛誕生的時候,無數人對我趨之若鶩。
由於那個時候Web服務器只能處理靜態的HTML頁面,圖片,JavaScript這樣的東西, 好比Apache 這個著名的Web服務器。
人類想要看一點動態的內容,好比什麼留言板,購物網站等,還得靠極爲難用的CGI。  
我一出生, 他們就歡呼着把CGI給拋棄,紛紛改用Java寫Servlet程序, 再後來個人好兄弟JSP問世,咱們簡直造成了絕配。
我負責控制,JSP負責視圖,再加上負責數據的Java Bean, MVC三駕馬車正式造成,風靡一時,想當年,著名的開源論壇軟件Jive就是咱們的巔峯之做。
 
添加描述
提及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, 圖片) ,咱們這裏心無旁騖地執地執行「不講邏輯的」業務邏輯,訪問數據庫,而後生成頁面返回。
 
添加描述
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,雖然影響力不如前面那幾位,但值得讚揚。
 
添加描述
退居幕後
我和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 對象或者變量
......
用起來這麼簡單,他們不用纔怪。
 
添加描述
更讓人生氣的是,Rod他們後來倒騰出來一個叫作Spring Boot的東西,完全地把我給隱藏起來了!
尤爲是對於一個新手來講,甚至徹底不知道個人存在。
Tomcat和Jetty這樣的Servlet Container也很悲催,他們居然被內嵌到了Spring Boot中! 程序員開發出的Web應用,就像一個普通的Java程序同樣,從main函數開始運行。
咱們完全地退居幕後了!
不過我有義務提醒一下學習後端編程的同窗,不要一上來就學習框架,不要被框架迷住你的雙眼!
仍是應該好好看看最基本的Java Web, 就是我和個人兄弟JSP。
威脅來臨
雖然是退居幕後,可是個人核心地位依然穩固,是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也被封裝隱藏起來了。 我估計真正具備鑽研精神的程序員才願意去研究他吧。
相關閱讀
JSP: 一個裝配工的沒落
原創: 劉欣 碼農翻身 2016-11-30
沒錯, 我就是大名鼎鼎的JSP,   服務器端「裝配工」之王。 你要是沒據說過我就實在太out了,  你要問我究竟是幹什麼的, 其實很簡單, 就是把頁面模板和數據給裝配起來, 變成HTML發送給瀏覽器, 而後你才能看到啊。
奧, 不, 我一提到裝配工之王,  那個叫PHP的已經拿着板磚怒氣衝衝的過來了,  好吧, PHP大哥, 你纔是老大,最好的編程語言, Web編程之王, 個人意思是Java 裝配之王,好吧, 消消氣。
1
黑暗歲月
遙想當年, Web編程剛剛誕生的時候, 你們只能用Perl , C語言等以CGI的方式來輸出 HTML, 那可真是一段黑暗的、可怕的歲月。
我真是不可思議CGI的小夥子是怎麼裝配網頁的,  其實也無所謂裝配, 他們就是字符串拼接而已,可憐的孩子們甚至都不知道字符串究竟是什麼含義。
有圖有真相, 看看吧:
 
添加描述
這還不涉及到人家用戶經過瀏覽器傳遞過來的參數, 那處理起來就更不容易了。
我有時候挺佩服這時候的碼農的, 用這麼低級原始的方式居然還能寫出複雜的Web網站, 實在是了不得啊。
2
服務器端動態頁面
1996年, 「惡名遠揚」的微軟推出了ASP(Active Server Page),  這個新的頁面裝配工和CGI小夥子們但是大不相同, 由於他可以支持在HTML頁面中嵌入代碼!  這下子動態的Web頁面可就輕鬆多了。
徹底能夠先用一些可視化編輯器像FrontPage, Dreamweaver 先把界面建立好, 而後碼農再其中塞入代碼。
 
添加描述
看看這張圖, 你應該能明白ASP裝配工是怎麼幹活的,  頁面看起來就像是一個html靜態文本, 被<% %>包裹的就是代碼了, 裝配工須要運行他們, 而後把產生的數據嵌入到html當中。
因爲微軟的強勢, ASP這廝可真是火了一把, 尤爲是在中國。
咱們Sun公司看到這種狀況, 天然會奮起直追, 很快我這個裝配工JSP  (Java Server Pages)就誕生了。
ASP主要用VBScript 這樣的腳本語言 ( 唉, 我估計微軟的Bill Gates實在是太喜歡VB了, 連一個腳本語言也要搞的VB很像), 我就徹底不一樣了, 我用的但是被無數人喜好的Java, 跨平臺啊。
每當我用這一點嘲笑ASP的時候, 他都會說:  「別成天在這裏亂噴了, 說來講去, 你本質上不也是一個模板嗎?   你看看你裝配的那些頁面, 代碼和HTML混雜在一塊兒, 攪的亂七八糟, 沒有任何美感。 對了,據說你有個JSP中太長了,居然爆出了沒法編譯的錯誤, 實在是太好笑了, 哈哈哈。」
ASP說的沒錯, 有個不着調的碼農把絕大部分的業務邏輯都搞到了JSP 當中, 我實在是沒法裝配, 只好報錯。
不過ASP也好不到哪裏去, 也是HTML中混雜這大量代碼。
3
標籤庫
Java 老哥最近成天給我吹MVC這個東西, 說是可以把展現和邏輯分開, 他能夠用Servlet來充當控制器,  用Java類來充當模型, 而視圖天然就是我JSP了。
我想一想確實不錯, 分開之後能阻止碼農往我這裏寫代碼, 就這麼辦吧。
可是有時候界面上顯示邏輯仍是必不可少, 因此像分支、循環這樣的控制語句不可或缺,  Java老哥建議我作一層封裝,   給碼農們提供了一套標準的,叫作JSP Standard Tag Library (JSTL)東西, JSTL 長這個樣子:
 
添加描述
這些<c: if > , <c:forEach>  就是標籤了, 寫起來略微有點囉嗦,  看起來仍是不錯的。
本質上他們都是Java 類而已, 他們能接收到你給他傳遞的參數, 進行計算,輸出HTML。
${names}是從哪裏來的?  天然是從MVC的模型那裏來的。
有些人還叫囂着JSTL徹底不夠用, 不要緊, 我開放接口給你, 你能夠擴展,定義本身的Tag library,  想怎麼寫就怎麼寫, 寫破天去我也無論。  我只要求我要裝配的頁面保持清爽, 這一點毫不妥協。
通過這麼一折騰, 我又有了嘲笑ASP的資本了, 他是不管如何也作不到這一點的, 幾年後他升級爲ASP.NET之後才扳回了一城。
4
模板引擎
雖然我三令五申 , 但仍是有碼農禁不住誘惑, 爲了省事, 直接往JSP寫大量代碼, 真是讓人頭痛。
有一天, Java世界來了兩個新傢伙,一個叫Freemaker, 一個叫Velocity,   奇怪的是不少碼農都跑去向他倆獻殷勤,讓他倆去裝配HTML頁面,  把我這正統的裝配工都拋到腦後了。
我知道挑戰者來了, 趕忙研究一下,  這一研究不打緊, 下了一跳。
首先這兩個新裝配工在模板上長的和我差很少, 不信你先看看這個Velocity 的模板:
 
添加描述
不都是定義一下控制語句, if ,  foreach 等等, 再加上 一些從模型中來的變量嘛。
可是個人JSP中能夠嵌入任何Java 語句, 而這兩個傢伙的語法很明顯是受限制的,就是爲了頁面展現用的,  碼農們想在其中編寫複雜的業務邏輯都不可能。
另外他倆能夠徹底脫離Web環境來使用,  不像我沒有Web 容器例如Tomcat, 根本玩不轉。
他們倆不只僅能夠用做MVC中的View,   還可已定義郵件模板, 用來發郵件, 能夠用做代碼模板來生成代碼,  用途比我大的多。
因爲獨立的特色, 他們還能夠作動態頁面的靜態化, 例如說有些頁面就是把數據庫的數據展現出來, 而數據變化頻率很低, 那他倆就能夠事先讀取數據庫, 把頁面的數據生成了,緩存在那裏, 等到用戶使用時能夠直接返回。
我背上開始出汗, 已經感覺到他們兩個鄙視的目光了。
選擇Freemaker 和 Velocity的碼農愈來愈多,   個人生意也愈來愈差,  回想起當年壟斷的時光,日進斗金真是好啊。
5
屌絲攪局
雖然個人裝配生意被Freemaker和Velocity搶了很多, 可是餬口徹底沒有問題。
只是我注意到了一個趨勢, 那就是這些JSP頁面裝配起來簡單了, 碼農們最喜歡寫的那些邏輯去哪兒了?
Freemaker 和 Velocity 那裏也是這樣, 你們都很詫異,  你們拋棄門戶之見,坐在一塊兒商量。
Freemaker 說: 「大家注意到沒有, 如今頁面中引用的js文件和css增多了。」
我說:「沒錯,是這樣, 難道是不少界面相關的東西都挪到javascript 和CSS中去了」
Velocity說:「據我所知, Javascript 就是一些能在瀏覽器中運行的腳本而已, 就是搞一點輔助功能,  以前你們都看不上他, 純粹一屌絲。」
(碼農翻身注: 參見《Javascript : 一個屌絲的逆襲》)
"不要小看他, 大家據說了AJAX沒有?  javascript 能夠從瀏覽器端發出異步的http 調用,  基於這一點發展起來了不少框架例如JQuery什麼的, 能夠很靈活的在瀏覽器中操做界面了"     Freemaker 果真見多識廣。 
我說:「那其實也沒什麼, 主要的裝配還得由咱們幾個在服務器端完成, javascript在瀏覽器中搞的不過是錦上添花罷了, 咱們不用擔憂了, 該吃吃該喝喝 」
輕敵是最可怕的,  裝配生意愈來愈差,  服務器端MVC 中的View  愈來愈少, 不少從瀏覽器發過來的HTTP請求根本不會到咱們這裏來進行模板和數據的裝配, 更不會有HTML返回。
這些HTTP請求調用的都是Java 接口,  這些Java 代碼直接把JSON數據直接就返回給瀏覽器了 !
我偷偷研究了一個最新式的頁面模板, 居然是一個靜態的HTML文件!  其中有個這樣的片斷:
 
添加描述
這靜態的HTML文件發到瀏覽器有什麼用處, 難不成能夠被javascript 那小子執行?
很明顯這個模板擴展了HTML的屬性, 這ng-controller="StuController" 是什麼意思? 控制器?
這ng-repeat="s in students" 和我以前的JSTL模板長的很像, 這明明應該由我或者Freemaker, Velocity來裝配啊!
而後我就看到了這個javascript函數,  它經過http調用了服務器端的接口"/students" , 而後把返回的數據直接放到了students 裏邊。
 
添加描述
我把這個靜態的HTML模板拿去給Freemaker和Velocity 看, 你們一致認爲,就是javascript那小子搗的鬼,  他徹底的繞開了咱們,居然本身在瀏覽器裏實現了MVC !     實在是可惡!
StuController函數天然是 控制器,  students 就是模型(經過http調用從服務器端得到),  視圖模板天然就是這個靜態的HTML了。
這傢伙偷偷摸摸的在瀏覽器把模板和數據裝配起來, 造成HTML呈現給用戶, 咱們都蒙在了鼓裏。
咱們怒氣衝衝的把Javascript叫來, 質問他爲何搶咱們的生意。
這個曾經的屌絲如今一副高富帥模樣, 他帶着嘲諷的語氣,居高臨下的告訴咱們:   「大家三個自大的傢伙還不知道?  新時代來了,  先後端分離了, 後端只負責提供接口以及頁面模板,我在瀏覽器中讀到頁面模板和JSON之後直接在瀏覽器中進行裝配,  沒大傢什麼事了!」
咱們三個目瞪口呆,這是時代的鉅變, 真沒想到是javascript 這傢伙攪了咱們的局, 甚至可能革了咱們的命,  我這個曾經的裝配工之王真的沒落了, 之後的日子可就很差過了。 

微信公衆號【黃小斜】大廠程序員,互聯網行業新知,終身學習踐行者。關注後回覆「Java」、「Python」、「C++」、「大數據」、「機器學習」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「筆試」、「面試」、「面經」、「計算機基礎」、「LeetCode」 等關鍵字能夠獲取對應的免費學習資料。 javascript

 

                     wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

相關文章
相關標籤/搜索