目录
3.3 连接方式(HTTP/1.0和HTTP/1.1的区别)
前言
这个博客还未完成便半道崩殂,为什么?
当我去看又臭又长的视频,在纠结底层时,明明框架已经帮助我们封装好了,为什么还是要舍本逐末,去学习非常老的技术,如果java这么好的生态环境我们不加以利用,我们拿出学习精力还不如直接去学习go,那将会事半功倍。技术一定要贴近前沿,我们在这里一定要走马观花地去看,花更多的时间去学习框架,拥抱 k8s,docker这些更新的技术,而不是在这里枯燥的学习这些已经快被淘汰的技术,长时间得不到正反馈,已经有点让我抛弃 java 了,所以我接下来直接准备学习框架和算法,等到掌握后,再回来写这一篇博客。
最开始的想法
我们整个的 Java web 是一些偏底层的东西,里面的实现都不需要我们去一一落实,而是学会我们的思想。
这部分是我们 Java SE 的进阶,跟着我的步伐,拿下这篇Java web笔记,后面的 SSM 框架那就是手到擒来,剑指秋招 offer。后续还会同步我的 leetcode 算法刷题,分享一些实习、竞赛和项目笔记,同步我的学习历程,还会分享一些比较好的学习资料,共同进步!
这篇笔记来自尚硅谷的2023的 Java web 网课,大家可以自行去看。
第一章 XML_Tomcat10_HTTP
1. xml
XML是EXtensible Markup Language的缩写,翻译过来就是可扩展标记语言。所以很明显,XML和HTML一样都是标记语言,也就是说它们的基本语法都是标签。
1.1 常见配置文件类型
主要是前三种:
- properties文件,例如druid连接池就是使用properties文件作为配置文件;
- XML文件,例如Tomcat就是使用XML文件作为配置文件;
- YAML文件,例如SpringBoot就是使用YAML作为配置文件;
- json文件,通常用来做文件传输,也可以用来做前端或者移动端的配置文件。
1.2 properties配置文件
语法:
- 由键值对组成
- 键和值之间的符号是等号
- 每一行都必须顶格写,前面不能有空格之类的其他符号
atguigu.jdbc.url=jdbc:mysql://localhost:3306/atguigu
atguigu.jdbc.driver=com.mysql.cj.jdbc.Driver
atguigu.jdbc.username=root
atguigu.jdbc.password=root
1.3 xml配置文件
语法:
- XML的基本语法和HTML的基本语法简直如出一辙。其实这不是偶然的,XML基本语法+HTML约束=HTML语法。在逻辑上HTML确实是XML的子集。
- XML文档声明 这部分基本上就是固定格式,要注意的是文档声明一定要从第一行第一列开始写。
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>张三</name>
<age>18</age>
</student>
<student>
<name>李四</name>
<age>20</age>
</student>
</students>
XML的约束(稍微了解)
将来我们主要就是根据XML约束中的规定来编写XML配置文件,而且会在我们编写XML的时候根据约束来提示我们编写, 而XML约束主要包括DTD和Schema两种。
- DTD
- Schema
Schema约束要求我们一个XML文档中,所有标签,所有属性都必须在约束中有明确的定义。
下面我们以web.xml的约束声明为例来做个说明:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
2. Tomcat10
面试经常会问到 tomcat 和 nginx 区别,还有 nginx 反向代理,静态动态资源的访问等等 ,这个我们自行去了解一下就可。
2.1 WEB服务器
Web服务器通常由硬件和软件共同构成。
- 硬件:电脑,提供服务供其它客户电脑访问
- 软件:电脑上安装的服务器软件,安装后能提供服务给网络中的其他计算机,将本地文件映射成一个虚拟的url地址供网络中的其他人访问。
市面上有很多支持 java web 的服务器,tomcat是使用最多,且开源免费的服务器。因为 tomcat 是内置于我们的 springboot ,更多的是底层原理,所以我们主要是学习原理。
2.2 WEB项目的标准结构
- app 本应用根目录
- static 非必要目录,约定俗成的名字,一般在此处放静态资源 ( css js img)
- WEB-INF 必要目录,必须叫WEB-INF,受保护的资源目录,浏览器通过url不可以直接访问的目录
- classes 必要目录,src下源代码,配置文件,编译后会在该目录下,web项目中如果没有源码,则该目录不会出现
- lib 必要目录,项目依赖的jar编译后会出现在该目录下,web项目要是没有依赖任何jar,则该目录不会出现
- web.xml 必要文件,web项目的基本配置文件. 较新的版本中可以没有该文件,但是学习过程中还是需要该文件
- index.html 非必要文件,index.html/index.htm/index.jsp为默认的欢迎页
对于这块内容我,我们只需要知道一些原理,不过这个我认为可以放到后面再仔细去学习。
3. HTTP协议
3.1 http简介
这个我们在计算机网络课上都有学习,我们重点回顾一下,tcp/ip 的三次握手四次挥手,在面试也是非常非常重要的内容。
HTTP就是一个通信规则,这个规则规定了客户端发送给服务器的报文格式,也规定了服务器发送给客户端的报文格式。实际我们要学习的就是这两种报文。客户端发送给服务器的称为"请求报文",服务器发送给客户端的称为"响应报文"。
3.2 HTTP协议的会话方式
浏览器与服务器之间的通信过程要经历四个步骤:
- 浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
- 浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。
两类报文:请求报文,响应报文用户单击鼠标后所发生的事件按顺序如下(以访问清华大学的网站为例):1) 浏览器分析链接指向页面的 URL (http://www.tsinghua.edu.cn/chn/index.htm)。2) 浏览器向DNS请求解析www.tsinghua.edu.cn的IP地址。3) 域名系统DNS解析出清华大学服务器的IP地址。4) 浏览器与该服务器建立TCP连接(默认端口号为80)。5) 浏览器发出 HTTP 请求:GET/chn/index.htm。6) 服务器通过HTTP响应把文件index.htm发送给浏览器。7) 释放TCP连接。8) 浏览器解释文件index.htm,并将Web页显示给用户。
- 使用TCP,但是HTTP本身是无连接的;
- 无状态。同一个客户第二次访问同一个服务器上的页面,服务器的响应与第一次被访问时相同(不记得曾经访问的客户,也不记得为该客户服务过多少次)。使用Cookie加数据库的方式来跟踪用户的活动。
3.3 连接方式(HTTP/1.0和HTTP/1.1的区别)
- 每个网页元素对象的传输都需要单独建立一个TCP连接。
- 请求一个万维网文档所需时间=文档的传输时间+2×RTT。
服务器发送响应后,仍然保持连接。
- 非流水线方式:客户在收到前一个响应后才能发出下一个请求(会有服务器资源的浪费)
- 流水线方式:请求和响应可以连续发送。所有引用的对象共计经历1个RTT延迟,减少了TCP连接中的空闲时间,提高了效率。
HTTP/1.1的默认方式是使用流水线的持久连接。
3.4 报文结构
请求报文格式:
- 请求首行(请求行); GET/POST 资源路径?参数 HTTP/1.1
- 请求头信息(请求头);
- 空行;
- 请求体;POST请求才有请求体
form表单发送GET请求特点
1、由于请求参数在请求首行中已经携带了,所以没有请求体,也没有请求空行
2、请求参数拼接在url地址中,地址栏可见[url?name1=value1&name2=value2],不安全
3、由于参数在地址栏中携带,所以由大小限制[地址栏数据大小一般限制为4k],只能携带纯文本
4、get请求参数只能上传文本数据
5、没有请求体。所以封装和解析都快,效率高, 浏览器默认提交的请求都是get请求比如:地址栏输入回车,超链接,表单默认的提交方式
查看GET请求行,请求头,请求体
- 请求行组成部分
- 请求方式 GET
- 访问服务器的资源路径?参数1=值1&参数2=值2 ... ...
- 协议及版本 HTTP/1.1
GET /05_web_tomcat/login_success.html?username=admin&password=123213 HTTP/1.1
响应报文格式:
- 响应首行(响应行); 协议/版本 状态码 状态码描述
- 响应头信息(响应头);
- 空行;
- 响应体;
3.5 状态响应码
常见响应码:
- 200: 请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
- 302: 重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location指定新请求的URL地址;
- 304: 使用了本地缓存
- 404: 请求的资源没有找到,说明客户端错误的请求了不存在的资源;
- 405: 请求的方式不允许
- 500: 请求资源找到了,但服务器内部出现了错误;
更多的响应状态码
状态码 | 状态码英文描述 | 中文含义 |
---|---|---|
1** | ||
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
2** | ||
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
3** | ||
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
4** | ||
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
5** | ||
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
第二章 servlet
1. 简介
Servlet 是 JavaEE 的规范之一,通俗的来说就是 Java 接口,将来我们可以定义 Java 类来实现这个接口,并由 Web 服务器运行 Servlet ,所以 TomCat 又被称作 Servlet 容器。
Servlet 提供了动态 Web 资源开发技术,一种可以将网页数据提交到 Java 代码,并且将 Java 程序的数据返回给网页的技术,使用 Servlet 技术实现了不同用户登录之后在页面上动态的显示不同内容等的功能,也就是对动态资源的处理。
下面的图非常形象的描述了我们的 tomcat 和 servlet 的执行过程,tomcat 为什么又叫做 servlet 服务器?就是因为这个。
我们使用 servlet 时的开发流程:
- 创建 Java web 项目,同时导入 tomcat 作为依赖;
- 重写 service 方法,service( HttpServletRequest req, HttpServletResponse resp );
- 在 service 方法中重写业务逻辑;
- 在 web.xml 中,配置 servlet 请求映射路径。
2. 还要继续学习 servlet 吗?
为什么我不继续了,看了那么多视频后,我突然发现这些好像有点太老,这些东西已经在我们的框架中封装好了,而对于新手,这些太过于干涩,迟迟拿不到做出来的项目,没有成就感。
我们在基础方面更多的是之后进行巩固,而不是在一开始就学的臻于至善,这样非常难以继续下去。尤其是源码与底层实现,不是我们现阶段需要去做的事情!