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 版)
文章首发于公众号『行人观学』