Java作為一門程式語言,自誕生以來已經流行了20多年,在學習它之前,我們有必要先了解一下它的歷史,瞭解它是如何一步步發展到今天這個樣子。
孕育
上世紀90年代,硬體領域出現了單片式計算機系統,比如電視機機頂盒這些消費裝置。這些裝置的特點是處理能力和記憶體都有限。如果使用C++編寫程式,則對於這類裝置來說過於龐大。
所以需求便來了,為了適應這類裝置,需要一種小型的計算機語言,Java便應運而生了。
1991年,Sun公司的James Gosling, Mike Sheridan和Patrick Naughton發起了一個名為“Green”的專案小組,主要用於電視機頂盒這類消費裝置。
由於裝置的處理能力和記憶體有限,所以要求語言短小、程式碼緊湊。而對於電視機頂盒這類消費裝置來說,廠商會選擇各種不同的CPU,所以要求語言可移植、不與特定的平臺捆綁在一起。
出生
Green專案組以C++為基礎,對C++進行了一些改造,並刪除了一些不太實用、複雜繁瑣的東西,開發出了名為“Oak”的語言,(Oka來自James Gosling辦公室外的橡樹)。
成長
挫折
1992年夏天,Green專案組已經能夠演示Green作業系統、Oak的程式設計語言、類庫和其硬體。
1992年9月,Green專案組釋出了它的第一個名為“Start 7”的產品,該產品是一個個人數字助理裝置,具有圖形介面和非常智慧的遠端控制。
1992年11月,Green專案被剝離,成為Sun Microsystems的全資子公司Firstperson。
但是當時的硬體生產廠商對其專案並不感興趣,Firstperson花了一年多也沒找到希望購買其技術的買家。
1994年,First Person公司解散,被重新納入Sun公司。Oak語言無法進入市場,也被暫時擱置下來。
機遇
在上面的過程中,Internet的全球資訊網也在不斷髮展。對於客戶機/伺服器模型來說,全球資訊網需要做的是將超文字頁面轉換到螢幕的瀏覽器中。
1994年6月到7月,Sun公司的團隊看到了網際網路的發展,一些圖形Web瀏覽器的出現讓他們認為網際網路可以演變成他們為有線電視所設想的相同的高度互動性媒體。經過三天的頭腦風暴後,該團隊將目標平臺重新定位為全球資訊網平臺。
1994年中期,Oak語言的開發者意識到他們可以開發一個瀏覽器,WebRunner瀏覽器誕生。
1995年,網際網路的發展帶給了Oak語言一個機遇。當時的網路頁面是單調、死板的靜態頁面,業界希望頁面能夠“靈活”起來,並且希望程式碼能夠通過網路傳播進行跨平臺執行。Oak的語言短小、可移植的特點和這些需求不謀而合。
Sun公司首先推出了可以嵌入網頁並且可以隨同網頁在網路上傳輸的Applet(Applet是一種將小程式嵌入到網頁中進行執行的技術)。
設計者在設計WebRunner瀏覽器具有在網頁中執行內嵌程式碼的能力,這種能力能讓網頁變得“靈活”。
同年,Sun公司將Oak更名為Java(因為Oak已經被使用了,Java一詞來自咖啡),WebRunner瀏覽器也演變成了HotJava瀏覽器,HotJava瀏覽器完全使用Java開發。
同年5月23日,Sun公司在Sun World會議上展示並正式釋出了Java語言和HotJava瀏覽器,各大公司都紛紛停止了自己公司相關專案的開發,競相購買Java的使用許可證,併為自己的產品開發了相應的Java平臺。
發展
1996年初,Sun公司釋出了Java的第1個開發工具包(JDK1.0),這是Java發展的里程碑,標誌著Java成為了一種獨立的開發工具。
同年9月,約8.3萬個網頁應用了Java來製作。
同年10月,Sun公司釋出了Java平臺的第1個即時編譯器。
但是人們很快意識到Java1.0並不能用來進行真正的應用開發。
1997年2月,JDK1.1面世,它彌補了JDK1.0的大多明顯缺陷,改進了反射能力,但是仍有侷限性。
1998年12月,Sun公司釋出了第二代Java平臺——JDK1.2。此次釋出有幾個不同的版本,分別是標準版J2SE、用於手機等嵌入式裝置的微型版J2ME、用於伺服器端處理的企業版J2EE。
此次釋出是Java發展過程中最重要的里程碑,標誌著Java的應用開始普及。
2000年5月,JDK1.3、JDK1.4、J2SE1.3相繼釋出。
2001年9月,J2EE1.3釋出。
2002年2月,J2SE1.4釋出。該版本提高了Java的計算能力,擴充套件了標準類庫,提高了系統效能。
在此期間,Java Applet採用低調姿態,淡化了客戶端的應用,成為伺服器端應用的首選平臺。
2004年9月,J2SE 1.5版本釋出,該版本為重大更新,是自1.1版本以來第一個對Java語言做出重大改進的版本。JavaOne會議後,版本數字從1.5改為5.0。
2005年6月,Java SE 6釋出。版本名稱發生了改變,如J2SE改為Java SE、J2ME改為Java ME、J2EE改為Java EE。該版本沒有對語言方面再進行改進,但是改進了其他效能,增強了類庫。
2006年11月,Sun公司將Java技術作為免費軟體對外發布。
2007年3月起,全世界所有開發人員均可對Java原始碼進行修改。
隨著資料中心越來越依賴於商業硬體而不是專用伺服器,Sun公司在2009年被Oracle收購。
2011年,Oracle釋出Java SE 7。
2014年,Java SE 8釋出,近20年以來,該版本有了最大改變,Java 8提供了一種“函式式”程式設計方式,可以很容易地表述併發執行的計算。
2017年,Java SE 9釋出。
Java 9之後,Oracle宣佈每6月更新一次版本。
2020年3月,Java SE 14釋出。
Java Web的發展
Java一路走來,為了適應時代發展,做出了許多改變。
在早期,Java是為了解決傳統的單機程式設計問題,但由於種種原因,Java後來轉向Web。
Web的最初模樣
Web為了提供互動性內容採取了客戶端/伺服器系統,但是互動性完全由伺服器提供。伺服器產生靜態頁面,這些靜態頁面是事先寫好的,將其提供給能夠解釋並顯示的客戶端瀏覽器。
但是我們的需求是千變萬化的,事先寫好的靜態頁面肯定不能滿足我們日益增長的需求。
CGI
CGI(Common Gateway Interfa,通用閘道器介面),它是一段程式,執行在伺服器上,提供同客戶端HTML頁面的介面,通俗的講CGI就像是一座橋,把網頁和WEB伺服器中的執行程式連線起來,它把HTML接收的指令傳遞給伺服器,再把伺服器執行的結果返還給HTML頁。
CGI使網頁變得不是靜態的,而是互動式的。
但是CGI程式的響應時間依賴於傳送的資料量的大小、伺服器和網路的負載,一旦網站變得複雜起來,響應就會變得非常慢且難以維護。
Applet
Applet是一種將小程式嵌入到網頁中進行執行的技術,含有Applet的網頁的HTML檔案程式碼中部帶有<applet>
和</applet>
這樣一對標記,當支援Java的網路瀏覽器遇到這對標記時,就將下載相應的小應用程式程式碼並在本地計算機上執行該Applet。
在當時,Java Applet 可以大大提高Web頁面的互動能力和動態執行能力。
Java剛出現時,Applet是最受大家歡欣鼓舞的。但是由於當時的網路環境的問題,安裝Java執行時環境(JRE)所需要的10MB頻寬對當時的使用者來說太過於恐怖。並且微軟的IE瀏覽器並並沒有包含JRE,所以Applet並沒有得到大規模應用。
Servlet
Servlet(Server+Applet),即伺服器端小程式。Servlet能夠按照使用者提交的內容處理並返回相應的資源。可以輸出HTML頁面,動態展示資料。Servlet實現正確的介面就能夠處理Http請求。
但是出現了一個很大的問題:HTML程式碼需要在Servlet類中用Java程式碼一行一行輸出,表現、邏輯、控制、業務等全部在Servlet類中,造成Servlet類程式碼混亂(HTML程式碼、Java程式碼都寫在一起),重複性高、閱讀性差、開發困難。
下面是使用Servlet在瀏覽器中輸出有一個h1標題的Hello World!字串的HTML頁面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=utf-8");
out.println("<html>");
out.println("<head>");
out.println("<title>$Title$</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
可想而知,更復雜的頁面得寫多少程式碼!
JSP
為了解決上面的問題,Sun公司開發出了JSP。
JSP(JavaServer Page)是一種動態網頁技術標準。JSP部署於網路伺服器上,可以響應客戶端傳送的請求,並根據請求內容動態地生成HTML、XML或其他格式文件的Web網頁,然後返回給請求者。JSP技術以Java語言作為指令碼語言,為使用者的HTTP請求提供服務,並能與伺服器上的其它Java程式共同處理複雜的業務需求。
可以將JSP頁面看成是一個能內嵌Java程式碼的HTML頁面。
靜態部分(HTML頁面)是模板,可以提前寫好,動態部分(資料)可以由Java程式碼動態生成。這樣一來就避免了在單純使用Servlet時HTML程式碼和Java程式碼都出現在Servlet類中的混亂情況。
JSP在執行時被轉換成Servlet,因此JSP本質是Servlet。
下面是使用JSP做和上面同樣的事情:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
仍使用HTML模板,但不是用Java語句一行一行“堆”出來,這多方便!
使用了JSP後,雖然不用一行行地“堆”HTML頁面了,但是程式碼混亂的問題仍沒有解決。表現、邏輯、控制、業務等程式碼仍然寫在一塊了,只不過是從Servlet類中挪到JSP中了。
這樣混亂的程式碼極不利於團隊開發,如果專案很小,那還能理順,但如果專案非常大的話,那就“剪不斷,理還亂了”。
所以這時候,我們急需將程式碼分門別類的碼放整齊。
JSP + JavaBean(Model1模式)
JavaBean 是用Java語言寫成的可重用元件,JavaBean類要求:
- 類是公開的
- 具有私有成員變數
- 具有無參構造器
- 具有setter和getter方法
上面已經說了,單純使用JSP會有大量的HTML程式碼和Java程式碼耦合在一起,不利於開發、維護、分工協作。
我們舉一個登入的例子:
登入大致需要以下幾步:
- 在瀏覽器中輸入使用者名稱、密碼
- 獲取資料,交給伺服器
- 把資料處理成合適的形式
- 查詢資料庫的使用者表,看是否有一條使用者名稱和密碼都符合輸入的記錄。如果有,則登入成功。
單純使用JSP時,以上步驟全部在JSP登入頁面中完成,該頁面既需要顯示登入表單、又需要獲取、處理資料、還需要查詢資料庫。太亂了!!
有了JavaBean,我們可以將JSP中大量重複的程式碼抽取成可重用的元件,封裝成JavaBean,在一定程度上減輕了程式碼的耦合度,也在一定意義上實現了分層。
比如,使用者本身就是一個物件,我們可以將其抽取成JavaBean,資料的傳遞、查詢都可使用JavaBean來完成。
JSP+Servlet+JavaBean(Model2模式——MVC模式)
上面介紹了Servlet、JSP、JSP+JavaBean,雖然在進步,但是都不盡如人意。那為什麼不讓它們結合起來取長補短?
我們之所以使用JavaBean,就是為了讓Java程式碼和HTML程式碼分離開了,而Servlet也是一個Java類,為什麼不使用它呢?
JSP+JavaBean已經實現了部分分層,使用MVC(Model-View-Controller)模式能進一步分層。
Model(模型):MVC模式的中心元件,處理資料和邏輯。(比如JavaBean,但不止只有JavaBean)
View(檢視):展示資料,渲染頁面。(前端頁面,比如HTML頁面、JSP頁面)
Controller(控制器):從View接收資料,向Model傳送資料,即用於控制資料分發。(比如Servlet)
還用上面的登入例子:
-
將JSP登入頁面作為View
-
Servlet類(Controller)用於接收使用者輸入的使用者名稱、密碼,將其封裝為使用者類(JavaBean),然後去資料庫中查詢。如果能查詢到則登入成功。
-
將查詢結果返回給Controller,Controller根據查詢結果選擇一個合適的View,並將資料渲染到頁面,展示給使用者。(在本例中,如果查詢成功,則進入系統主頁;如果查詢不到,則使用者會看到一個登入失敗頁面)
使用了MVC設計模式後,程式碼有了明顯的分層,結構清晰,各司其職。
框架
為了減輕工作量,各種框架逐漸出現在人們的視野中。
所謂框架,可以把它看做一個半成品的專案/軟體,框架中有許多東西別人都已經幫我們寫好了,比如各種類、方法。
我們要做的就是去了解、學習框架,在寫好的框架的基礎上、遵循框架的制定好的規則、按照自己的思路、結合框架的思想、去開發我們自己的專案。
目前Java的Web開發中最出名的框架就是Spring家族了,比如SpringMVC、Spring、SpringBoot。
熟悉、利用這些框架能夠幫助我們快速、優雅地開發出符合需求的專案。
另,框架是別人寫好的輪子,有了它,我們能夠跑得更快,但是別忘了怎麼走。
總結
說了這麼多,相當於陪著Java從出生到現在走了一遍。我們可以看出Java的發展也不是一帆風順的,我認為Java之所以現在還這麼流行,原因之一就是它能夠一直保持更新,一直在根據時代的需求結合自身的特點不斷地做出改變。正如那句話「窮則變,變則通,通則達」。一門語言能做到這樣,身為人更應該要做到。
如有錯誤,還請指正。
參考資料:
- 百度百科
- 維基百科
- Java官方文件
- Java核心卷一(第10版)
- Java程式設計思想(第4版)
文章首發於公眾號『行人觀學』