SpringBootWeb入門
HTTP協議
Web伺服器-Tomcat
前言
Spring的官網(https://spring.io)。Spring的官方提供很多開源的專案,我們可以點選上面的projects,看到spring家族旗下的專案。
Spring發展到今天已經形成了一種開發生態圈,Spring提供了若干個子專案,每個專案用於完成特定的功能。而我們在專案開發時,一般會偏向於選擇這一套spring家族的技術,來解決對應領域的問題,那我們稱這一套技術為spring全家桶。
而Spring家族旗下這麼多的技術,最基礎、最核心的是 SpringFramework。其他的spring家族的技術,都是基於SpringFramework的,SpringFramework中提供很多實用功能,如:依賴注入、事務管理、web開發支援、資料訪問、訊息服務等等。
而如果我們在專案中,直接基於SpringFramework進行開發,存在兩個問題:配置繁瑣、入門難度大。
所以基於此呢,spring官方推薦我們從另外一個專案開始學習,那就是目前最火爆的SpringBoot。
透過springboot就可以快速的幫我們構建應用程式,所以springboot呢,最大的特點有兩個 :
- 簡化配置
- 快速開發
Spring Boot 可以幫助我們非常快速的構建應用程式、簡化開發、提高效率 。
接下來,我們就直接透過一個SpringBoot的web入門程式,讓大家快速感受一下,基於SpringBoot進行Web開發的便捷性。
1. SpringBootWeb快速入門
1.1 需求
需求:基於SpringBoot的方式開發一個web應用,瀏覽器發起請求/hello後,給瀏覽器返回字串 “Hello World ~”。
1.2 開發步驟
第1步:建立SpringBoot工程專案
第2步:定義HelloController類,新增方法hello,並新增註解
第3步:測試執行
1.2.1 建立SpringBoot工程(需要聯網)
基於Spring官方骨架,建立SpringBoot工程。
基本資訊描述完畢之後,勾選web開發相關依賴。
點選Finish之後,就會聯網建立這個SpringBoot工程,建立好之後,結構如下:
- 注意:在聯網建立過程中,會下載相關資源(請耐心等待)
1.2.2 定義請求處理類
在com.itheima這個包下建立一個子包controller
然後在controller包下新建一個類:HelloController
package com.itheima.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("Hello World ~");
return "Hello World ~";
}
}
1.2.3 執行測試
執行SpringBoot自動生成的引導類
開啟瀏覽器,輸入 http://localhost:8080/hello
1.3 Web分析
瀏覽器:
-
輸入網址:
http://192.168.100.11:8080/hello
-
透過IP地址192.168.100.11定位到網路上的一臺計算機
我們之前在瀏覽器中輸入的localhost,就是127.0.0.1(本機)
-
透過埠號8080找到計算機上執行的程式
localhost:8080
, 意思是在本地計算機中找到正在執行的8080埠的程式 -
/hello是請求資源位置
- 資源:對計算機而言資源就是資料
- web資源:透過網路可以訪問到的資源(通常是指存放在伺服器上的資料)
localhost:8080/hello
,意思是向本地計算機中的8080埠程式,獲取資源位置是/hello的資料- 8080埠程式,在伺服器找/hello位置的資源資料,發給瀏覽器
- 資源:對計算機而言資源就是資料
-
伺服器:(可以理解為ServerSocket)
- 接收到瀏覽器傳送的資訊(如:/hello)
- 在伺服器上找到/hello的資源
- 把資源傳送給瀏覽器
我們在JavaSE階段學習網路程式設計時,有講過網路三要素:
- IP :網路中計算機的唯一標識
- 埠 :計算機中執行程式的唯一標識
- 協議 :網路中計算機之間互動的規則
問題:瀏覽器和伺服器兩端進行資料互動,使用什麼協議?
答案:http協議
2. HTTP協議
2.1 HTTP-概述
2.1.1 介紹
HTTP:Hyper Text Transfer Protocol(超文字傳輸協議),規定了瀏覽器與伺服器之間資料傳輸的規則。
- http是網際網路上應用最為廣泛的一種網路協議
- http協議要求:瀏覽器在向伺服器傳送請求資料時,或是伺服器在向瀏覽器傳送響應資料時,都必須按照固定的格式進行資料傳輸
如果想知道http協議的資料傳輸格式有哪些,可以開啟瀏覽器,點選F12
開啟開發者工具,點選Network
來檢視
瀏覽器向伺服器進行請求時:
- 伺服器按照固定的格式進行解析
伺服器向瀏覽器進行響應時:
- 瀏覽器按照固定的格式進行解析
所以,我們學習HTTP主要就是學習請求和響應資料的具體格式內容。
2.2.2 特點
我們剛才初步認識了HTTP協議,那麼我們在看看HTTP協議有哪些特點:
-
**基於TCP協議: ** 面向連線,安全
TCP是一種面向連線的(建立連線之前是需要經過三次握手)、可靠的、基於位元組流的傳輸層通訊協議,在資料傳輸方面更安全
-
基於請求-響應模型: 一次請求對應一次響應(先請求後響應)
請求和響應是一一對應關係,沒有請求,就沒有響應
-
HTTP協議是無狀態協議: 對於資料沒有記憶能力。每次請求-響應都是獨立的
無狀態指的是客戶端傳送HTTP請求給服務端之後,服務端根據請求響應資料,響應完後,不會記錄任何資訊。
- 缺點: 多次請求間不能共享資料
- 優點: 速度快
請求之間無法共享資料會引發的問題:
- 如:京東購物。加入購物車和去購物車結算是兩次請求
- 由於HTTP協議的無狀態特性,加入購物車請求響應結束後,並未記錄加入購物車是何商品
- 發起去購物車結算的請求後,因為無法獲取哪些商品加入了購物車,會導致此次請求無法正確展示資料
具體使用的時候,我們發現京東是可以正常展示資料的,原因是Java早已考慮到這個問題,並提出了使用會話技術(Cookie、Session)來解決這個問題。具體如何來做,我們後面課程中會講到。
剛才提到HTTP協議是規定了請求和響應資料的格式,那具體的格式是什麼呢?
2.2 HTTP-請求協議
瀏覽器和伺服器是按照HTTP協議進行資料通訊的。
HTTP協議又分為:請求協議和響應協議
- 請求協議:瀏覽器將資料以請求格式傳送到伺服器
- 包括:請求行、請求頭 、請求體
- 響應協議:伺服器將資料以響應格式返回給瀏覽器
- 包括:響應行 、響應頭 、響應體
在HTTP1.1版本中,瀏覽器訪問伺服器的幾種方式:
請求方式 | 請求說明 |
---|---|
GET | 獲取資源。 向特定的資源發出請求。例:http://www.baidu.com/s?wd=itheima |
POST | 傳輸實體主體。 向指定資源提交資料進行處理請求(例:上傳檔案),資料被包含在請求體中。 |
OPTIONS | 返回伺服器針對特定資源所支援的HTTP請求方式。 因為並不是所有的伺服器都支援規定的方法,為了安全有些伺服器可能會禁止掉一些方法,例如:DELETE、PUT等。那麼OPTIONS就是用來詢問伺服器支援的方法。 |
HEAD | 獲得報文首部。 HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回資料。通常用於確認URI的有效性及資源更新時間等。 |
PUT | 傳輸檔案。 PUT方法用來傳輸檔案。類似FTP協議,檔案內容包含在請求報文的實體中,然後請求儲存到URL指定的伺服器位置。 |
DELETE | 刪除檔案。 請求伺服器刪除Request-URI所標識的資源 |
TRACE | 追蹤路徑。 回顯伺服器收到的請求,主要用於測試或診斷 |
CONNECT | 要求用隧道協議連線代理。 HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器 |
在我們實際應用中常用的也就是 :GET、POST
GET方式的請求協議:
-
請求行 :HTTP請求中的第一行資料。由:
請求方式
、資源路徑
、協議/版本
組成(之間使用空格分隔)- 請求方式:GET
- 資源路徑:/brand/findAll?name=OPPO&status=1
- 請求路徑:/brand/findAll
- 請求引數:name=OPPO&status=1
- 請求引數是以key=value形式出現
- 多個請求引數之間使用
&
連線
- 請求路徑和請求引數之間使用
?
連線
- 協議/版本:HTTP/1.1
-
請求頭 :第二行開始,上圖黃色部分內容就是請求頭。格式為key: value形式
- http是個無狀態的協議,所以在請求頭設定瀏覽器的一些自身資訊和想要響應的形式。這樣伺服器在收到資訊後,就可以知道是誰,想幹什麼了
常見的HTTP請求頭有:
Host: 表示請求的主機名 User-Agent: 瀏覽器版本。 例如:Chrome瀏覽器的標識類似Mozilla/5.0 ...Chrome/79 ,IE瀏覽器的標識類似Mozilla/5.0 (Windows NT ...)like Gecko Accept:表示瀏覽器能接收的資源型別,如text/*,image/*或者*/*表示所有; Accept-Language:表示瀏覽器偏好的語言,伺服器可以據此返回不同語言的網頁; Accept-Encoding:表示瀏覽器可以支援的壓縮型別,例如gzip, deflate等。 Content-Type:請求主體的資料型別 Content-Length:資料主體的大小(單位:位元組)
舉例說明:服務端可以根據請求頭中的內容來獲取客戶端的相關資訊,有了這些資訊服務端就可以處理不同的業務需求。
比如:
- 不同瀏覽器解析HTML和CSS標籤的結果會有不一致,所以就會導致相同的程式碼在不同的瀏覽器會出現不同的效果
- 服務端根據客戶端請求頭中的資料獲取到客戶端的瀏覽器型別,就可以根據不同的瀏覽器設定不同的程式碼來達到一致的效果(這就是我們常說的瀏覽器相容問題)
- 請求體 :儲存請求引數
- GET請求的請求引數在請求行中,故不需要設定請求體
POST方式的請求協議:
- 請求行(以上圖中紅色部分):包含請求方式、資源路徑、協議/版本
- 請求方式:POST
- 資源路徑:/brand
- 協議/版本:HTTP/1.1
- 請求頭(以上圖中黃色部分)
- 請求體(以上圖中綠色部分) :儲存請求引數
- 請求體和請求頭之間是有一個空行隔開(作用:用於標記請求頭結束)
GET請求和POST請求的區別:
區別方式 | GET請求 | POST請求 |
---|---|---|
請求引數 | 請求引數在請求行中。 例:/brand/findAll?name=OPPO&status=1 |
請求引數在請求體中 |
請求引數長度 | 請求引數長度有限制(瀏覽器不同限制也不同) | 請求引數長度沒有限制 |
安全性 | 安全性低。原因:請求引數暴露在瀏覽器位址列中。 | 安全性相對高 |
2.3 HTTP-響應協議
2.3.1 格式介紹
與HTTP的請求一樣,HTTP響應的資料也分為3部分:響應行、響應頭 、響應體
-
響應行(以上圖中紅色部分):響應資料的第一行。響應行由
協議及版本
、響應狀態碼
、狀態碼描述
組成- 協議/版本:HTTP/1.1
- 響應狀態碼:200
- 狀態碼描述:OK
-
響應頭(以上圖中黃色部分):響應資料的第二行開始。格式為key:value形式
- http是個無狀態的協議,所以可以在請求頭和響應頭中設定一些資訊和想要執行的動作,這樣,對方在收到資訊後,就可以知道你是誰,你想幹什麼
常見的HTTP響應頭有:
Content-Type:表示該響應內容的型別,例如text/html,image/jpeg ; Content-Length:表示該響應內容的長度(位元組數); Content-Encoding:表示該響應壓縮演算法,例如gzip ; Cache-Control:指示客戶端應如何快取,例如max-age=300表示可以最多快取300秒 ; Set-Cookie: 告訴瀏覽器為當前頁面所在的域設定cookie ;
- 響應體(以上圖中綠色部分): 響應資料的最後一部分。儲存響應的資料
- 響應體和響應頭之間有一個空行隔開(作用:用於標記響應頭結束)
2.3.2 響應狀態碼
狀態碼分類 | 說明 |
---|---|
1xx | 響應中 --- 臨時狀態碼。表示請求已經接受,告訴客戶端應該繼續請求或者如果已經完成則忽略 |
2xx | 成功 --- 表示請求已經被成功接收,處理已完成 |
3xx | 重定向 --- 重定向到其它地方,讓客戶端再發起一個請求以完成整個處理 |
4xx | 客戶端錯誤 --- 處理發生錯誤,責任在客戶端,如:客戶端的請求一個不存在的資源,客戶端未被授權,禁止訪問等 |
5xx | 伺服器端錯誤 --- 處理發生錯誤,責任在服務端,如:服務端丟擲異常,路由出錯,HTTP版本不支援等 |
參考: 資料/SpringbootWeb/響應狀態碼.md
關於響應狀態碼,我們先主要認識三個狀態碼,其餘的等後期用到了再去掌握:
- 200 ok 客戶端請求成功
- 404 Not Found 請求資源不存在
- 500 Internal Server Error 服務端發生不可預期的錯誤
2.4 HTTP-協議解析
將資料中準備好的Demo工程,匯入到我們的IDEA中,有一個Server.java類,這裡面就是自定義的一個伺服器程式碼,主要使用到的是ServerSocket
和Socket
說明:以下程式碼大家不需要自己寫,我們主要是透過程式碼,讓大家瞭解到伺服器針對HTTP協議的解析機制
package com.itheima;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
* 自定義web伺服器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8080); // 監聽指定埠
System.out.println("server is running...");
while (true){
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock);
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
try (InputStream input = this.sock.getInputStream();
OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 讀取HTTP請求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 讀取到空行時, HTTP Header讀取完畢
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {// 傳送錯誤響應:
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {// 傳送成功響應:
//讀取html檔案,轉換為字串
InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行標識Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
啟動ServerSocket程式:
瀏覽器輸入:http://localhost:8080
就會訪問到ServerSocket程式
- ServerSocket程式,會讀取伺服器上
html/a.html
檔案,並把檔案資料傳送給瀏覽器 - 瀏覽器接收到a.html檔案中的資料後進行解析,顯示以下內容
現在大家知道了伺服器是可以使用java完成編寫,是可以接受頁面傳送的請求和響應資料給前端瀏覽器的,而在開發中真正用到的Web伺服器,我們不會自己寫的,都是使用目前比較流行的web伺服器。如:Tomcat
3. WEB伺服器-Tomcat
3.1 簡介
3.1.1 伺服器概述
伺服器硬體
- 指的也是計算機,只不過伺服器要比我們日常使用的計算機大很多。
伺服器,也稱伺服器。是提供計算服務的裝置。由於伺服器需要響應服務請求,並進行處理,因此一般來說伺服器應具備承擔服務並且保障服務的能力。
伺服器的構成包括處理器、硬碟、記憶體、系統匯流排等,和通用的計算機架構類似,但是由於需要提供高可靠的服務,因此在處理能力、穩定性、可靠性、安全性、可擴充套件性、可管理性等方面要求較高。
在網路環境下,根據伺服器提供的服務型別不同,可分為:檔案伺服器,資料庫伺服器,應用程式伺服器,WEB伺服器等。
伺服器只是一臺裝置,必須安裝伺服器軟體才能提供相應的服務。
伺服器軟體
伺服器軟體:基於ServerSocket編寫的程式
- 伺服器軟體本質是一個執行在伺服器裝置上的應用程式
- 能夠接收客戶端請求,並根據請求給客戶端響應資料
3.1.2 Web伺服器
Web伺服器是一個應用程式(軟體),對HTTP協議的操作進行封裝,使得程式設計師不必直接對協議進行操作(不用程式設計師自己寫程式碼去解析http協議規則),讓Web開發更加便捷。主要功能是"提供網上資訊瀏覽服務"。
Web伺服器是安裝在伺服器端的一款軟體,將來我們把自己寫的Web專案部署到Tomcat伺服器軟體中,當Web伺服器軟體啟動後,部署在Web伺服器軟體中的頁面就可以直接透過瀏覽器來訪問了。
Web伺服器軟體使用步驟
- 準備靜態資源
- 下載安裝Web伺服器軟體
- 將靜態資源部署到Web伺服器上
- 啟動Web伺服器使用瀏覽器訪問對應的資源
第1步:準備靜態資源
- 在提供的資料中找到靜態資原始檔
第2步:下載安裝Web伺服器軟體
第3步:將靜態資源部署到Web伺服器上
第4步:啟動Web伺服器使用瀏覽器訪問對應的資源
瀏覽器輸入:http://localhost:8080/demo/index.html
上述內容在演示的時候,使用的是Apache下的Tomcat軟體,至於Tomcat軟體如何使用,後面會詳細的講到。而對於Web伺服器來說,實現的方案有很多,Tomcat只是其中的一種,而除了Tomcat以外,還有很多優秀的Web伺服器,比如:
Tomcat就是一款軟體,我們主要是以學習如何去使用為主。具體我們會從以下這些方向去學習:
-
簡介:初步認識下Tomcat
-
基本使用: 安裝、解除安裝、啟動、關閉、配置和專案部署,這些都是對Tomcat的基本操作
-
IDEA中如何建立Maven Web專案
-
IDEA中如何使用Tomcat,後面這兩個都是我們以後開發經常會用到的方式
首選我們來認識下Tomcat。
3.1.3 Tomcat
Tomcat伺服器軟體是一個免費的開源的web應用伺服器。是Apache軟體基金會的一個核心專案。由Apache,Sun和其他一些公司及個人共同開發而成。
由於Tomcat只支援Servlet/JSP少量JavaEE規範,所以是一個開源免費的輕量級Web伺服器。
JavaEE規範: JavaEE => Java Enterprise Edition(Java企業版)
avaEE規範就是指Java企業級開發的技術規範總和。包含13項技術規範:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF
因為Tomcat支援Servlet/JSP規範,所以Tomcat也被稱為Web容器、Servlet容器。JavaWeb程式需要依賴Tomcat才能執行。
Tomcat的官網: https://tomcat.apache.org/
3.2 基本使用
3.2.1 下載
直接從官方網站下載:https://tomcat.apache.org/download-90.cgi
Tomcat軟體型別說明:
- tar.gz檔案,是linux和mac作業系統下的壓縮版本
- zip檔案,是window作業系統下壓縮版本(我們選擇zip檔案)
大家可以自行下載,也可以直接使用資料中已經下載好的資源,
Tomcat的軟體程式 :/資料/SpringbootWeb/apache-tomcat-9.0.27-windows-x64.zip
3.2.2 安裝與解除安裝
安裝: Tomcat是綠色版,直接解壓即安裝
在E盤的develop目錄下,將
apache-tomcat-9.0.27-windows-x64.zip
進行解壓縮,會得到一個apache-tomcat-9.0.27
的目錄,Tomcat就已經安裝成功。
注意,Tomcat在解壓縮的時候,解壓所在的目錄可以任意,但最好解壓到一個不包含中文和空格的目錄,因為後期在部署專案的時候,如果路徑有中文或者空格可能會導致程式部署失敗。
開啟apache-tomcat-9.0.27
目錄就能看到如下目錄結構,每個目錄中包含的內容需要認識下
bin:目錄下有兩類檔案,一種是以.bat
結尾的,是Windows系統的可執行檔案,一種是以.sh
結尾的,是Linux系統的可執行檔案。
webapps:就是以後專案部署的目錄
解除安裝:解除安裝比較簡單,可以直接刪除目錄即可
3.2.3 啟動與關閉
啟動Tomcat
- 雙擊tomcat解壓目錄/bin/startup.bat檔案即可啟動tomcat
注意: tomcat伺服器啟動後,黑視窗不會關閉,只要黑視窗不關閉,就證明tomcat伺服器正在執行
Tomcat的預設埠為8080,所以在瀏覽器的位址列輸入:http://127.0.0.1:8080
即可訪問tomcat伺服器
127.0.0.1 也可以使用localhost代替。如:
http://localhost:8080
- 能看到以上圖片中Apache Tomcat的內容就說明Tomcat已經啟動成功
注意事項 :Tomcat啟動的過程中,遇到控制檯有中文亂碼時,可以通常修改conf/logging.prooperties檔案解決
關閉: 關閉有三種方式
1、強制關閉:直接x掉Tomcat視窗(不建議)
2、正常關閉:bin\shutdown.bat
3、正常關閉:在Tomcat啟動視窗中按下 Ctrl+C
- 說明:如果按下Ctrl+C沒有反映,可以多按幾次
3.2.4 常見問題
問題1:Tomcat啟動時,視窗一閃而過
- 檢查JAVA_HOME環境變數是否正確配置
問題2:埠號衝突
-
發生問題的原因:Tomcat使用的埠被佔用了。
-
解決方案:換Tomcat埠號
- 要想修改Tomcat啟動的埠號,需要修改 conf/server.xml檔案
注: HTTP協議預設埠號為80,如果將Tomcat埠號改為80,則將來訪問Tomcat時,將不用輸入埠號。
3.3 入門程式解析
關於web開發的基礎知識,我們可以告一段落了。下面呢,我們在基於今天的核心技術點SpringBoot快速入門案例進行分析。
3.3.1 Spring官方骨架
之前我們建立的SpringBoot入門案例,是基於Spring官方提供的骨架實現的。
Spring官方骨架,可以理解為Spring官方為程式設計師提供一個搭建專案的模板。
我們可以透過訪問:https://start.spring.io/ ,進入到官方骨架頁面
Spring官方生成的SpringBoot專案,怎麼使用呢?
- 解壓縮後,就會得到一個SpringBoot專案工程
)
開啟pom.xml檔案,我們可以看到springboot專案中引入了web依賴和test依賴
結論:不論使用IDEA建立SpringBoot專案,還是直接在官方網站利用骨架生成SpringBoot專案,專案的結構和pom.xml檔案中內容是相似的。
3.3.2 起步依賴
在我們之前講解的SpringBoot快速入門案例中,同樣也引用了:web依賴和test依賴
spring-boot-starter-web和spring-boot-starter-test,在SpringBoot中又稱為:起步依賴
而在SpringBoot的專案中,有很多的起步依賴,他們有一個共同的特徵:就是以spring-boot-starter-
作為開頭。在以後大家遇到spring-boot-starter-xxx這類的依賴,都為起步依賴。
起步依賴有什麼特殊之處呢,這裡我們以入門案例中引入的起步依賴做為講解:
- spring-boot-starter-web:包含了web應用開發所需要的常見依賴
- spring-boot-starter-test:包含了單元測試所需要的常見依賴
spring-boot-starter-web內部把關於Web開發所有的依賴都已經匯入並且指定了版本,只需引入
spring-boot-starter-web
依賴就可以實現Web開發的需要的功能!
Spring的官方提供了很多現成的starter(起步依賴),我們在開發相關應用時,只需要引入對應的starter即可。
官方地址:https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#using.build-systems.starters
每一個起步依賴,都用於開發一個特定的功能。
舉例:當我們開發中需要使用redis資料庫時,只需要在SpringBoot專案中,引入:spring-boot-starter-redis ,即可匯入redis開發所需要的依賴。
3.3.2 SpringBoot父工程
在我們之前開發的SpringBoot入門案例中,我們透過maven引入的依賴,是沒有指定具體的依賴版本號的。
為什麼沒有指定<version>版本號,可以正常使用呢?
- 因為每一個SpringBoot工程,都有一個父工程。依賴的版本號,在父工程中統一管理。
3.3.3 內嵌Tomcat
問題:為什麼我們之前書寫的SpringBoot入門程式中,並沒有把程式部署到Tomcat的webapps目錄下,也可以執行呢?
原因呢,是因為在我們的SpringBoot中,引入了web執行環境(也就是引入spring-boot-starter-web起步依賴),其內部已經整合了內建的Tomcat伺服器。
我們可以透過IDEA開發工具右側的maven皮膚中,就可以看到當前工程引入的依賴。其中已經將Tomcat的相關依賴傳遞下來了,也就是說在SpringBoot中可以直接使用Tomcat伺服器。
當我們執行SpringBoot的引導類時(執行main方法),就會看到命令列輸出的日誌,其中佔用8080埠的就是Tomcat。