原文地址 :https://www.jianshu.com/p/d9b770a78da1

    Java 语言能长期霸占语言排行榜一个重要的原因就是强大的 web 开发能力,web 开发是 java 的基石(在 EJB 推出的时候当时的 Sun 用基石来描述 EJB),所以了解 java web 开发原理是非常重要的。

    Web 开发的历史

    web 开发的历史其实并不久远,要搞清楚 java web 开发的特点(主要是优点),首先要了解 web 开发的历史(简单的回归一下)。早期的 web 是非常简单的结构,用户发出请求(request),服务器给出回应(response),这个时期的 web 应用,我们称为 web site(网站),特点是一些列静态内容的集合。看一个图示:

    认识 java web - 图1

    图中的服务器保持了一系列 html 脚本来响应用户的请求,可以说这个时期的 web 应用还是比较简单的,但是却确立了两个重要的对象:一个 request(代表请求),另一个是 response(代表回应)。如果把 web 开发的历史比喻成一部美国大片的话,那么 request 和 response 绝对是这部大片的那女主角,而且每一部都是不可或缺的主角(简单的说就是死不了)。

    在 web 发展过程中,有一个小插曲,就是在 web site 向 web application 发展的过程中,出现了一个小 “玩意儿”,就是 applet,很多人了解 java 都是从使用 java applet 开始的(70,80 后那一批程序员)。当时风靡校园(我当时在读大一)的网易聊天室,哎呀那个火啊(大家回忆一下你在学校机房上网时的兴奋),这个聊天室就是采用了 applet 构建的,当时 applet 给静态页面一个动态交互的可能,着实火了一段时间。

    过了这个插曲,真正的三层 web 开发来了,一个里程碑式的 web 处理方式 CGI,看一张图:

    认识 java web - 图2

    CGI 的推出,使得 web 开发正式进入了动态处理时代,服务器能与客户有真正意义上的交流了,有能存储数据的数据库了,虽然 CGI 的使用周期并不长,但是一定要纪念一下它,毕竟它是里程碑式的变革。java web 技术正是踩着 CGI 的肩膀来到了广大程序员的面前,java web 解决了 CGI 的性能问题。CGI 是以进程为单位管理请求的,而 java web 则是以线程为单位,处理能力更强,占用的资源更少,这个核心的组件就是 Servlet。看一组资源占用图,先看 CGI 的:

    认识 java web - 图3

    再看一下 java web 中的 servlet 资源图:

    认识 java web - 图4

    孰优孰劣一目了然,Servlet 解决相同数量的请求,却占用较少的系统资源,这就是为什么广大程序员抛弃了 CGI 转向 java web 的原因。

    另外,开发一个 Servlet 并不复杂,看一个 Servlet 编写的 HelloWorld 应用:
    认识 java web - 图5

    这个代码结构是不是很亲切,是不是很有 Coding 的感觉,其实 Servlet 就是个 java 类而已,只不过增加了几个限制而已,所以开发一个 Servlet 并不复杂。然后就是把它部署到 web 服务器上(Tomcat 这个老人家现在身体依然硬朗!),然后就等待客户的请求就可以了。这是 Servlet 的三层部署图:
    认识 java web - 图6

    java web 开发的技术体系还包括 javabean 和 jsp,采用 MVC 结构来组合这三个技术是 java web 开发的基础内容,先看一下 MVC 的功能图:

    认识 java web - 图7

    再看一下组合使用 Servlet+javaBean+JSP 的 Model2 开发结构:

    认识 java web - 图8

    这个结构是标准的 Java web 开发结构,现在是不是很少能看到这么 “干净” 的描述图了?以上就是标准的 java web 开发的历史描述,当然这并不是说这些内容已经过时了,反而它一直是官方的标准解决方案。只不过 web 发展迎来了另一个阶段,繁荣的开源架构时代来了。。。

    开源框架时代

    这个时代的典型代表就是 Struts、Spring 和 Hibernate,简称 SSH。

    严格的说,这部分内容并不是官方解决方案,但是这些方案却得到了广大程序员的拥护,一方面原因是 EJB 的方案太重了,另一方面开源架构使用起来非常方便和灵活,所以从 03 年以后这些开源框架得到了普通的使用。

    简单描述一下这三个框架:

    Struts 基于 MVC 结构的解决方案,分为 struts1(已经淘汰了,用过 Struts1 的程序员已经老了)和 struts2 两个版本,和 Python 一样,这两个版本不兼容,目前 Struts2 的最新版本是 2.5.14.1,简单的说 Struts 就是构建了现成的 MVC 框架,程序员往这个框架里加代码就可以了,使用起来非常方便。

    Hibernate 框架完成了面向对象与面向关系的映射,让 java 程序以面向对象的方式操作面向关系的数据库。整体结构基于 DAO 进行扩展,很多操作只需要配置一下就可以了,极其方便。

    Spring 提供了 javaBean 的容器,池化了 javabean,提高了性能,而且核心代码不到 2M,小巧且强大。