javascript
Spring Boot Web
一. 概述
下面我們將進(jìn)入 SpringBoot 基礎(chǔ)階段的學(xué)習(xí)。 在沒有正式的學(xué)習(xí) SpringBoot 之前,我們要先來了解下什么是 Spring 。 我們可以打開 Spring 的官網(wǎng) ( https://spring.io ) ,去看一下 Spring 的簡(jiǎn)介: Spring makes Java simple 。 Spring 的官方提供很多開源的項(xiàng)目,我們可以點(diǎn)擊上面的 projects ,看到 spring 家族旗下的項(xiàng)目, 按照流行程度排序?yàn)?#xff1a;- 當(dāng)前最為流行最受歡迎的Spring Boot,基于Spring? Boot就可以快速方便的構(gòu)建出一個(gè)Spring應(yīng)用程序。
- Spring? Framework,即Spring框架,是整個(gè)Spring家族當(dāng)中最為底層,最為基礎(chǔ)的一個(gè)框架。
- Spring? Data封裝了一系列訪問數(shù)據(jù)庫(kù)的技術(shù)。
- Spring Cloud用來構(gòu)建微服務(wù)項(xiàng)目
- 以及Spring Security這樣的安全框架
Spring發(fā)展到今天已經(jīng)形成了一種開發(fā)生態(tài)圈,Spring提供了若干個(gè)子項(xiàng)目,每一個(gè)子項(xiàng)目都能夠完成特定的功能來解決特定領(lǐng)域的問題,而我們?cè)陂_發(fā)一個(gè)項(xiàng)目的時(shí)候,會(huì)遇到各種各樣的業(yè)務(wù)場(chǎng)景,那我們會(huì)根據(jù)業(yè)務(wù)開發(fā)的需要取選擇對(duì)應(yīng)的技術(shù),從而簡(jiǎn)化以及解決對(duì)應(yīng)的業(yè)務(wù)難題。
而在現(xiàn)在的企業(yè)開發(fā)當(dāng)中,開發(fā)人員更喜歡偏向于在項(xiàng)目當(dāng)中選擇Spring家族提供的這一系列的解決方案,為什么呢?
因?yàn)檫@些框架它都屬于Spring體系內(nèi)的框架,框架之間的整合會(huì)非常的容易,甚至可以說是無縫銜接,所以這是當(dāng)前企業(yè)開發(fā)當(dāng)中非常流行,也是非常受歡迎的一種解決方案,被我們親切的稱為Spring全家桶,而Spring家族開發(fā)的這么多子項(xiàng)目,其實(shí)它都是基于一個(gè)基礎(chǔ)框架的,也就是這個(gè)Spring? Framework,即Spring框架
?基于Spring Boot就可以快速的來開發(fā)一個(gè)Spring的應(yīng)用程序,在SpringBoot的介紹中也看到了,“盡可能快的來構(gòu)建一個(gè)Spring應(yīng)用”,所以這個(gè)Spring? Boot它只是簡(jiǎn)化了Spring應(yīng)用的配置,它的底層還是Spring,它只是簡(jiǎn)化了Spring的開發(fā)而已。
Spring家族旗下這么多的技術(shù),最基礎(chǔ)、最核心的是 SpringFramework。其他的spring家族的技術(shù),都是基于SpringFramework的,SpringFramework中提供很多實(shí)用功能,如:依賴注入、事務(wù)管理、web開發(fā)支持、數(shù)據(jù)訪問、消息服務(wù)等等。
- 而如果我們?cè)陧?xiàng)目中,直接基于SpringFramework進(jìn)行開發(fā),存在兩個(gè)問題:配置繁瑣、入門難度大。
- ?所以基于此呢,spring官方推薦我們從另外一個(gè)項(xiàng)目開始學(xué)習(xí),那就是目前最火爆的SpringBoot。
- 總結(jié)Spring? Boot框架:Spring Boot是Spring家族的一個(gè)子項(xiàng)目,可以幫助我們非常快速的構(gòu)建Spring應(yīng)用程序,簡(jiǎn)化Spring應(yīng)用程序的配置開發(fā),從而提高開發(fā)效率。
- 現(xiàn)在絕大部分的項(xiàng)目,都是基于Spring Boot進(jìn)行開發(fā)的,所以這也是當(dāng)前企業(yè)最為主流的開發(fā)方式。
二. Spring Boot Web
- 接下來,我們就直接通過一個(gè)SpringBoot的web入門程序,讓大家快速感受一下,基于SpringBoot進(jìn)行Web開發(fā)的便捷性。
- 基于Spring Boot進(jìn)行Web應(yīng)用程序開發(fā)的便捷性和基本的操作步驟
?1. SpringBootWeb快速入門
?1.1 需求
- 需求:基于SpringBoot的方式開發(fā)一個(gè)web應(yīng)用,瀏覽器發(fā)起請(qǐng)求/hello后,給瀏覽器返回字符串 “Hello World ~”。
- 當(dāng)我們?cè)跒g覽器地址欄發(fā)起這個(gè)請(qǐng)求之后,這個(gè)請(qǐng)求要被我們所開發(fā)的web應(yīng)用程序處理,處理完了以后,我們的web應(yīng)用程序要給瀏覽器來返回一個(gè)字符串hello world,然后在瀏覽器當(dāng)中展示出這個(gè)hello world即可,這個(gè)就是入門程序的需求。
?1.2 開發(fā)步驟
第1步:創(chuàng)建SpringBoot工程項(xiàng)目
第2步:定義HelloController類,添加方法hello,并添加注解
第3步:測(cè)試運(yùn)行
1.2.1 創(chuàng)建SpringBoot工程(需要聯(lián)網(wǎng))
- 基于Spring官方骨架,創(chuàng)建SpringBoot工程。
- 第一步:我們是基于SpringBoot進(jìn)行web應(yīng)用程序的開發(fā),此時(shí)IDEA會(huì)自動(dòng)連接Spring的官? ? ? ? ? ? ? ? ? 網(wǎng)去創(chuàng)建SpringBoot工程。
-
Group組織名就是域名倒寫? Artifact:模塊名? ?Package name:包名??Artifact / 工件:模塊名
Location:代表的就是我當(dāng)前所創(chuàng)建出來的Spring Boot工程,最終放在哪個(gè)磁盤目錄下呢?
- ?基本信息描述完畢之后,勾選web開發(fā)相關(guān)依賴。
- ?點(diǎn)擊Finish之后,就會(huì)聯(lián)網(wǎng)創(chuàng)建這個(gè)SpringBoot工程,創(chuàng)建好之后,結(jié)構(gòu)如下:
- 注意:在聯(lián)網(wǎng)創(chuàng)建過程中,會(huì)下載相關(guān)資源(請(qǐng)耐心等待)
- 下面的進(jìn)度條會(huì)一直在加載,這個(gè)過程就是在下載Spring Boot進(jìn)行web開發(fā)的相關(guān)依賴
pom.xml配置文件信息
- 首先我們先來看一下pom.xml這一份配置文件,在這份配置文件當(dāng)中,最上面有這么一堆標(biāo)簽叫做parent,parent這里指定了一個(gè)坐標(biāo),這個(gè)是Spring Boot的父工程,我們把創(chuàng)建的所有的Spring Boot工程,它都需要繼承自這個(gè)父工程,這個(gè)呢Maven當(dāng)中叫做繼承,就是來指定一個(gè)父工程
- 往下走這里就定義了我們當(dāng)前項(xiàng)目的坐標(biāo)信息,而下面這一塊是項(xiàng)目的描述信息,以及我們所選擇的Spring Boot版本所對(duì)應(yīng)的JDK的版本是11版本。
- ?那下面這一塊就是添加了兩個(gè)依賴,一個(gè)依賴就是Spring Boot進(jìn)行Web開發(fā)的依賴
- 還有一個(gè)依賴是進(jìn)行單元測(cè)試的依賴
- 再往下走還有一個(gè)插件,這個(gè)是Spring Boot項(xiàng)目的一個(gè)Maven插件
?目錄信息:
- ?在java目錄下給我們自動(dòng)創(chuàng)建了一個(gè)類,這個(gè)類在Spring Boot當(dāng)中我們稱之為啟動(dòng)類。
?1.2.2 定義請(qǐng)求處理類?
直接在com.gch下右鍵新建Java類直接新建:controller.HelloController,連包帶類一起創(chuàng)建
- 在com.gch這個(gè)包下創(chuàng)建一個(gè)子包c(diǎn)ontroller
- ?然后在controller包下新建一個(gè)類:HelloController
- 這個(gè)類定義好了,要標(biāo)識(shí)它是一個(gè)請(qǐng)求處理類,還要指定它要處理的請(qǐng)求是/hello,所以需要 在這個(gè)類上加一個(gè)注解@RestController,然后在方法上再加上一個(gè)注解@RequestMapping,那RequestMapping里面指定的value值是它要處理的請(qǐng)求路徑是什么,是/hello
?1.2.3 運(yùn)行測(cè)試
- 運(yùn)行SpringBoot自動(dòng)生成的引導(dǎo)類
?運(yùn)行結(jié)果:
- 運(yùn)行啟動(dòng)類,啟動(dòng)類將我們的web應(yīng)用啟動(dòng)起來之后,它會(huì)自動(dòng)占用一個(gè)端口號(hào)8080。
?打開瀏覽器,輸入 http://localhost:8080/hello
- http代表的是請(qǐng)求的協(xié)議? ?localhost代表的是我們要訪問的是當(dāng)前本機(jī)的服務(wù)
- 8080代表的是我們?cè)L問的端口? ? Tomcat服務(wù)器的端口號(hào)就是8080
- /hello代表的就是訪問的資源
- 打開瀏覽器,訪問8080端口的/hello這個(gè)資源,那此時(shí)就會(huì)請(qǐng)求到剛才我們所編寫的請(qǐng)求處理方法
- 當(dāng)我們?cè)跒g覽器地址欄發(fā)起這個(gè)請(qǐng)求之后,這個(gè)請(qǐng)求要被我們所開發(fā)的服務(wù)器端的web應(yīng)用程序處理,處理完了以后,我們服務(wù)器端的web應(yīng)用程序要給瀏覽器來返回一個(gè)字符串hello world,然后在瀏覽器當(dāng)中展示出這個(gè)hello world即可,這個(gè)就是入門程序的需求。
三. Http協(xié)議
3.1 HTTP-概述
在入門程序中,我們?cè)跒g覽器發(fā)起了一個(gè)請(qǐng)求,請(qǐng)求路徑是localhost:8080/hello,回車之后,我們就訪問到了服務(wù)器端的web應(yīng)用程序,并且,也拿到了服務(wù)器端返回回來的數(shù)據(jù):Hello? World~。
那其實(shí)呢,我們?cè)跒g覽器地址欄輸入這個(gè)地址之后,瀏覽器默認(rèn)會(huì)自動(dòng)的在請(qǐng)求路徑前面加上一個(gè)協(xié)議:http://,這個(gè)我們就稱之為HTTP協(xié)議。
HTTP:Hyper Text Transfer Protocol(超文本傳輸協(xié)議),規(guī)定了瀏覽器與服務(wù)器之間數(shù)據(jù)傳輸? ? ? ? ? ? ? ? ?的規(guī)則。
?2.1.1 介紹
?什么是數(shù)據(jù)傳輸?shù)囊?guī)則:
說白了就是客戶端瀏覽器與服務(wù)器之間進(jìn)行數(shù)據(jù)交互的數(shù)據(jù)格式
- 比如我們客戶端瀏覽器,將來要請(qǐng)求服務(wù)器來獲取一些數(shù)據(jù),那此時(shí)瀏覽器就需要給服務(wù)器端發(fā)送請(qǐng)求,那服務(wù)器端再給瀏覽器響應(yīng)對(duì)應(yīng)的數(shù)據(jù),那么瀏覽器給服務(wù)器發(fā)送請(qǐng)求是需要攜帶請(qǐng)求數(shù)據(jù),最起碼你得告訴服務(wù)器,我需要什么東西,那服務(wù)器接收到這些請(qǐng)求數(shù)據(jù)之后,服務(wù)器就需要來解析這些數(shù)據(jù),而服務(wù)器要想成功的解析數(shù)據(jù),前提服務(wù)器得知道瀏覽器給我發(fā)送過來的請(qǐng)求數(shù)據(jù)長(zhǎng)什么樣子,具體的數(shù)據(jù)格式是什么樣子的,每一項(xiàng)代表什么含義,否則,服務(wù)器端無法解析。
- 也就是說,瀏覽器和服務(wù)器之間,它們得建立好一個(gè)約定,我瀏覽器發(fā)送數(shù)據(jù),將來就長(zhǎng)這個(gè)樣子,我就給你按照這個(gè)格式來寫,服務(wù)器端你就按照這個(gè)格式解析就可以了,那這樣呢,服務(wù)器端就能夠知道客戶端瀏覽器的意圖了,那么同理,服務(wù)器端處理完請(qǐng)求之后,需要給客戶端瀏覽器來響應(yīng)一些數(shù)據(jù),那響應(yīng)的數(shù)據(jù)返回給客戶端瀏覽器之后,瀏覽器也是需要來解析這些數(shù)據(jù)的,而瀏覽器要想成功解析,就必須得要求服務(wù)器按照一定的格式來返回這些數(shù)據(jù),而這些數(shù)據(jù)傳輸?shù)母袷?#xff0c;都是在HTTP協(xié)議當(dāng)中規(guī)定的,所以我們所說的這個(gè)http就是數(shù)據(jù)傳輸?shù)囊?guī)則,數(shù)據(jù)傳輸?shù)母袷?#xff0c;主要就包括兩個(gè)方面,一個(gè)是請(qǐng)求數(shù)據(jù)的格式,一個(gè)是響應(yīng)數(shù)據(jù)的格式。
- http是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議
- http協(xié)議要求:瀏覽器在向服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù)時(shí),或是服務(wù)器在向?yàn)g覽器發(fā)送響應(yīng)數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?時(shí),都必須按照固定的格式進(jìn)行數(shù)據(jù)傳輸
- Request? Headers:請(qǐng)求的數(shù)據(jù)? Response? Headers:響應(yīng)的數(shù)據(jù)? ?View? parsed:原始的數(shù)據(jù)格式
- 原始的數(shù)據(jù)格式其實(shí)就是一個(gè)文本字符串,將來瀏覽器發(fā)送請(qǐng)求的時(shí)候,就會(huì)將這么一個(gè)文本字符串帶到服務(wù)器端去,而這個(gè)格式是非常固定的。
?瀏覽器向服務(wù)器進(jìn)行請(qǐng)求時(shí):
- 服務(wù)器按照固定的格式進(jìn)行解析
- 請(qǐng)求數(shù)據(jù)格式:
- 第一行叫做請(qǐng)求行,里面就指定了請(qǐng)求的方式是GET請(qǐng)求、請(qǐng)求的資源路徑以及請(qǐng)求的協(xié)議。
- 第一行之后的這些被稱之為請(qǐng)求頭,而每一個(gè)請(qǐng)求頭它的格式:前面是請(qǐng)求頭的名字,后面是請(qǐng)求頭的值,請(qǐng)求頭的名字和請(qǐng)求頭的值中間用:分隔開。
- 這個(gè)格式是固定的,將來瀏覽器就可以把這個(gè)數(shù)據(jù)發(fā)送到服務(wù)端,服務(wù)端就可以根據(jù)這個(gè)固定的格式來解析數(shù)據(jù)。
- 瀏覽器按照固定的格式進(jìn)行解析
- 響應(yīng)數(shù)據(jù)格式:
- 將來服務(wù)器端給瀏覽器響應(yīng)的就是這樣一個(gè)文本字符串,瀏覽器只需要按照指定的格式來解析就可以了。
?所以,我們學(xué)習(xí)HTTP主要就是學(xué)習(xí)請(qǐng)求和響應(yīng)數(shù)據(jù)的具體格式內(nèi)容。
?3.2 特點(diǎn)
?我們剛才初步認(rèn)識(shí)了HTTP協(xié)議,那么我們?cè)诳纯?/span>HTTP協(xié)議有哪些特點(diǎn):
- 基于TCP協(xié)議: 面向連接,安全
TCP是一種面向連接的(建立連接之前是需要經(jīng)過三次握手)、可靠的、基于字節(jié)流的傳輸層
通信協(xié)議,在數(shù)據(jù)傳輸方面更安全 TCP它是一種面向連接的安全的協(xié)議,也就是說,每一次請(qǐng)求之前,要先進(jìn)行三次握手,連接完了之后確定雙方都有收發(fā)能力了,我再來傳輸數(shù)據(jù),這樣呢不容易數(shù)據(jù)包,更加安全。- 基于請(qǐng)求-響應(yīng)模型的: 一次請(qǐng)求對(duì)應(yīng)一次響應(yīng)(先請(qǐng)求后響應(yīng))
- HTTP協(xié)議是無狀態(tài)協(xié)議: 對(duì)于數(shù)據(jù) / 事務(wù)處理沒有記憶能力。每次請(qǐng)求-響應(yīng)都是獨(dú)立的。
- 缺點(diǎn): 多次請(qǐng)求間不能共享數(shù)據(jù)(多次請(qǐng)求間不能進(jìn)行數(shù)據(jù)的共享)
- 優(yōu)點(diǎn): 速度快
正是因?yàn)槎啻握?qǐng)求之間不會(huì)進(jìn)行數(shù)據(jù)共享,后一次請(qǐng)求不會(huì)記錄前一次請(qǐng)求的數(shù)據(jù),這也就意味著它的速度會(huì)更快一些,而多次請(qǐng)求之間不能共享數(shù)據(jù),那也就意味著有很多的功能,HTTP協(xié)議就實(shí)現(xiàn)不了。
就比如我這里有一個(gè)后臺(tái)管理系統(tǒng),在這個(gè)后臺(tái)管理系統(tǒng)的業(yè)務(wù)需求當(dāng)中就要求,必須用戶登錄之后才可以訪問系統(tǒng)當(dāng)中的數(shù)據(jù),當(dāng)我點(diǎn)擊登錄按鈕執(zhí)行登陸操作的時(shí)候,有一次請(qǐng)求響應(yīng),登陸完成之后進(jìn)入系統(tǒng),這一次請(qǐng)求響應(yīng)結(jié)束,接下來我再來訪問課程管理的數(shù)據(jù),而當(dāng)我點(diǎn)擊課程管理的時(shí)候,它就要去訪問課程的數(shù)據(jù),而在訪問課程數(shù)據(jù)的時(shí)候,我是需要知道這個(gè)用戶到底有沒有登錄的,如果登錄成功,我再給它返回課程的數(shù)據(jù),如果沒有登錄成功,是不允許訪問課程的數(shù)據(jù),由于登錄請(qǐng)求和訪問課程管理數(shù)據(jù)的這個(gè)請(qǐng)求是兩次不同的請(qǐng)求,而HTTP協(xié)議它又是無狀態(tài)的,在兩次請(qǐng)求之間,它是沒辦法共享數(shù)據(jù)的,那這也就造成了這一次課程管理的請(qǐng)求,它并不知道上一次用戶是否登錄成功了,那這就出現(xiàn)問題了。解決方案:web會(huì)話技術(shù)。
請(qǐng)求之間無法共享數(shù)據(jù)會(huì)引發(fā)的問題:- 如:京東購(gòu)物。加入購(gòu)物車和去購(gòu)物車結(jié)算是兩次請(qǐng)求
- 由于HTTP協(xié)議的無狀態(tài)特性,加入購(gòu)物車請(qǐng)求響應(yīng)結(jié)束后,并未記錄加入購(gòu)物車是何 商品
- 發(fā)起去購(gòu)物車結(jié)算的請(qǐng)求后,因?yàn)闊o法獲取哪些商品加入了購(gòu)物車,會(huì)導(dǎo)致此次請(qǐng)求無 法正確展示數(shù)據(jù)
剛才提到HTTP協(xié)議是規(guī)定了請(qǐng)求和響應(yīng)數(shù)據(jù)的格式,那具體的格式是什么呢?
重點(diǎn):請(qǐng)求數(shù)據(jù)的格式和響應(yīng)數(shù)據(jù)的格式
3.2 HTTP-請(qǐng)求協(xié)議
瀏覽器和服務(wù)器是按照HTTP協(xié)議進(jìn)行數(shù)據(jù)通信的。?
HTTP協(xié)議又分為:請(qǐng)求協(xié)議和響應(yīng)協(xié)議
-
請(qǐng)求協(xié)議:瀏覽器將數(shù)據(jù)以請(qǐng)求格式發(fā)送到服務(wù)器
-
包括:請(qǐng)求行、請(qǐng)求頭 、請(qǐng)求體
-
-
響應(yīng)協(xié)議:服務(wù)器將數(shù)據(jù)以響應(yīng)格式返回給瀏覽器
-
包括:響應(yīng)行 、響應(yīng)頭 、響應(yīng)體
-
在HTTP1.1版本中,瀏覽器訪問服務(wù)器的幾種方式:
| GET | 獲取資源。 向特定的資源發(fā)出請(qǐng)求。例:百度安全驗(yàn)證 |
| POST | 傳輸實(shí)體主體。 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例:上傳文件),數(shù)據(jù)被包含在請(qǐng)求體中。 |
| OPTIONS | 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方式。 因?yàn)椴⒉皇撬械姆?wù)器都支持規(guī)定的方法,為了安全有些服務(wù)器可能會(huì)禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用來詢問服務(wù)器支持的方法。 |
| HEAD | 獲得報(bào)文首部。 HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回?cái)?shù)據(jù)。通常用于確認(rèn)URI的有效性及資源更新時(shí)間等。 |
| PUT | 傳輸文件。 PUT方法用來傳輸文件。類似FTP協(xié)議,文件內(nèi)容包含在請(qǐng)求報(bào)文的實(shí)體中,然后請(qǐng)求保存到URL指定的服務(wù)器位置。 |
| DELETE | 刪除文件。 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源 |
| TRACE | 追蹤路徑。 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷 |
| CONNECT | 要求用隧道協(xié)議連接代理。 HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器 |
在我們實(shí)際應(yīng)用中常用的也就是 :GET、POST
- 請(qǐng)求協(xié)議指的就是請(qǐng)求數(shù)據(jù)的格式
- 那這個(gè)請(qǐng)求數(shù)據(jù)的格式,我們剛才已經(jīng)看到了,就是一些文本字符串
- 請(qǐng)求數(shù)據(jù)的格式分為三個(gè)部分:請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體?
- 第一個(gè)部分就是這個(gè)GET,POST,這是第一部分,那這個(gè)指的是請(qǐng)求方式。這個(gè)請(qǐng)求方式,之前在講解HTML的form表單的時(shí)候說過,這個(gè)表單的方式有兩種,一種是GET,一種是POST,那其實(shí)GET和POST就是HTTP的請(qǐng)求方式,當(dāng)然HTTP的請(qǐng)求方式有很多,我們這里先知道GET和POST就可以了。
- /請(qǐng)求路徑?請(qǐng)求參數(shù)? ? ? ?請(qǐng)求路徑和請(qǐng)求參數(shù)之間使用?連接
- 請(qǐng)求參數(shù)格式:參數(shù)名=參數(shù)值&參數(shù)名=參數(shù)值
- 請(qǐng)求方式之后,有一個(gè)空格,空格后面就是第二個(gè)部分的內(nèi)容:/brand/findAll請(qǐng)求路徑后面跟上的是請(qǐng)求的參數(shù),那這個(gè)部分指的是請(qǐng)求的資源路徑。
- 那資源路徑之后,又有一個(gè)空格,空格之后就是第三個(gè)部分:HTTP/1.1,這個(gè)代表的是協(xié)議以及協(xié)議的版本。
- 以上就是請(qǐng)求數(shù)據(jù)格式的第一部分請(qǐng)求行的格式。
? ? ? 2. 請(qǐng)求數(shù)據(jù)格式的第二個(gè)部分:請(qǐng)求頭(第二行開始,格式:key=value)
- 請(qǐng)求頭指的就是從第二行開始,一直到后面的這一部分?jǐn)?shù)據(jù),請(qǐng)求頭的格式是key:value形式的鍵值對(duì)。
- 前面的這個(gè)部分指的是請(qǐng)求頭的名字,后面這部分指的是請(qǐng)求頭對(duì)應(yīng)的值,中間使用:進(jìn)行分隔。
- http是個(gè)無狀態(tài)的協(xié)議,所以在請(qǐng)求頭設(shè)置瀏覽器的一些自身信息和想要響應(yīng)的形式。這樣服務(wù)器在收到信息后,就可以知道是誰,想干什么了
- 在請(qǐng)求頭當(dāng)中攜帶了很多的信息,包括瀏覽器的版本,請(qǐng)求的主機(jī)地址,請(qǐng)求的數(shù)據(jù)格式等等。
- ?接下來,介紹一下常見的請(qǐng)求頭它所代表的含義:
??
- Host:localhost:8080,代表的是我們要請(qǐng)求的是當(dāng)前本機(jī)的8080端口的服務(wù)。
- User-Agent:代表的是瀏覽器的版本,也就是說客戶端瀏覽器它得告訴服務(wù)器端,我當(dāng)前請(qǐng)求用的是哪一個(gè)瀏覽器,我的版本是什么。
- 那告訴服務(wù)器端這個(gè)瀏覽器版本有什么用呢?
- 這個(gè)地方一般會(huì)用于瀏覽器的兼容性處理。
- 因?yàn)槭忻嫔嫌泻芏嗟臑g覽器,而不同的瀏覽器它們的內(nèi)核是有差異的,這就造成了同一段程序在不同的瀏覽器解析出來,它的效果是不一樣的,這個(gè)呢,我們稱之為瀏覽器的兼容性問題。
- 那我們?cè)诜?wù)器端,如果拿到了客戶端瀏覽器的版本,我就可以有針對(duì)性的進(jìn)行處理,從而保證不論你采用什么樣的瀏覽器,你最終訪問到的效果都是一樣的,那這就是解決瀏覽器的兼容性問題。
- 而解決瀏覽器的兼容性問題,最核心的就是我們?cè)诜?wù)器端得拿到瀏覽器的版本。
- Accept:text/*:表示我瀏覽器期望接收的是一個(gè)文本;image/*:表示我瀏覽器期望接收的是一個(gè)圖片
- Accept-Language:zh-CN,比如我這里傳遞了一個(gè)zh-CN,這就相當(dāng)于我瀏覽器告訴服務(wù)器端,我瀏覽器期望接收到的是簡(jiǎn)體中文的語言。
- Accept-Encoding:gzip,代表我瀏覽器可以接收gzip的壓縮格式
- Content-Type:application/json,就代表請(qǐng)求體的格式,它是一個(gè)json格式的數(shù)據(jù)。
- Content-Length:161,就代表這個(gè)請(qǐng)求體的大小是161個(gè)字節(jié)。
?3. 請(qǐng)求數(shù)據(jù)格式的第三個(gè)部分:請(qǐng)求體(POST請(qǐng)求,存放請(qǐng)求參數(shù))
- 請(qǐng)求體是POST請(qǐng)求特有的一個(gè)組成部分,POST請(qǐng)求最后一個(gè)部分就是請(qǐng)求體,它是用來存放請(qǐng)求參數(shù)的。
- 在這個(gè)請(qǐng)求體和請(qǐng)求行之間是有一個(gè)空行存在的,通過一個(gè)空行將這兩部分分離開來- - (作用:用于標(biāo)記請(qǐng)求頭結(jié)束)。
- 而在POST請(qǐng)求里面,它就把請(qǐng)求參數(shù)放在了請(qǐng)求體這個(gè)位置,那之前我們?cè)谥v解HTML的form表單的時(shí)候,我們就介紹過,GET請(qǐng)求和POST請(qǐng)求的區(qū)別,在這里我們?cè)賮砘仡櫼幌?#xff1a;
- 在GET請(qǐng)求當(dāng)中,請(qǐng)求參數(shù)是在請(qǐng)求行當(dāng)中的,具體的表現(xiàn)形式,就是在請(qǐng)求路徑之后跟上?key=value,如果有多個(gè)參數(shù),后面再跟上&key=value的形式。而GET請(qǐng)求它是沒有請(qǐng)求體的,并且它的請(qǐng)求大小是有限制的。
- 而如果是POST請(qǐng)求,它的請(qǐng)求參數(shù)是攜帶在請(qǐng)求體當(dāng)中,它的請(qǐng)求大小沒有限制。
一. GET方式的請(qǐng)求協(xié)議:
請(qǐng)求行 :HTTP請(qǐng)求中的第一行數(shù)據(jù)。由:請(qǐng)求方式、資源路徑、協(xié)議/版本組成(之間使用空格分隔)
-
請(qǐng)求方式:GET
-
資源路徑:/brand/findAll?name=OPPO&status=1
-
請(qǐng)求路徑:/brand/findAll
-
請(qǐng)求參數(shù):name=OPPO&status=1
-
請(qǐng)求參數(shù)是以key=value形式出現(xiàn)
-
多個(gè)請(qǐng)求參數(shù)之間使用&連接
-
-
請(qǐng)求路徑和請(qǐng)求參數(shù)之間使用?連接
-
-
協(xié)議/版本:HTTP/1.1
請(qǐng)求頭 :第二行開始,上圖黃色部分內(nèi)容就是請(qǐng)求頭。格式為key: value形式
常見的HTTP請(qǐng)求頭有:
- Host: 表示請(qǐng)求的主機(jī)名
- User-Agent: 瀏覽器版本。 例如:Chrome瀏覽器的標(biāo)識(shí)類似Mozilla/5.0 ...Chrome/79 ,IE瀏覽器的標(biāo)識(shí)類似Mozilla/5.0 (Windows NT ...)like Gecko
- Accept:表示瀏覽器能接收的資源類型,如text/*,image/*或者*/*表示所有;
- Accept-Language:表示瀏覽器偏好的語言,服務(wù)器可以據(jù)此返回不同語言的網(wǎng)頁;
- Accept-Encoding:表示瀏覽器可以支持的壓縮類型,例如gzip, deflate等。
- Content-Type:請(qǐng)求主體的數(shù)據(jù)類型
- Content-Length:數(shù)據(jù)主體的大小(單位:字節(jié))
-
http是個(gè)無狀態(tài)的協(xié)議,所以在請(qǐng)求頭設(shè)置瀏覽器的一些自身信息和想要響應(yīng)的形式。這樣服務(wù)器在收到信息后,就可以知道是誰,想干什么了
舉例說明:服務(wù)器端可以根據(jù)請(qǐng)求頭中的內(nèi)容來獲取客戶端瀏覽器的相關(guān)信息,有了這些信息服務(wù)器端就可以處理不同的業(yè)務(wù)需求。
比如:
-
不同瀏覽器解析HTML和CSS標(biāo)簽的結(jié)果會(huì)有不一致,所以就會(huì)導(dǎo)致相同的代碼在不同的瀏覽器會(huì)出現(xiàn)不同的效果
-
服務(wù)器端根據(jù)客戶端請(qǐng)求頭中的數(shù)據(jù)獲取到客戶端的瀏覽器類型,就可以根據(jù)不同的瀏覽器設(shè)置不同的代碼來達(dá)到一致的效果(這就是我們常說的瀏覽器兼容問題)
請(qǐng)求體 :存儲(chǔ)請(qǐng)求參數(shù)
-
GET請(qǐng)求的請(qǐng)求參數(shù)在請(qǐng)求行中,故不需要設(shè)置請(qǐng)求體
二. POST方式的請(qǐng)求協(xié)議:
-
請(qǐng)求行(以上圖中紅色部分):包含請(qǐng)求方式、資源路徑、協(xié)議/版本
-
請(qǐng)求方式:POST
-
資源路徑:/brand
-
協(xié)議/版本:HTTP/1.1
-
-
請(qǐng)求頭(以上圖中黃色部分)
-
請(qǐng)求體(以上圖中綠色部分) :存儲(chǔ)請(qǐng)求參數(shù)
-
請(qǐng)求體和請(qǐng)求頭之間是有一個(gè)空行隔開(作用:用于標(biāo)記請(qǐng)求頭結(jié)束)
-
GET請(qǐng)求和POST請(qǐng)求的區(qū)別:
| 請(qǐng)求參數(shù) | 請(qǐng)求參數(shù)在請(qǐng)求行中。 例:/brand/findAll?name=OPPO&status=1 | 請(qǐng)求參數(shù)在請(qǐng)求體中 |
| 請(qǐng)求參數(shù)長(zhǎng)度 | 請(qǐng)求參數(shù)長(zhǎng)度有限制(瀏覽器不同限制也不同) | 請(qǐng)求參數(shù)長(zhǎng)度沒有限制 |
| 安全性 | 安全性低。原因:請(qǐng)求參數(shù)暴露在瀏覽器地址欄中。 | 安全性相對(duì)高 |
演示:GET請(qǐng)求與POST請(qǐng)求? ? ? ?
- 在IDEA當(dāng)中,我已經(jīng)準(zhǔn)備好了一個(gè)HTML頁面
- 在這個(gè)HTML頁面當(dāng)中我定義了兩個(gè)form表單,在這個(gè)form表單當(dāng)中的表單項(xiàng)是完全一致的,只是它們的提交方式不一樣,第一個(gè)表單它的提交方式是GET,第二個(gè)表單提交方式是POST
點(diǎn)擊IDEA的懸浮工具條,然后選擇一個(gè)瀏覽器打開?
GET方式提交:
POST方式提交:
3.3?HTTP-響應(yīng)協(xié)議
?3.1 格式介紹
- HTTP協(xié)議響應(yīng)數(shù)據(jù)的格式
- 響應(yīng)協(xié)議也就是響應(yīng)數(shù)據(jù)的格式,響應(yīng)數(shù)據(jù)的格式與請(qǐng)求數(shù)據(jù)的格式非常的類似,也是由三個(gè)部分組成的,分別是響應(yīng)行、響應(yīng)頭和響應(yīng)體
- 與HTTP的請(qǐng)求一樣,HTTP響應(yīng)的數(shù)據(jù)也分為3部分:響應(yīng)行、響應(yīng)頭 、響應(yīng)體
- 響應(yīng)行也是由三個(gè)部分組成的,響應(yīng)行由"協(xié)議及協(xié)議的版本"、"響應(yīng)狀態(tài)碼"、"狀態(tài)碼描述"組成。
-
協(xié)議/版本:HTTP/1.1
-
第一個(gè)部分就是HTTP/1.1,這個(gè)代表的是就是協(xié)議以及協(xié)議的版本
-
響應(yīng)狀態(tài)碼:200
-
第一部分之后有一個(gè)空格,空格之后是第二部分是一個(gè)數(shù)字,這個(gè)數(shù)字就代表了響應(yīng)的狀態(tài)碼,這個(gè)狀態(tài)碼指的就是服務(wù)器端要告訴客戶端這次響應(yīng)到底是怎么樣的狀態(tài),是成功還是失敗。這里所出現(xiàn)的200代表的是成功。
-
狀態(tài)碼描述:OK
-
第二個(gè)部分之后又有一個(gè)空格,空格之后是第三個(gè)部分,它是一個(gè)英文,這個(gè)英文就是用來描述前面的狀態(tài)碼的。這里的OK就代表成功了。
-
其實(shí)這個(gè)狀態(tài)碼有很多,而我們一般會(huì)將其分為五類,分別從100多一直到500多。
2.?響應(yīng)頭(以上圖中黃色部分):響應(yīng)數(shù)據(jù)的第二行開始。格式為key:value形式。
- 響應(yīng)頭當(dāng)中是用來描述響應(yīng)信息的。
- 從第二行開始以key:value形式體現(xiàn)出來的這一塊數(shù)據(jù)都是響應(yīng)頭的數(shù)據(jù)。
3.?響應(yīng)體(以上圖中綠色部分): 響應(yīng)數(shù)據(jù)的最后一部分。存儲(chǔ)響應(yīng)的數(shù)據(jù)
- 響應(yīng)體當(dāng)中存儲(chǔ)的就是響應(yīng)回來的數(shù)據(jù),響應(yīng)體是整個(gè)響應(yīng)數(shù)據(jù)的最后一個(gè)部分
- 跟請(qǐng)求體一樣,響應(yīng)體和響應(yīng)頭之間有一個(gè)空行隔開(作用:用于標(biāo)記響應(yīng)頭結(jié)束)
- 響應(yīng)體我們一般也叫響應(yīng)正文,這個(gè)里面所展示的這個(gè)JSON格式的數(shù)據(jù),就是響應(yīng)正文的內(nèi)容,將來,瀏覽器解析到這些數(shù)據(jù)之后,再配合著前端的代碼實(shí)現(xiàn),就可以展示對(duì)應(yīng)的頁面信息了。
響應(yīng)狀態(tài)碼:
- 響應(yīng)狀態(tài)碼的分類:
- 在HTTP協(xié)議當(dāng)中,響應(yīng)的狀態(tài)碼大概分為這么五類,分別是100多,200多,一直到500多。
- 100多代表的是響應(yīng)中,它是一個(gè)臨時(shí)狀態(tài)碼。
- 其實(shí)就是說,服務(wù)器端已經(jīng)接收到了客戶端的請(qǐng)求,但是服務(wù)器端發(fā)現(xiàn)客戶端的請(qǐng)求還沒有發(fā)送完整,服務(wù)器端先給客戶端一個(gè)臨時(shí)的響應(yīng)狀態(tài)碼,告訴客戶端你要繼續(xù)發(fā)送完整的請(qǐng)求數(shù)據(jù)。
- 這一類的響應(yīng)狀態(tài)碼比較少見,大家在后面的項(xiàng)目當(dāng)中可能會(huì)用到一個(gè)技術(shù)叫Web Socket,拿使用Web Socket的時(shí)候,就會(huì)發(fā)現(xiàn)它的狀態(tài)碼就是100多,是101,目前這個(gè)了解即可。
- 200多這個(gè)狀態(tài)碼代表的是成功,成功的意思是這一次的請(qǐng)求響應(yīng)已經(jīng)被成功的接收和處理了,已經(jīng)處理完成了,那我給你返回一個(gè)200多。客戶端發(fā)送了請(qǐng)求,服務(wù)端已經(jīng)成功的處理了這個(gè)請(qǐng)求并且響應(yīng)也是成功的,那這個(gè)是我們最想看到的狀態(tài)碼,這也是每一個(gè)軟件工程開發(fā)師的幸運(yùn)數(shù)字。
- 那這個(gè)狀態(tài)碼是我們開發(fā)人員最希望看到的一個(gè)狀態(tài)碼。
- 第三類是300多,300多代表的是重定向的狀態(tài)碼。
- 所謂重定向它的含義指的是這里呢,有一個(gè)客戶端瀏覽器,客戶端瀏覽器要去訪問A服務(wù)器上的資源,接下來呢,它要發(fā)送請(qǐng)求到A服務(wù)器,但是這個(gè)資源已經(jīng)被我挪到了另外一個(gè)服務(wù)器B服務(wù)器當(dāng)中,那么此時(shí)A服務(wù)器就可以給瀏覽器返回一個(gè)狀態(tài)碼就是300多,并且呢,在這個(gè)狀態(tài)碼里面告訴瀏覽器,你再去訪問B服務(wù)器上的這個(gè)資源就可以,那此時(shí)瀏覽器拿到響應(yīng)回來的狀態(tài)碼以及響應(yīng)回來的這個(gè)路徑之后,接下來,瀏覽器會(huì)自動(dòng)的再去請(qǐng)求B服務(wù)器上的資源,從而獲得響應(yīng)數(shù)據(jù),那這個(gè)過程是瀏覽器自動(dòng)完成的,那這個(gè)呢,我們就稱之為重定向。
- 當(dāng)然,在這幅圖當(dāng)中A和B有可能是同一臺(tái)服務(wù)器,只是資源的位置不用而已。
- 接下來的這兩類狀態(tài)碼400多和500多比較常見也比較重要,它們都代表的是錯(cuò)誤的情況。
- 那將來我們?cè)陂_發(fā)項(xiàng)目的時(shí)候,只有你知道了這些狀態(tài)碼的含義,你才能夠知道具體的錯(cuò)誤到底出現(xiàn)在什么位置,我們才能夠知道怎么來解決這些錯(cuò)誤。
- 400多代表的是客戶端錯(cuò)誤。
- 客戶端錯(cuò)誤指的是處理發(fā)生錯(cuò)誤了,責(zé)任是在客戶端的。比如,我們隨便在瀏覽器的地址欄當(dāng)中輸入一個(gè)地址,那這個(gè)地址如果不存在,此時(shí)就會(huì)出現(xiàn)一個(gè)狀態(tài)碼,那就是400多,那一旦出現(xiàn)了400多的狀態(tài)碼,那我就知道,這個(gè)問題是在客戶端。那我就需要去檢查客戶端的請(qǐng)求路徑,檢查客戶端的請(qǐng)求參數(shù),然后把它們改正確就可以了。
- 最后一類500多指的是服務(wù)器錯(cuò)誤。
- 服務(wù)器錯(cuò)誤代表的是如果將來處理發(fā)生錯(cuò)誤,責(zé)任在服務(wù)端。
- 那比如我們?cè)谠L問我們的Web程序時(shí),由于代碼的Bug出現(xiàn)了一個(gè)異常,那此時(shí)就會(huì)響應(yīng)一個(gè)500多的狀態(tài)碼,那看到這個(gè)狀態(tài)碼之后,我們就知道這個(gè)問題出現(xiàn)在服務(wù)端,那我需要去檢查一下服務(wù)端的日志,去看一下是否有異常產(chǎn)生,然后再依據(jù)異常的堆棧信息,把對(duì)應(yīng)的異常解決掉就可以了。
常見的響應(yīng)狀態(tài)碼:
- 200它表示的是OK,OK它所代表的意思就是客戶端發(fā)送了請(qǐng)求,服務(wù)端已經(jīng)成功的處理了這個(gè)請(qǐng)求并且響應(yīng)也是成功的。這個(gè)是我們最想看到的狀態(tài)碼,也是每一個(gè)軟件開發(fā)工程師的幸運(yùn)數(shù)字。
- 302表示的是重定向,就是說客戶端瀏覽器請(qǐng)求的資源已經(jīng)轉(zhuǎn)移到了另外一個(gè)位置,那這個(gè)位置,我服務(wù)器可以通過一個(gè)響應(yīng)頭Location返回給你,告訴你對(duì)應(yīng)的URL地址,那么瀏覽器拿到這個(gè)狀態(tài)碼之后并且拿到了響應(yīng)頭Location,它就會(huì)自動(dòng)的去請(qǐng)求Location這個(gè)響應(yīng)頭對(duì)應(yīng)的請(qǐng)求路徑,然后再去獲取這個(gè)頁面的資源,那這就是302狀態(tài)碼。
- 還有一個(gè)304狀態(tài)碼,它的意思就是服務(wù)器端要告訴客戶端你所請(qǐng)求的這個(gè)資源自上次請(qǐng)求以后我服務(wù)器端并沒有做任何的修改,你可以直接去訪問你自己的本地緩存就可以了,就不用再訪問服務(wù)器再來獲取這個(gè)資源了。那此時(shí),服務(wù)器的壓力就減輕了,因?yàn)榫筒淮嬖跀?shù)據(jù)傳輸?shù)倪^程了。
- 400表示的是Bad? Request,Bad Request指的就是客戶端的請(qǐng)求語法有錯(cuò)誤,不能被服務(wù)器理解,比如客戶端所傳遞的請(qǐng)求參數(shù),格式錯(cuò)誤等等,那此時(shí)就會(huì)出現(xiàn)400這個(gè)狀態(tài)碼。
- 403指的是服務(wù)器端接收到了請(qǐng)求,但是拒絕訪問,一般來說,都是因?yàn)槟銢]有權(quán)限來訪問這個(gè)資源,那我就給你返回一個(gè)403。
- 404是我們將來所見到的客戶端最為常見的一個(gè)錯(cuò)誤,叫Not? Found,Not? Found代表的是你所請(qǐng)求的資源不存在,那一般呢,就是我們輸入的請(qǐng)求路徑是有誤的,或者網(wǎng)站資源被刪除了,找不到這個(gè)網(wǎng)站資源了。
- 405代表的是請(qǐng)求方式有誤。比如,我們服務(wù)端所提供的這個(gè)請(qǐng)求的資源,它要求必須以GET方式來請(qǐng)求,而我們使用的是POST的請(qǐng)求方式,那這個(gè)時(shí)候,就會(huì)出現(xiàn)405,請(qǐng)求的方法不被允許。
- 428代表的是服務(wù)器要求有條件的請(qǐng)求。那這個(gè)指的意思就是說當(dāng)我們?nèi)ピL問一個(gè)服務(wù)端的資源的時(shí)候,它要求我們必須要攜帶對(duì)應(yīng)的一些條件,比如我們要攜帶一些特定的請(qǐng)求頭,如果我攜帶了這個(gè)請(qǐng)求頭,它才允許我訪問,那如果我們沒有攜帶,那此時(shí)就會(huì)返回一個(gè)狀態(tài)碼428。
- 429代表的是請(qǐng)求數(shù)太多了,那這個(gè)代表的是用戶在指定的時(shí)間內(nèi)發(fā)送了太多的請(qǐng)求,造成服務(wù)器的壓力比較大,那這個(gè)時(shí)候就會(huì)出現(xiàn)429。429可以配合這一個(gè)響應(yīng)頭叫做Retry-After,代表的是在多長(zhǎng)時(shí)間以后,我們可以再次嘗試請(qǐng)求。
- 431指的就是我們所請(qǐng)求的數(shù)據(jù),請(qǐng)求頭的字段太多了,服務(wù)器不愿意處理。
- 500也是我們將來見的比較多的一類狀態(tài)碼,如果是5開頭的,都代表的是服務(wù)器端異常。
- 500代表的是服務(wù)器端發(fā)生了不可預(yù)期的錯(cuò)誤,一般都是服務(wù)器端拋異常了,那如果出現(xiàn)500,我們就需要去看一下服務(wù)器端的日志,來看一下在控制臺(tái)當(dāng)中是不是出現(xiàn)了異常,如果出現(xiàn)異常,我們需要去解決這個(gè)問題。500代表的是服務(wù)器端發(fā)生了異常或者是錯(cuò)誤。
- 503指的是服務(wù)器尚未準(zhǔn)備好處理請(qǐng)求。比如我們服務(wù)器剛剛啟動(dòng),我還沒有啟動(dòng)完成呢,瀏覽器發(fā)起了一個(gè)請(qǐng)求,那此時(shí)就會(huì)報(bào)出503。
| 200 | OK | 客戶端請(qǐng)求成功,即處理成功,這是我們最想看到的狀態(tài)碼 |
| 302 | Found | 指示所請(qǐng)求的資源已移動(dòng)到由Location響應(yīng)頭給定的 URL,瀏覽器會(huì)自動(dòng)重新訪問到這個(gè)頁面 |
| 304 | Not Modified | 告訴客戶端,你請(qǐng)求的資源至上次取得后,服務(wù)端并未更改,你直接用你本地緩存吧。隱式重定向 |
| 400 | Bad Request | 客戶端請(qǐng)求有語法錯(cuò)誤,不能被服務(wù)器所理解 |
| 403 | Forbidden | 服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù),比如:沒有權(quán)限訪問相關(guān)資源 |
| 404 | Not Found | 請(qǐng)求資源不存在,一般是URL輸入有誤,或者網(wǎng)站資源被刪除了 |
| 405 | Method Not Allowed | 請(qǐng)求方式有誤,比如應(yīng)該用GET請(qǐng)求方式的資源,用了POST |
| 428 | Precondition Required | 服務(wù)器要求有條件的請(qǐng)求,告訴客戶端要想訪問該資源,必須攜帶特定的請(qǐng)求頭 |
| 429 | Too Many Requests | 指示用戶在給定時(shí)間內(nèi)發(fā)送了太多請(qǐng)求(“限速”),配合 Retry-After(多長(zhǎng)時(shí)間后可以請(qǐng)求)響應(yīng)頭一起使用 |
| 431 | Request Header Fields Too Large | 請(qǐng)求頭太大,服務(wù)器不愿意處理請(qǐng)求,因?yàn)樗念^部字段太大。請(qǐng)求可以在減少請(qǐng)求頭域的大小后重新提交。 |
| 500 | Internal Server Error | 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。服務(wù)器出異常了,趕緊看日志去吧 |
| 503 | Service Unavailable | 服務(wù)器尚未準(zhǔn)備好處理請(qǐng)求,服務(wù)器剛剛啟動(dòng),還未初始化好 |
?常見的HTTP響應(yīng)頭有:
- Content-Type:表示該響應(yīng)內(nèi)容的類型。比如我們這里響應(yīng)了一個(gè)內(nèi)容,它的類型是一個(gè)json,所以在Content-Type這一欄顯示的就是:application/json。那將來客戶端瀏覽器獲取到這個(gè)數(shù)據(jù)之后,它就會(huì)按照json格式的數(shù)據(jù)來處理。
- Content-Length:指的是響應(yīng)內(nèi)容的長(zhǎng)度(單位是字節(jié))。那通過這個(gè)響應(yīng)頭客戶端就能知道服務(wù)器給我響應(yīng)回來的數(shù)據(jù)它的長(zhǎng)度到底是多長(zhǎng)。
- Content-Encoding:表示該響應(yīng)數(shù)據(jù)的壓縮算法。比如我們這里設(shè)置了一個(gè)gzip,那這就表示服務(wù)器端在傳輸數(shù)據(jù)的時(shí)候采用的是gziip的算法進(jìn)行壓縮的,那將來客戶端拿到數(shù)據(jù)之后也要使用gzip的算法來進(jìn)行解壓縮。
- Cache-Control:指示客戶端應(yīng)如何緩存。緩存的意思就是你第一次在訪問的時(shí)候你訪問服務(wù)器,把服務(wù)器返回的數(shù)據(jù),緩存在瀏覽器本地,下一次你再來訪問的時(shí)候,你就不用再請(qǐng)求服務(wù)器了,你直接讀本地的文件,這樣速度會(huì)更快一些,而且也會(huì)降低服務(wù)器端的壓力。在設(shè)置客戶端如何緩存的時(shí)候,可以設(shè)置這么一塊信息,叫做max-age=300,這就代表我緩存這一塊的這個(gè)數(shù)據(jù),最多只存儲(chǔ)300秒,300秒之后緩存的數(shù)據(jù)就沒了,那我就需要再次請(qǐng)求服務(wù)器端再來獲取數(shù)據(jù)。
- Set-Cookie: 告訴瀏覽器為當(dāng)前頁面所在的域設(shè)置cookie。什么是cookie在后面介紹Web會(huì)話技術(shù)的時(shí)候再來詳細(xì)介紹。(cookie是指儲(chǔ)存在用戶本地終端上的數(shù)據(jù),是基于網(wǎng)絡(luò)瀏覽器的一種機(jī)制,它的作用是存儲(chǔ)用戶的上網(wǎng)行為信息,以便在以后的網(wǎng)頁瀏覽中給予相應(yīng)的個(gè)性化服務(wù)。)
?3.4?HTTP-協(xié)議解析
- HTTP協(xié)議的解析就是根據(jù)HTTP的請(qǐng)求格式來解析請(qǐng)求數(shù)據(jù)以及響應(yīng)數(shù)據(jù)。
- 解析HTTP協(xié)議,其實(shí)分為兩個(gè)部分,一個(gè)是客戶端,一個(gè)是服務(wù)端。
- 而對(duì)于客戶端瀏覽器,各大廠商已經(jīng)給我們提供了,它里面就內(nèi)置了解析HTTP協(xié)議的程序,我們不需要操作。我們作為一名服務(wù)端開發(fā)工程師,需要做的就是在服務(wù)器端通過Java程序來接收客戶端瀏覽器發(fā)起的請(qǐng)求,并獲取請(qǐng)求數(shù)據(jù),然后,再參照HTTP協(xié)議的請(qǐng)求數(shù)據(jù)格式對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行解析,然后還需要參照HTTP協(xié)議的響應(yīng)數(shù)據(jù)格式給瀏覽器再響應(yīng)對(duì)應(yīng)的數(shù)據(jù)。
- 剛才我們提到在瀏覽器里面就已經(jīng)內(nèi)置了解析HTTP協(xié)議的程序,那瀏覽器獲取到響應(yīng)回來的數(shù)據(jù)之后會(huì)自動(dòng)解析,從而完成這一次請(qǐng)求響應(yīng)。
- 接下來我們就需要去研究一下,在服務(wù)器端我們?cè)趺礃咏馕鯤TTP的數(shù)據(jù),并且給瀏覽器響應(yīng)數(shù)據(jù)。
- 其實(shí)按照我們目前的知識(shí)儲(chǔ)備,我們是可以把這個(gè)程序?qū)懗鰜淼摹T赥CP網(wǎng)絡(luò)編程這樣的技術(shù)中,我們可以通過Socket以及Server Socket就可以寫出一個(gè)服務(wù)器端的程序了,然后瀏覽器就可以來發(fā)送HTTP的請(qǐng)求,我們就可以通過ServerSocket來接收客戶端發(fā)起的這個(gè)請(qǐng)求,那接收到請(qǐng)求之后,我們就可以獲取到這個(gè)請(qǐng)求的數(shù)據(jù),那讀取出來的請(qǐng)求數(shù)據(jù)呢就是一些字符串,而這個(gè)字符串,它的格式我們前面學(xué)過是固定的,那我們就可以按照字符串的組成規(guī)則來解析它,同理,我們也可以通過ServerSocket來獲取到輸出流,然后就可以按照HTTP響應(yīng)數(shù)據(jù)的格式給瀏覽器,響應(yīng)一個(gè)固定格式的字符串,那這樣呢,就完成了一次網(wǎng)絡(luò)請(qǐng)求。
- 服務(wù)器是可以使用java完成編寫,是可以接受頁面發(fā)送的請(qǐng)求和響應(yīng)數(shù)據(jù)給前端瀏覽器的,而在開發(fā)中真正用到的Web服務(wù)器,我們不會(huì)自己寫的,都是使用目前比較流行的web服務(wù)器。如:Tomcat
- 我們所開發(fā)的Web程序要解析HTTP協(xié)議,那其他所有的Web項(xiàng)目要開發(fā),也都需要去解析HTTP協(xié)議,而HTTP協(xié)議它是標(biāo)準(zhǔn)的,是統(tǒng)一固定的,所以這部分解析HTTP協(xié)議的代碼也是非常通用的,所以有很多公司已經(jīng)把這些代碼都已經(jīng)寫好了,而且還封裝到了一個(gè)軟件程序當(dāng)中供我們來使用,而這個(gè)軟件就是我們所說的Web服務(wù)器。
- Web服務(wù)器軟件有很多,其中最為流行也是最受歡迎的就是阿帕奇基金會(huì)下的Tomcat服務(wù)器。
- 這些Web服務(wù)器本質(zhì)上就是一個(gè)軟件程序,就是對(duì)HTTP協(xié)議進(jìn)行了封裝,使程序員不必直接對(duì)HTTP協(xié)議進(jìn)行操作,因?yàn)楫吘故潜容^繁瑣的,也就是說,如果有了這些Web服務(wù)器,HTTP協(xié)議的解析和處理的代碼,我們都不用去做了,開發(fā)人員只需要關(guān)注我們當(dāng)前項(xiàng)目的業(yè)務(wù)實(shí)現(xiàn)邏輯就可以了,這樣使得Web程序的開發(fā)更加簡(jiǎn)單,更加便捷,也更加高效。
3. Web服務(wù)器-Tomcat
- Web服務(wù)器的主要功能就是提供網(wǎng)上信息的瀏覽服務(wù)。也就是說我們只需要在我們的服務(wù)器當(dāng)中安裝一個(gè)Web服務(wù)器,比如當(dāng)前最為流行的Tomcat,然后我們就可以將我們開發(fā)好的Web應(yīng)用部署在Tomcat服務(wù)器上,然后啟動(dòng)服務(wù)器之后,我們就可以打開瀏覽器直接訪問到部署在Tomcat服務(wù)器上的應(yīng)用程序。
- 基于Tomcat服務(wù)器訪問到的頁面資源。
3.1 Tomcat簡(jiǎn)介
- ?官網(wǎng):Apache Tomcat? - Welcome!
- ?開源指的是開放源代碼,源代碼開放出來我們就可以根據(jù)自己的需求來定制Tomcat服務(wù)器。
- Java語言的三大分支:JavaSE:Java標(biāo)準(zhǔn)版? ?JavaME:Java小型版? JavaEE:Java企業(yè)版
- JavaME指的是Java小型版,Java小型版主要是用來開發(fā)一些嵌入式設(shè)備的應(yīng)用,比如像手機(jī),車載設(shè)備等等。
- JavaEE:Java企業(yè)版,它是一系列企業(yè)級(jí)開發(fā)技術(shù)的總和,也就是說我們將來開發(fā)一個(gè)企業(yè)級(jí)的項(xiàng)目,?會(huì)用到很多的技術(shù),而這些技術(shù)都有著對(duì)應(yīng)的規(guī)范和標(biāo)準(zhǔn),這些技術(shù)規(guī)范總結(jié)起來一共有13項(xiàng),我們通稱為JavaEE規(guī)范。
- 而在這些規(guī)范當(dāng)中,有很多的規(guī)范其實(shí)已經(jīng)過時(shí)了,比如像EJB,現(xiàn)在已經(jīng)被Spring替代了,還有像Servlet,JSP這樣的技術(shù),現(xiàn)在基于Servlet進(jìn)行項(xiàng)目開發(fā)基本上已經(jīng)很少了,取而代之的是一些基于Servet封裝的高級(jí)框架。
- JavaEE的13項(xiàng)技術(shù)規(guī)范里面Tomcat只支持Servlet和JSP等少量的JavaEE規(guī)范。
- 而正是因?yàn)門omcat只支持少量的JavaEE規(guī)范,所以呢它是一個(gè)輕量級(jí)的Web服務(wù)器。
- 不像WebLogic、WebSphere這些服務(wù)器,它支持全部的JavaEE規(guī)范,所以它們是重量級(jí)的Web服務(wù)器。
- 正是因?yàn)門omcat是一個(gè)輕量級(jí)的Web服務(wù)器,所以Tomcat我們也稱之為Web容器。
- Servlet它是基于Servlet規(guī)范開發(fā)出來的一種Web資源,這個(gè)Servlet程序它是不能夠獨(dú)立運(yùn)行的,它是需要依賴于支持Servlet規(guī)范的這種Web服務(wù)器才可以運(yùn)行,那Tomcat就支持了Servlet規(guī)范,所以這個(gè)Tomcat我們也稱為Servlet容器。
?小結(jié):
1. Web服務(wù)器
- Web服務(wù)器本質(zhì)上就是一個(gè)軟件程序,就是對(duì)HTTP協(xié)議進(jìn)行了封裝,使程序員不必直接對(duì)HTTP協(xié)議進(jìn)行操作,因?yàn)楫吘故潜容^繁瑣的,也就是說,如果有了這些Web服務(wù)器,HTTP協(xié)議的解析和處理的代碼,我們都不用去做了,開發(fā)人員只需要關(guān)注我們當(dāng)前項(xiàng)目的業(yè)務(wù)實(shí)現(xiàn)邏輯就可以了,這樣使得Web程序的開發(fā)更加簡(jiǎn)單,更加便捷,也更加高效。
- Web服務(wù)器可以用來部署我們開發(fā)好的Web項(xiàng)目,對(duì)外提供網(wǎng)上信息瀏覽服務(wù)。
2. Tomcat
- Tomcat是一個(gè)輕量級(jí)的Web服務(wù)器,支持Servlet以及JSP等少量的JavaEE規(guī)范。
- 所以Tomcat也被稱為Web容器或者Servelet容器。
?3.2?Tomcat服務(wù)器的基本使用
基本使用就包括Tomcat的下載,安裝,卸載,啟動(dòng),訪問,部署等一系列的操作。
1. 下載
- 直接從官方網(wǎng)站下載:Apache Tomcat? - Apache Tomcat 9 Software Downloads
-
Tomcat軟件類型說明:
- tar.gz文件,是linux和mac操作系統(tǒng)下的壓縮版本
- zip文件,是window操作系統(tǒng)下壓縮版本(我們選擇zip文件)
2. 安裝與卸載
安裝: Tomcat是綠色版,直接解壓即安裝
- 注意,Tomcat在解壓縮的時(shí)候,解壓所在的目錄最好解壓到一個(gè)不包含中文和空格的目錄,因?yàn)楹笃谠诓渴痦?xiàng)目的時(shí)候,如果路徑有中文或者空格可能會(huì)導(dǎo)致程序部署失敗。
打開apache-tomcat-9.0.27目錄就能看到如下目錄結(jié)構(gòu),每個(gè)目錄中包含的內(nèi)容需要認(rèn)識(shí)下
?
bin:目錄下有兩類文件,一種是以".bat"結(jié)尾的,是Windows系統(tǒng)的可執(zhí)行文件,一種是? ? ? ? ? ? ? ? ? ? ? 以".sh"結(jié)尾的,是Linux系統(tǒng)的可執(zhí)行文件。
- bin目錄存放的是可執(zhí)行文件,conf存放的是Tomcat當(dāng)中的配置文件。
- 第三個(gè)lib目錄存放的是Tomcat依賴的jar包,因?yàn)門omcat是基于Java語言開發(fā)的。
- logs目錄存放的是日志文件,Tomcat運(yùn)行所產(chǎn)生的一些日志,都存放在logs這個(gè)文件夾下。
- webapps存放的是應(yīng)用程序的發(fā)布目錄,也就是說我們要部署應(yīng)用程序,就需要將應(yīng)用程序放在webapps這個(gè)目錄下。webapps:就是以后項(xiàng)目部署的目錄
- work是Tomcat的工作目錄
卸載:卸載比較簡(jiǎn)單,可以直接刪除目錄即可
3. 啟動(dòng)與關(guān)閉
啟動(dòng):
啟動(dòng)Tomcat只需要訪問bin目錄下的一個(gè)腳本文件startup.bat,直接雙擊該腳本就可以將Tomcat啟動(dòng)起來。
- 我們可以看到Tomcat在運(yùn)行過程當(dāng)中輸出的一些日志,在輸出的日志里面中文亂碼了,這hi是因?yàn)樵赥omcat默認(rèn)的配置當(dāng)中,控制臺(tái)輸出日志這一塊兒的編碼它默認(rèn)是UTF-8,我們把這個(gè)選項(xiàng)改為GBK就可以了。
- ?將編碼從默認(rèn)的UTF-8改為GBK
- Tomcat運(yùn)行起來之后默認(rèn)占用的端口是8080,8080是Tomcat默認(rèn)的端口號(hào)
?
- 訪問這一臺(tái)Tomcat
- Tomcat的默認(rèn)端口為8080,所以在瀏覽器的地址欄輸入:http://127.0.0.1:8080?即可訪問tomcat服務(wù)器
- 127.0.0.1 也可以使用localhost代替。如:http://localhost:8080
- 能看到以上圖片(Tomcat服務(wù)器的歡迎頁面)中Apache Tomcat的內(nèi)容就說明Tomcat已經(jīng)啟動(dòng)成功
?注意: tomcat服務(wù)器啟動(dòng)后,黑窗口不會(huì)關(guān)閉,只要黑窗口不關(guān)閉,就證明tomcat服務(wù)器正在運(yùn)行
?關(guān)閉: 關(guān)閉有三種方式
1、強(qiáng)制關(guān)閉:直接×掉Tomcat運(yùn)行窗口(不建議)
?2、正常關(guān)閉:bin\shutdown.bat
3、正常關(guān)閉:在Tomcat啟動(dòng)窗口中按下 Ctrl+C
-
說明:如果按下Ctrl+C沒有反映,可以多按幾次
4.?常見問題
問題1:Tomcat啟動(dòng)時(shí),窗口一閃而過
-
檢查JAVA_HOME環(huán)境變量是否正確配置
?問題2:端口號(hào)沖突
- BindException:端口號(hào)沖突
- 在一臺(tái)主機(jī)上端口號(hào)是不能重復(fù)的
- 發(fā)生問題的原因:Tomcat使用的端口被占用了。
-
解決方案:換Tomcat端口號(hào)
-
要想修改Tomcat啟動(dòng)的端口號(hào),需要修改 conf/server.xml文件
-
注: HTTP協(xié)議默認(rèn)端口號(hào)為80,如果將Tomcat端口號(hào)改為80,則將來訪問Tomcat時(shí),將不? ? ? ? 用輸入端口號(hào)。
?Tomcat 部署項(xiàng)目: 將項(xiàng)目放置到 webapps 目錄下, 即部署完成
?演示所部署的應(yīng)用:
3.3 入門程序解析
基于本次的核心技術(shù)點(diǎn)SpringBoot快速入門案例進(jìn)行分析。
3.3.1 Spring官方骨架
- 之前我們?cè)贗DEA創(chuàng)建的SpringBoot入門案例,是基于Spring官方提供的骨架實(shí)現(xiàn)的。
- Spring官方骨架,可以理解為Spring官方為程序員提供一個(gè)搭建項(xiàng)目的模板。
Spring Initializrhttps://start.spring.io/
- ?我們可以通過訪問:Spring Initializr,進(jìn)入到官方骨架頁面
- ?這個(gè)是我們進(jìn)行Web程序開發(fā)所需要的依賴,我們開發(fā)Web應(yīng)用,只需要這一個(gè)依賴就可以? 了。
?Spring官方生成的SpringBoot項(xiàng)目,怎么使用呢?
-
解壓縮后,就會(huì)得到一個(gè)SpringBoot項(xiàng)目工程
- ?打開pom.xml文件,我們可以看到springboot項(xiàng)目中引入了web依賴和test依賴
- 另一個(gè)test依賴是我們創(chuàng)建Spring Boot項(xiàng)目它默認(rèn)給我們加入進(jìn)來的依賴,這個(gè)依賴是單元測(cè)試所需要的依賴。
?結(jié)論:不論使用IDEA創(chuàng)建SpringBoot項(xiàng)目,還是直接在官方網(wǎng)站利用骨架生成SpringBoot項(xiàng)? ? ? ? ? ? ? ? ? 目,項(xiàng)目的結(jié)構(gòu)和pom.xml文件中內(nèi)容是相似的。
- 我們?cè)贗DEA當(dāng)中去創(chuàng)建這個(gè)Spring Boot項(xiàng)目的時(shí)候,其實(shí)就是關(guān)聯(lián)的是官方的這個(gè)模板,所 以,我們?cè)趧?chuàng)建Spring Boot項(xiàng)目的時(shí)候,它是需要聯(lián)網(wǎng)的,
3.3.2 起步依賴
- 在我們之前講解的SpringBoot快速入門案例中,同樣也引用了:web依賴和test依賴
- spring-boot-starter-web和spring-boot-starter-test,在SpringBoot中又稱為:起步依賴
- 而在SpringBoot的項(xiàng)目中,有很多的起步依賴,他們有一個(gè)共同的特征:就是以"spring-boot-starter-"作為開頭。
- 在以后大家遇到spring-boot-starter-xxx這類的依賴,都為起步依賴。
- 而每一個(gè)起步依賴都用于開發(fā)特定的功能。
- 起步依賴是一種比較特殊的Maven依賴,它利用了Maven當(dāng)中的依賴傳遞特性,把開發(fā)某一個(gè)功能所需要的常見依賴就聚合在了一起。
- 比如web依賴它就把Web開發(fā)所需要的一些常見的依賴都聚合在了這一個(gè)模塊當(dāng)中,那我們進(jìn)行Web開發(fā),我們只需要引入這一個(gè)web開發(fā)的起步依賴就可以了,通過Maven的依賴傳遞就會(huì)將其他的依賴全部傳遞下來。
- 起步依賴的好處:? 簡(jiǎn)化依賴配置,利用Maven當(dāng)中的依賴傳遞特性,引入這一個(gè)依賴,就相? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當(dāng)于引入了這一塊兒業(yè)務(wù)開發(fā)所需要的全部依賴
起步依賴有什么特殊之處呢,這里我們以入門案例中引入的起步依賴做為講解:
-
spring-boot-starter-web:包含了web應(yīng)用開發(fā)所需要的常見依賴
-
spring-boot-starter-test:包含了單元測(cè)試所需要的常見依賴
- spring-boot-starter-web內(nèi)部把關(guān)于Web開發(fā)所有的依賴都已經(jīng)導(dǎo)入并且指定了版本,只需引入 spring-boot-starter-web 依賴就可以實(shí)現(xiàn)Web開發(fā)的需要的功能
- Spring的官方提供了很多現(xiàn)成的starter(起步依賴),我們?cè)陂_發(fā)相關(guān)應(yīng)用時(shí),只需要引入對(duì)應(yīng)的starter即可。
- 在Spring的官方當(dāng)中,提供了很多的起步依賴,比如后面要用到的aop,redis等...
- 官方地址:https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#using.build-systems.starters
Spring Boot Reference Documentationhttps://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#web
- 每一個(gè)起步依賴,都用于開發(fā)一個(gè)特定的功能。
- 舉例:當(dāng)我們開發(fā)中需要使用redis數(shù)據(jù)庫(kù)時(shí),只需要在SpringBoot項(xiàng)目中,引入:spring-? ? ? ? ? ? ? ? ? ?boot-starter-redis ,即可導(dǎo)入redis開發(fā)所需要的依賴。
3.3.2 SpringBoot父工程
- 在我們之前開發(fā)的SpringBoot入門案例中,?我們所創(chuàng)建出來的這個(gè)Spring Boot工程,在pom.xml當(dāng)中我們通過maven引入這個(gè)起步依賴的時(shí)候,它是沒有加入version版本號(hào)的,是沒有指定具體的依賴版本號(hào)的。
為什么沒有指定<version>版本號(hào),可以正常使用呢?
- 因?yàn)槊恳粋€(gè)SpringBoot工程 / 項(xiàng)目,都有一個(gè)統(tǒng)一的父工程,也就是上面所配置的這個(gè)parent,這個(gè)parent它是Spring Boot的父工程,所有的Spring Boot工程都需要繼承自這樣的一個(gè)父工程,而在Spring Boot工程當(dāng)中,這些起步依賴的版本都在這個(gè)父工程當(dāng)中已經(jīng)進(jìn)行了統(tǒng)一管理。
- 父工程指定了版本號(hào)后,就會(huì)自動(dòng)的引入和所指定版本對(duì)應(yīng)的起步依賴。
- 依賴的版本號(hào),在父工程中進(jìn)行統(tǒng)一管理。
- 比如你選擇了Spring Boot的版本是2.7.4,并且已經(jīng)配置好了這個(gè)父工程,那Spring Boot就會(huì)自動(dòng)的給你引入與這個(gè)2.7.4版本對(duì)應(yīng)的起步依賴。
3.3.3 內(nèi)嵌Tomcat
- 我們進(jìn)行web程序的開發(fā),只需要引入web開發(fā)的起步依賴就可以了。
- 而當(dāng)我們引入了web開發(fā)的起步依賴之后,我們會(huì)看到,通過Maven的依賴傳遞,傳遞了這么一項(xiàng)依賴,叫spring-boot-starter-tomcat,這個(gè)是Tomcat的相關(guān)依賴,那也就是說,在Spring Boot Web開發(fā)環(huán)境當(dāng)中,它已經(jīng)將Tomcat集成進(jìn)來(也就是引入spring-boot-starter-web起步依賴 ),其內(nèi)部已經(jīng)集成了內(nèi)置了Tomcat服務(wù)器。
-
我們可以通過IDEA開發(fā)工具右側(cè)的maven面板中,就可以看到當(dāng)前工程引入的依賴。其中已經(jīng)將Tomcat的相關(guān)依賴傳遞下來了,也就是說在SpringBoot中可以直接使用Tomcat服務(wù)器。
- 所以,我們?cè)谶\(yùn)行SpringBoot的引導(dǎo)類 / 啟動(dòng)類時(shí)(運(yùn)行main方法),啟動(dòng)Spring Boot項(xiàng)目的過程當(dāng)中,它會(huì)自動(dòng)地將內(nèi)部的這個(gè)Tomcat服務(wù)器啟動(dòng)起來,并且占用了Tomcat默認(rèn)端口號(hào)8080,而這個(gè)Tomcat并不是我們剛才所安裝的Web的Tomcat,而是spring-boot-starter-web的開發(fā)環(huán)境內(nèi)置的這個(gè)Tomcat,我們也叫內(nèi)嵌的Tomcat服務(wù)器。
- 我們會(huì)看到命令行輸出的日志,其中占用8080端口的就是Tomcat。
- 那這個(gè)服務(wù)器啟動(dòng)起來之后,我們就可以打開瀏覽器,在瀏覽器地址欄輸入localhost:8080/hello,回車之后我們就訪問到了這臺(tái)內(nèi)嵌的Tomcat,并且訪問到了部署在里面的這個(gè)web程序,最終就拿到了響應(yīng)的結(jié)果
- 在開發(fā)當(dāng)中基本上都是基于Spring Boot來進(jìn)行Web程序的開發(fā),所以我們剛才所獨(dú)立安裝的這個(gè)Tomcat服務(wù)器就會(huì)很少使用了,我們以后基本上用的都是Spring Boot當(dāng)中內(nèi)置的Tomcat服務(wù)器。
總結(jié)
以上是生活随笔為你收集整理的Spring Boot Web的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么有的人中级职称是评审,有的是考试呢
- 下一篇: 如何快速删除CAD图纸中的批注?