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版)
文章首發於公眾號『行人觀學』
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!