淺談JavaWeb發展


       真的認認真真了解JavaWeb的發展,還是因為突然幫朋友弄個沒什么功能的小網站時的突然奇想。但是上來就搭SSM的框架,搭到一半卻想起來沒什么功能那么麻煩干嘛。干脆不用框架,可是又蒙了,不用框架怎么寫。記得用servlet,又忘了怎么用。我想我是不是被框架束縛了?回顧了一下servlet,也回顧了一下JavaWeb發展。

靜態頁面時代

       說道JavaWeb開發的發展歷程,就不得不去提起Web的發展歷史進程。當然,這些我也是通過資料了解的。網站剛剛發展的時候,全部都是靜態的。這里的靜態是指全部都是事先編輯好的,不能夠更改的。網頁難以避免的就是各種各樣的請求,這里就提一下當時一個請求是如何返回結果的。例如一張圖片,server端的HTTP Server收到請求之后先根據路徑查找圖片,然后read,再把圖片數據發送給客戶端,客戶端顯示。缺點顯而易見:訪問路徑必須是真是存在服務器特定目錄,而且動態展示也是做不到的。就像你在博客園發布了一篇文章,想立刻在首頁看到是沒可能的,只能重新動手編輯首頁,加入鏈接。

CGI時代
   靜態網站是十分不便的,那么動態展示頁面是怎么做到的。CGI就解決了這個問題。
CGI全稱是通用網關接口(Common Gateway Interface),是一種Web應用規范。它是一個可執行的程序或者可運行的腳本,幾乎所有的語言都能夠寫CGI,甚至是Shell。下面一段代碼,經過編譯成可執行程序后,就是一個CGI。當瀏覽器發送一個CGI請求后,服務器會啟動一個進程運行CGI程序或腳本,由CGI來處理數據,並將結果返回給服務器,服務器再將結果返回給瀏覽器。例如一個表單,其中action=“***.cgi”。作用是將表單提交的信息直接打印出來。CGI的特點:由Http Server喚起。常見的Http Server如Apache,Lighttpd,nginx都支持CGI。CGI單獨啟動進程,並且每次調用都會重新啟動進程。可以用任何語言編寫,只要該語言支持標准輸入、輸出和環境變量。但是缺點,消耗資源多:每個請求都會啟動一個CGI進行,進程消耗資源15M內存的話,同時到達100個請求的話,就會占用1.5G內存。如果請求更多,資源消耗是不可想象的。慢:啟動進程本身就慢。每次啟動進程都需要重新初始化數據結構等,會變得更慢。(為了解決CGI重復啟動進程和初始化的問題,后來還出現了FastCGI,當然也沒多快)

Servlet時期
  CGI的繁榮時期,Java還沒有發展起來。當Java開始引領潮流的時候,必然會改進和借鑒之前的設計技術和思想。Servlet就是為了解決CGI的不足。最初
純Servlet開發,是在Sun公司剛剛推出JavaEE(Java企業版)時,推出了Servlet這個東西。Servlet是實現javax.servlet.Servlet接口的類。一般處理Web請求的Servlet還需要繼承javax.servlet.http.HttpServlet。其中,doGet()方法處理GET請求;doPost()方法處理POST請求。在JavaWeb服務中,需要在web.xml中配置映射關系,指定url由誰來處理,同時需要編寫一個servlet。(現在在Servlet3.0通常使用@WebServlet注解,不需要web.xml的這部分配置。)這種方式相比於CGI,雖然有了很大的改進,但是對於前端人員來說,這種形式非常非常難以開發和修改。在Servlet中可以通過挨着行輸出Html等語句來實現頁面的樣式和輸出,表現、邏輯、控制、業務全部混在Servlet類中,最多把模型層單獨寫出來。這恐怕是前端工程師的噩夢。

JSP時期-- Servlet的升級
  經過純Servlet開發的噩夢之后,Sun公司又推出(或者說是倡導)了JSP技術,全稱是Java Server Page,直白的就是可以在HTML中寫Java代碼。其實原理大致是這樣的:Web服務器識別出這是一個對JSP網頁的請求並且傳遞給JSP引擎。通過使用URL或者.jsp文件來完成。JSP引擎從磁盤中載入JSP文件,然后將它們轉化為servlet。這種轉化只是簡單地將所有模板文本改用println()語句,並且將所有的JSP元素轉化成Java代碼。JSP引擎將servlet編譯成可執行類,並且將原始請求傳遞給servlet引擎。Web服務器的某組件將會調用servlet引擎,然后載入並執行servlet類。在執行過程中,servlet產生HTML格式的輸出並將其內嵌於HTTP response中上交給Web服務器。Web服務器以靜態HTML網頁的形式將HTTP response返回到您的瀏覽器中。
總之,所有的JSP都會變成對應的Servlet來執行。這樣,至少前端工程師能工修改頁面了,並且開發比Servlet簡單得多。

JSP+JavaBean(Model1開發模式)
  在HTML代碼中寫Java代碼,方便了前端人員,但是苦了后端人員。因為表現、控制、模型、業務邏輯,依然全部混雜在JSP文件中,大段大段的HTML夾雜着Java的代碼,其中還有要做的Web的業務邏輯,這就讓人好難過。JSP基礎語法中,有一個標簽是<jsp:usebean>來實例化對應Bean類的對象,並且可以規定該對象的生命周期(request response session application)
,這樣就可以實例化對象,通過實例化對象來進行操作。后來就出現了JSP+JavaBean的模式。JavaBean是一種可重用的Java組件,它可以被Applet、Servlet、SP等Java應用程序調用.也可以可視化地被Java開發工具使用。也逐步有了些分層的意思。JSP:表現層、控制層 。JavaBean:模型層(部分業務邏輯也在JSP)

Servlet+JSP+JavaBean(Model2開發模式-MVC
  后來,有牛人發現,Servlet天生非常適合邏輯處理(因為主要是Java代碼),而JSP非常適合頁面展示(因為主要是html代碼),那么在結合Servlet和JSP各自的優缺點后,誕生了Web開發中最常用和最重要的架構設計模式:MVC,即模型(Model)、視圖(View)和控制器(Controller)。這種開發模式下,JSP頁面中就可以不用任何的<%%>語句了,包括<%=%>全部用EL表達式來代替,列表的遍歷和條件判斷等(Java中的for循環和if語句)也可以通過JSTL來代替。控制層通過Servlet來實現,獲取前台傳的參數、控制頁面跳轉,封裝對象、向前台傳輸對象或者參數。 模型層不止可以放JavaBean,還可以再分dao包負責持久層,service包負責業務邏輯層(可有可無),entity(或者pojo)負責實體類,util負責工具包,等等......MVC模式的項目邏輯也就顯而易見了:用戶訪問JSP頁面(視圖層),JSP頁面向Servlet(控制層)傳輸參數,Servlet將參數傳輸(或封裝后傳輸)給相應Service(業務邏輯層),Service調用DAO層(持久層)對應方法,DAO層操作數據庫,返回操作結果,Service返回查詢結果或操作狀態或無返回值,Servlet將查詢結果(模型)封裝成對象,返回前台(JSP),並且控制頁面跳轉,JSP回顯查詢結果或其他信息。
  簡而言之,請求發來后,會首先經過Controller層處理,需要返回的結果封裝成對象傳遞給JSP,然后JSP負責取出數據展示就夠了。這樣,后端開發人員只負責編寫Servlet,前端人員負責JSP,極大提升了開發效率。

框架時期-SSH、SSM
  有了Servlet和JSP,相當於有了武器。有了MVC,相當於有了戰術。但是武器和戰術之間還缺少一層,就是具體實施者。單純使用Servlet、JSP和MVC開發,依然會面臨諸多的問題,從而不得不去解決。框架的產生實際上是因為懶,都想着以更簡單的方式去解決問題,實際上就是通用問題對應着通用方法。於是就有了現在我們所熟知的,SSH、SSM三大框架組合。無論什么樣的框架,本質都是對遇到常見問題的抽象和封裝。萬變不離其宗,servlet才是真正的根基。我突然理解了上學時,一個老師和我說的不要太執著於框架是什么意思了。就像我們都所熟知的三大框架SSH、SSM,你保證以后不會又出現了新的框架。框架像馬鞍,給馬套上框架不是為了讓馬更舒服,而是為了騎馬的人更舒服。它,帶來最直接只是讓開發更簡單,讓項目變得靈活,同時讓coder不要那么靈活。 我們都在用輪子,造車子,然后乘車上路,可也別忘了怎么走路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM