從0開始學習Java+AI知識點總結-16.web基礎知識

一、SpringBoot Web 入門開發

SpringBoot 簡化了傳統 Spring 應用的配置流程,通過 "約定大于配置" 的理念實現快速開發。以下是入門核心要點:

1. 工程創建與依賴配置

  • 工程初始化:通過 Spring Initializr 創建工程,選擇Spring Web依賴(內置 Tomcat 服務器和 Spring MVC 核心組件)。
  • 核心依賴:在pom.xml中引入 SpringBoot 父工程和 Web 起步依賴,自動管理版本兼容:

<parent>

????<groupId>org.springframework.boot</groupId>

????<artifactId>spring-boot-starter-parent</artifactId>

????<version>3.5.0</version>

</parent>

<dependencies>

????<dependency>

????????<groupId>org.springframework.boot</groupId>

????????<artifactId>spring-boot-starter-web</artifactId>

????</dependency>

</dependencies>

  • 依賴作用spring-boot-starter-web包含 Spring MVC、嵌入式 Tomcat、JSON 解析等 Web 開發必需組件,無需手動配置。

2. 核心注解與啟動機制

  • @RestController:組合@Controller@ResponseBody,標識類為請求處理控制器,方法返回值直接作為響應體(對象會自動轉為 JSON)。
  • @RequestMapping:映射請求路徑,指定方法處理的 URL(如@RequestMapping("/hello")處理/hello請求)。
  • @SpringBootApplication:啟動類核心注解,包含組件掃描(@ComponentScan)、自動配置等功能,需放在項目根包下以確保注解掃描生效。
  • 啟動流程:通過SpringApplication.run(啟動類.class, args)啟動內置 Tomcat,自動部署應用并監聽默認端口(8080)。

3. 基礎請求處理示例

// 控制器類

@RestController

public class HelloController {

????// 處理GET請求:/hello?name=xxx

????@RequestMapping("/hello")

????public String hello(String name) {

????????return "Hello " + name + " ~";

????}

}

// 啟動類

@SpringBootApplication

public class Application {

????public static void main(String[] args) {

????????SpringApplication.run(Application.class, args);

????}

}

啟動后訪問http://localhost:8080/hello?name=Java,將返回Hello Java ~

二、HTTP 協議核心解析

HTTP(超文本傳輸協議)是 Web 通信的基礎,規范了瀏覽器與服務器的數據交互格式。

1. 請求數據格式

HTTP 請求由請求行、請求頭、請求體三部分組成:

  • 請求行:包含請求方法、資源路徑、協議版本(如GET /hello?name=Java HTTP/1.1)。
  • 請求頭:鍵值對格式,描述請求附加信息(如Host: localhost:8080User-Agent: 瀏覽器標識)。
  • 請求體:僅 POST 請求包含,存放請求參數(如 JSON 字符串)。
常見請求方法區別:

方法

特點

適用場景

GET

參數在 URL 中,無請求體,大小有限制(1-18KB)

數據查詢

POST

參數在請求體中,無大小限制

數據提交(如表單、新增數據)

2. 響應數據格式

HTTP 響應由響應行、響應頭、響應體三部分組成:

  • 響應行:包含協議版本、狀態碼、描述(如HTTP/1.1 200 OK)。
  • 響應頭:鍵值對格式,描述響應附加信息(如Content-Type: application/json)。
  • 響應體:服務器返回的實際數據(如 HTML、JSON)。
狀態碼分類:
  • 1xx:臨時響應(如 100 Continue)。
  • 2xx:成功(如 200 OK)。
  • 3xx:重定向(如 302 Found)。
  • 4xx:客戶端錯誤(如 404 Not Found、401 Unauthorized)。
  • 5xx:服務器錯誤(如 500 Internal Server Error)。

3. 請求與響應數據處理

  • 獲取請求數據:通過HttpServletRequest對象獲取請求行、頭、體數據:

@RequestMapping("/request")

public String handleRequest(HttpServletRequest request) {

????String method = request.getMethod(); // 請求方法(GET/POST)

????String uri = request.getRequestURI(); // 資源路徑(/request)

????String userAgent = request.getHeader("User-Agent"); // 請求頭

????String name = request.getParameter("name"); // 請求參數

????return "Method: " + method + ", URI: " + uri;

}

  • 設置響應數據:兩種常用方式:
    1. 基于HttpServletResponse

@RequestMapping("/response1")

public void setResponse(HttpServletResponse response) throws IOException {

????response.setStatus(401); // 狀態碼:未授權

????response.setHeader("Custom-Header", "value"); // 響應頭

????response.getWriter().write("<h1>Hello Response</h1>"); // 響應體

}

    1. 基于ResponseEntity(更優雅的響應封裝):

@RequestMapping("/response2")

public ResponseEntity<String> setResponse() {

????return ResponseEntity.status(401)

????????????.header("Custom-Header", "value")

????????????.body("<h1>Hello Response</h1>");

}

三、SpringBoot Web 案例實踐

以 "用戶列表展示" 為例,掌握數據讀取、解析、響應的完整流程。

1. 工程結構與依賴

  • 核心依賴:除 Web 依賴外,添加 Lombok(簡化實體類)和 Hutool(工具類庫):

<dependencies>

????<!-- Lombok -->

????<dependency>

????????<groupId>org.projectlombok</groupId>

????????<artifactId>lombok</artifactId>

????</dependency>

????<!-- Hutool工具類 -->

????<dependency>

????????<groupId>cn.hutool</groupId>

????????<artifactId>hutool-all</artifactId>

????????<version>5.8.28</version>

????</dependency>

</dependencies>

  • 靜態資源存放:前端頁面(如 HTML、JS)需放在src/main/resources/static目錄下,SpringBoot 會自動映射訪問。

2. 實體類定義

使用 Lombok 注解簡化 get/set、構造方法等代碼:

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.AllArgsConstructor;

import java.time.LocalDateTime;

@Data // 生成get/set/toString等方法

@NoArgsConstructor // 無參構造

@AllArgsConstructor // 全參構造

public class User {

????private Integer id;

????private String username;

????private String password;

????private String name;

????private Integer age;

????private LocalDateTime updateTime;

}

3. 數據讀取與響應

從文件讀取用戶數據并解析為 JSON 響應:

@RestController

public class UserController {

????@RequestMapping("/list")

????public List<User> getUserList() {

????????// 1. 讀取文件(user.txt放在resources目錄下)

????????InputStream in = UserController.class.getClassLoader().getResourceAsStream("user.txt");

????????List<String> lines = IoUtil.readUtf8Lines(in, new ArrayList<>()); // Hutool工具類

????????

????????// 2. 解析數據為User對象

????????List<User> userList = new ArrayList<>();

????????for (String line : lines) {

????????????String[] parts = line.split(",");

????????????User user = new User();

????????????user.setId(Integer.valueOf(parts[0]));

????????????user.setUsername(parts[1]);

????????????user.setPassword(parts[2]);

????????????user.setName(parts[3]);

????????????user.setAge(Integer.valueOf(parts[4]));

????????????// 字符串轉LocalDateTime

????????????user.setUpdateTime(LocalDateTime.parse(parts[5],

????????????????DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

????????????userList.add(user);

????????}

????????return userList; // 自動轉為JSON數組響應

????}

}

訪問http://localhost:8080/list將返回用戶列表 JSON 數據,前端頁面可通過 AJAX 請求渲染。

四、分層架構與解耦設計

為提高代碼復用性和可維護性,采用三層架構設計,遵循 "高內聚、低耦合" 原則。

1. 三層架構職責劃分

  • Controller(控制層):接收前端請求,調用 Service 層處理業務,響應數據(專注請求 / 響應)。
  • Service(業務邏輯層):實現核心業務邏輯,協調 Dao 層數據操作(專注邏輯處理)。
  • Dao(數據訪問層):負責數據讀寫操作(如文件、數據庫),提供數據接口(專注數據訪問)。

2. 分層實現示例

(1)Dao 層:數據訪問接口與實現

// 接口

public interface UserDao {

????List<String> readUserLines(); // 讀取原始數據行

}

// 實現類

public class UserDaoImpl implements UserDao {

????@Override

????public List<String> readUserLines() {

????????InputStream in = UserDaoImpl.class.getClassLoader().getResourceAsStream("user.txt");

????????return IoUtil.readUtf8Lines(in, new ArrayList<>());

????}

}

(2)Service 層:業務邏輯處理

// 接口

public interface UserService {

????List<User> getUserList(); // 獲取用戶列表

}

// 實現類

public class UserServiceImpl implements UserService {

????private UserDao userDao = new UserDaoImpl(); // 依賴Dao層

????

????@Override

????public List<User> getUserList() {

????????List<String> lines = userDao.readUserLines(); // 調用Dao獲取數據

????????// 解析邏輯(同之前的解析過程)

????????List<User> userList = new ArrayList<>();

????????// ... 解析代碼 ...

????????return userList;

????}

}

(3)Controller 層:請求處理

@RestController

public class UserController {

????private UserService userService = new UserServiceImpl(); // 依賴Service層

????

????@RequestMapping("/list")

????public List<User> list() {

????????return userService.getUserList(); // 調用Service獲取數據

????}

}

3. 分層優勢

  • 單一職責:每層專注自身職責,降低代碼復雜度。
  • 復用性高:Service 和 Dao 層邏輯可被多個 Controller 復用。
  • 便于維護:需求變更時只需修改對應層代碼(如數據來源從文件改為數據庫,僅需修改 Dao 層)。

五、IOC 與 DI:控制反轉與依賴注入

Spring 的核心思想是控制反轉(IOC)?和依賴注入(DI),解決層間高耦合問題。

1. 核心概念

  • IOC(控制反轉):對象的創建權從代碼轉移到 Spring 容器,由容器統一管理對象生命周期。
  • DI(依賴注入):容器在運行時自動將依賴對象注入到需要的類中,無需手動new對象。
  • Bean:被 IOC 容器管理的對象稱為 Bean。

2. IOC 注解:將對象交給容器管理

使用注解聲明 Bean,容器自動創建并管理:

注解

作用

適用場景

@Component

基礎注解,聲明 Bean

通用類

@Controller

@Component 衍生注解

控制層類

@Service

@Component 衍生注解

業務層類

@Repository

@Component 衍生注解

數據訪問層類

示例:

@Repository // Dao層Bean

public class UserDaoImpl implements UserDao { ... }

@Service // Service層Bean

public class UserServiceImpl implements UserService { ... }

@RestController // Controller層Bean(組合@Controller和@ResponseBody)

public class UserController { ... }

3. DI 注解:依賴注入實現

通過注解讓容器自動注入依賴對象,消除手動new的耦合:

  • @Autowired:默認按類型注入,容器自動查找對應類型的 Bean。

@Service

public class UserServiceImpl implements UserService {

????@Autowired // 注入UserDao類型的Bean

????private UserDao userDao; // 無需手動new

}

  • 多 Bean 沖突解決:當同一類型有多個 Bean 時,需指定注入目標:
    1. @Primary:在 Bean 上標記優先注入。

@Primary // 優先注入該Bean

@Service

public class UserServiceImpl implements UserService { ... }

    1. @Autowired + @Qualifier:按 Bean 名稱注入。

@Service("userServiceA") // 指定Bean名稱

public class UserServiceImpl implements UserService { ... }

@RestController

public class UserController {

????@Autowired

????@Qualifier("userServiceA") // 按名稱注入

????private UserService userService;

}

    1. @Resource:JavaEE 規范注解,默認按名稱注入,支持指定名稱。

@RestController

public class UserController {

????@Resource(name = "userServiceA") // 按名稱注入

????private UserService userService;

}

4. 組件掃描

  • @ComponentScan:指定容器掃描 Bean 的包路徑,默認掃描啟動類所在包及其子包。
  • @SpringBootApplication:已包含@ComponentScan,無需額外配置。

六、總結與最佳實踐

  1. SpringBoot Web 開發:通過起步依賴和核心注解快速搭建應用,內置 Tomcat 簡化部署。
  2. HTTP 協議:掌握請求 / 響應格式、狀態碼和方法區別,正確處理數據交互。
  3. 分層架構:按 Controller→Service→Dao 劃分職責,提升代碼復用性和可維護性。
  4. IOC/DI:使用注解聲明 Bean 和注入依賴,消除硬編碼耦合,降低維護成本。

通過本文系統學習,可夯實 Java Web 開發基礎,掌握從入門到架構設計的核心技能。建議收藏本文,后續開發中遇到相關問題可隨時查閱,關注作者獲取更多技術干貨!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93570.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄Day51:圖論(島嶼數量 深搜廣搜、島嶼的最大面積)

一、實戰 99島嶼數量 深搜 99. 島嶼數量 本題中每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成&#xff0c;也就是說斜角度鏈接是不算的。思路是用遇到一個沒有遍歷過的節點陸地&#xff0c;計數器就加一&#xff0c;然后把該節點陸地所能遍歷到的陸地都標記上。在…

讀取數據excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[時間], datetime):…

前端環境安裝

1.vsCode 下載鏈接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一個wiz code擴展&#xff08;提示你需要升級的依賴&#xff09; wiz code 使用方法 效果 2.git 下載鏈接&#xff1a;Git - Downloads 先下載 Homebrew&#xff08;https://brew.sh/ &a…

零基礎學Java第十八講---抽象類和接口(3)

續接上一講 目錄 一、內部類 1、內部類的分類 2、靜態內部類 3、實例內部類---未被static修飾的成員內部類 4、局部內部類 5、匿名內部類 二、Object類 1、獲取對象信息 2、equals方法 3、hashcode方法 一、內部類 當?個事物的內部&#xff0c;還有?個部分需要?個…

字節數據流

記錄 干貨&#xff5c;8000字長文&#xff0c;深度介紹Flink在字節跳動數據流的實踐 字節跳動基于Flink的MQ-Hive實時數據集成

Vision Master的C#腳本與opencv聯合編程

需要在VM的C#腳本設置string類型Out變量和float類型OutF變量&#xff0c;python的輸出信息會在Out變量顯示 using System; using System.IO; using Script.Methods; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading;public pa…

運維工作架構流程搭建

前言 在解決了運維是干什么的&#xff0c;運維的工作的意義后&#xff0c;這一章我們系統性的講講運維工作流程搭建&#xff0c;希望大家能通過我的分享有所收獲&#xff0c;這一章干貨滿滿。 一、網絡服務器架構 按照一般的訪問方式&#xff0c;按照我自己的理解畫了一個網絡服…

安全存儲之 SAES+HUK 使用技巧和常見問題 LAT1543

關鍵字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存儲 引言 近年來&#xff0c;嵌入式設備信息安全被越來越多地提及&#xff0c;從智能穿戴產品、智能工業設備到物聯網產品都對設備信息安全提出了要求&#xff0c;比如基礎的安全啟動&#xff0c;安全升級&#xff0…

ubuntu 20.04 搭建多用戶遠程桌面共享及同時在線使用

使用效果: 物理機: 遠程桌面用戶: 實現過程: 1.使用腳本安裝xrdp并修改配置及啟動服務 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…

[激光原理與應用-287]:理論 - 波動光學 - 電磁波既能承載能量,又能承載信息?

電磁波既能承載能量&#xff0c;又能承載信息&#xff0c;這一特性源于其物理本質和調制技術的結合。以下從能量承載和信息承載兩方面進行詳細解析&#xff1a;一、電磁波如何承載能量&#xff1f;電磁波的能量承載源于其電場和磁場的周期性振蕩&#xff0c;具體機制如下&#…

哪里找最新AI工具官網?如何快速對比ChatGPT替代品?AI工具導航指南 - AIbase

你是否曾有這樣的經歷&#xff1a; 聽聞某款新AI工具爆火&#xff0c;翻遍網絡卻找不到可靠官網或真實評測&#xff1f; 面對功能相似的ChatGPT替代品&#xff0c;參數對比表格散落各處&#xff0c;決策耗時耗力&#xff1f; 想緊跟AI領域突破&#xff0c;卻淹沒在海量資訊碎…

第一階段C#基礎-15:面向對象梳理

面向對象對象三&#xff08;四&#xff09;大特征&#xff1a;封裝&#xff0c;繼承&#xff0c;多態&#xff0c;&#xff08;抽象&#xff09;1_封裝&#xff08;1&#xff09;封裝是指將數據&#xff08;屬性&#xff09;和行為&#xff08;方法&#xff09;組合在一個類中&…

中國星網發展情況全面分析

中國星網作為我國衛星互聯網領域的"國家隊"先鋒,自2021年4月成立以來已取得顯著進展。截至2025年8月,中國星網主導的GW星座已累計發射73顆衛星,形成"四天兩發"的高頻發射節奏,標志著我國低軌衛星互聯網建設進入加速期。在戰略定位上,中國星網不僅承擔…

C++ Qt 成員對象初始化與 TCP 長連接問題深度解析

文章目錄C Qt 成員對象初始化與 TCP 長連接問題深度解析1. 棧對象、堆對象與類成員對象的區別1.1 棧對象&#xff08;局部變量&#xff09;1.2 堆對象&#xff08;動態分配&#xff09;1.3 類成員對象1.4 棧對象 vs 成員對象 vs 堆對象對比表2. 為什么初始化列表必須用2.1 構造…

深度學習周報(8.11~8.17)

目錄 摘要 Abstract 1 CNN--卷積神經網絡簡介 2 CNN核心操作 2.1 卷積 2.2 池化 3 總結 摘要 本周主要學習了卷積神經網絡&#xff08;CNN&#xff09;的相關知識&#xff0c;包括概念、基本架構與應用領域等知識&#xff0c;了解了CNN利用其結構高效地從圖像等網格化數…

oracle dg duplicate限速

一些客戶在搭建dg的時候需要進行限速&#xff0c;不然對生產庫的影響比較大&#xff0c;例如將速度限制到200M每秒&#xff0c;語法如下&#xff1a;rman target sys/XXXX auxiliary sys/XXXXdg <<EOF run{ allocate channel d1 type disk rate 200M; allocate auxiliar…

飛算JavaAI智慧校園場景實踐:從校園管理到師生服務的全鏈路技術革新

目錄一、智慧校園核心場景的技術突破1.1 智能校園綜合管理系統1.2 智慧教學資源共享系統1.3 校園生活服務集成系統二、智慧校園系統效能升級實踐結語&#xff1a;重新定義智慧校園技術邊界在校園管理領域&#xff0c;“規模化運營”與“個性化服務”的矛盾、“管理效率”與“服…

PTPX分析中,如何處理fsdb文件過大的問題?

PTPX分析中&#xff0c;如何處理fsdb文件過大的問題&#xff1f;摘要&#xff1a;下面將基于Synopsys工具鏈&#xff08;PrimeTime PX&#xff0c;即PTPX&#xff0c;用于功耗分析&#xff1b;Verdi&#xff0c;用于波形查看&#xff09;逐一解答每個部分。這些工具在SoC功耗驗…

004.Redis 數據持久化概述及實戰

文章目錄Redis持久化說明Redis持久化RDB持久化AOF持久化混合持久化save與bgsaveRedis RDB持久化Redis 安裝Redis RDB配置手動觸發RDB持久化模擬寫入測試數據模擬進程異常RDB的優缺點優勢劣勢Redis AOF持久化Redis 安裝Redis AOF配置AOF持久化模擬寫入測試數據模擬進程異常AOF的…

Kubernetes(K8s)常用命令全解析:從基礎到進階

Kubernetes&#xff08;K8s&#xff09;常用命令全解析&#xff1a;從基礎到進階 引言&#xff1a;為什么掌握K8s命令是云原生時代的必備技能&#xff1f; Kubernetes&#xff08;簡稱K8s&#xff09;作為容器編排的事實標準&#xff0c;已成為云原生應用部署、擴展和管理的核…