# 目录
  * [什么是 Java Web](#什么是-java-web)
    * [Web开发的历史](#web开发的历史)
    * [开源框架时代](#开源框架时代)
  * [Java Web基础知识](#java-web基础知识)
    * [一、HTTP协议](#一、http协议)
    * [二、服务器](#二、服务器)
      * [1、概念](#1、概念)
      * [2、web服务器](#2、web服务器)
    * [三、JavaWeb项目结构](#三、javaweb项目结构)
  * [参考文章](#参考文章)

本文转载自互联网，侵删
本系列文章将整理到我在GitHub上的《Java面试指南》仓库，更多精彩内容请到我的仓库里查看
> https://github.com/h2pl/Java-Tutorial

喜欢的话麻烦点下Star哈

本系列文章将同步到我的个人博客：
> www.how2playlife.com

更多Java技术文章将陆续在微信公众号【Java技术江湖】更新，敬请关注。

本文是《走进JavaWeb技术世界》系列博文的其中一篇，本文部分内容来源于网络，为了把本文主题讲得清晰透彻，也整合了很多我认为不错的技术博客内容，引用其中了一些比较好的博客文章，如有侵权，请联系作者。

该系列博文会告诉你如何从入门到进阶，从servlet到框架，从ssm再到SpringBoot，一步步地学习JavaWeb基础知识，并上手进行实战，接着了解JavaWeb项目中经常要使用的技术和组件，包括日志组件、Maven、Junit，等等内容，以便让你更完整地了解整个JavaWeb技术体系，形成自己的知识框架。为了更好地总结和检验你的学习成果，本系列文章也会提供每个知识点对应的面试题以及参考答案。

如果对本系列文章有什么建议，或者是有什么疑问的话，也可以关注公众号【Java技术江湖】联系作者，欢迎你参与本系列博文的创作和修订。

<!-- more -->



## 什么是 Java Web
如果你是70、80后的程序员，你一定要看一看这篇文章，保证满满的回忆。如果你是90后，那你更要看看这篇文章，因为你能找到java web发展的历史。

言归正传，Java语言能长期霸占语言排行榜一个重要的原因就是强大的web开发能力，web开发是java的基石（在EJB推出的时候当时的Sun用基石来描述EJB），所以了解java web开发原理是非常重要的。如果仅仅跟大家聊java web开发原理未免有点单薄，今天我将把java web开发包含的主体内容跟头条的读者一起分享一下（一直计划写关于java web的文章，一直也没时间写，今天就当时开个头吧）。

### Web开发的历史

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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151003.png)




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

看到这个图，不知道第一批从事web开发的80后是否和我一样，已经有点感触了，当年为了搞清楚这个结构，曾经连续多少个通宵做实验（实验环境比较恶劣）。没关系，这仅仅是个开始，我想当你看完这篇文章的时候，你会泪流满面的（相信我）。为了配合一下这张结构图，在web发展过程中，有一个小插曲，就是在web site向web application发展的过程中，出现了一个小“玩意儿”，就是applet，很多人了解java都是从使用java applet开始的（70，80后那一批程序员）。当时风靡校园（我当时在读大一）的网易聊天室，哎呀那个火啊（大家回忆一下你在学校机房上网时的兴奋），这个聊天室就是采用了applet构建的，当时applet给静态页面一个动态交互的可能，着实火了一段时间。现在知道applet的程序员，你已经暴露年龄了。看一张图片吧：





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151021.png)




我想这个时候，泪点低的70、80后已经有点湿润了吧。湿润的，自觉在这里停留一分钟，对着屏幕来张合影，发个朋友圈。

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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151039.png)




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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151104.png)




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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151117.png)




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

另外，开发一个Servlet并不复杂，看一个Servlet编写的HelloWorld应用：





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151132.png)




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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151210.png)




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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151230.png)




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





![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405151248.png)




这个结构是标准的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，小巧且强大。

关于这三个框架我在头条将写专门的文章介绍，今天就不再进行扩展了。

今天看到这个问题，有感而发，原来我们80后真的老了，80后的程序员，看到这篇文章，有没有所感触？关注我吧，我们一起回忆，再一起继续奋斗！

## Java Web基础知识


### 一、HTTP协议

HTTP(超文本传输协议)，它是一种主流B/S架构中应用的通信协议。具有以下特点：

1、无状态

服务端不会记录客户端每次提交的请求，服务器一旦相应客户端之后，就会结束本次的通信过程。客户端下一次的请求是一个新的 连接，和上一次通信没有任何关系。

2、简单灵活

HTTP是基于请求（request）和响应（response）的模型

3、支持客户端与服务端

支持主流的B/S架构的通信以及C/S架构的通信。

注意：C/S架构可选的协议有多种，例如：TCP/IP,UDP,HTTP

 而B/S架构通常只支持HTTP协议

### 二、服务器

#### 1、概念

服务器通常由硬件和软件部分构成，统一对用户提供多种不同的服务。

1、硬件：包括响应的CPU、内存、磁盘等等

2、软件：包括操作系统、运行环境、服务器软件、数据库等等

#### 2、web服务器

web服务器是提供服务端程序运行的一个环境，它本身也是一个软件。

例如：将我们编写HTML文件放入到web服务器中，那么外界就可以通过浏览器访问我们的html页面

常见的web服务器有Apache，Tomcat、Jetty、Nginx等等。

而Tomcat、Jetty这些web服务器更准确的说是一个Servlet容器。

### 三、JavaWeb项目结构

| 项目根目录，例如：myweb、ch01 |  |  | 通常存放静态资源文件（如：html等等） |
| --- | --- | --- | --- |
|  | WEB-INF |  | 这个目录是当前项目私有的一个文件夹，只能提供给项目内部访问，对于客户端来说是访问不到了，通常这个目录下存放的是Java源代码、编译后的字节码文件以及Servlet的核心配置文件web.xml |
|  |  | src | 存放java源代码的目录 |
|  |  | classes | 存放编译后的字节码文件 |
|  |  | lib | lib目录存放当前项目所需要的jar文件 |
|  |  | JSP | 用于存放JSP动态页面 |
|  |  | web.xml | 项目的配置文件，用于配置Servlet的请求映射、过滤器、监听器等等信息。每一个web项目都对应一个web.xml配置文件 |
|  | META-INF |  | 配置应用程序、扩展程序、类加载服务等等 |



## 参考文章

https://blog.csdn.net/shanhanyu/article/details/80515791
https://www.jianshu.com/p/d9b770a78da1
https://www.cnblogs.com/albertrui/p/8427661.html
https://blog.csdn.net/qq_41911570/article/details/83279327




                     
