【JavaWeb-Spring boot】學習筆記

目錄

  • <<回到導覽
    • Spring boot
      • 1. http協議
        • 1.1.請求協議
        • 1.2.響應協議
      • 2.Tomcat
        • 2.1.請求
          • 2.1.1.apifox
          • 2.1.2.簡單參數
          • 2.1.3.實體參數
          • 2.1.4.數組集合參數
          • 2.1.5.日期參數
          • 2.1.6.(重點)JSON參數
          • 2.1.7.路徑參數
        • 2.2.響應
        • 2.3.綜合練習
      • 3.三層架構
        • 3.1.三層拆分
        • 3.2.分層解耦
        • 3.3.補充

<<回到導覽

Spring boot

Spring boot官網

簡介:Spring Boot 基于Spring,簡化了配置,降低的入門難度,可以幫助我們非常快速的構建應用程序、簡化開發、提高效率

需求:使用 SpringBoot 開發一個web應用,瀏覽器發起請求 /hello后,給瀏覽器返回字符串 “Hello World ~”

  1. 創建spring boot項目(保證網絡間接正常)

    在這里插入圖片描述

    在這里插入圖片描述

  2. 刪除一些暫時不用的文件

    在這里插入圖片描述

  3. 在包下創建文件

    在這里插入圖片描述

  4. 編寫這個文件

    // 請求處理類
    @RestController
    public class HelloController {// 表名這個請求處理類,處理的是“/hello”@RequestMapping("/hello")public String Hello() {System.out.println("Hello World");return "Hello World!!!";}
    }
    

    運行啟動類(SpringDemoApplication)

    在這里插入圖片描述

  5. 訪問服務

    訪問http://localhost:8080/hello或者http://127.0.0.1:8080/hello

    在這里插入圖片描述

每訪問一次這個服務,控制臺還會打印一次Hello World

1. http協議

概念:Hyper Text Transfer Protocol, 超文本傳輸協議,規定了瀏覽器和服務器之間數據傳輸的規則。

特點:

  1. 基于TCP協議:面向連接,安全
  2. 基于請求-響應模型的:一次請求對應一次響應
  3. HTTP協議是無狀態的協議:對于事務處理沒有記憶能力。每次請求-響應都是獨立的。
    • 缺點:多次請求間不能共享數據。
    • 優點:速度快
1.1.請求協議
請求方式請求參數位置請求大小
GET在請求行(沒有請求體)有大小限制
POST在請求體沒有大小限制
  • GET請求

    在這里插入圖片描述

  • POST請求

    在這里插入圖片描述

1.2.響應協議

響應協議和POST請求有些相似,分為響應行、響應頭、響應體,響應數據放在響應體里面

在這里插入圖片描述

狀態碼說明
1xx臨時狀態碼,表示請求已經接收,應該繼續請求或者如果它已經完成則忽略它。
2xx成功接收,處理已完成。
3xx重定向到其他地方;讓客戶端再發起一次請求以完成整個處理。
4xx客戶端錯誤,責任在客戶端。(如:請求了不存在的資源、客戶端未被授權、禁止訪問等。)
5xx服務器錯誤,責任在服務端。(如:程序拋出異常等)。
常用狀態碼解釋
200處理成功
302/304location重定向/隱式重定向
400客戶端語法錯誤
403服務器拒絕提供服務(沒有權限)
404請求資源不存在(url錯誤)
405請求方式有誤
500服務器發生不可預期的錯誤
503服務器尚未準備好處理請求

2.Tomcat

Web服務器是一個軟件程序,對HTTP協議的操作進行封裝,簡化web服務器開發

作用:部署web項目,對外提供網上信息瀏覽服務

Tomcat:一個輕量級的web服務器,支持servlet、jsp等少量avaEE規范。也被稱為web容器、servlet容器。

起步依賴:利用maven中依賴傳遞的特性,把開發某一個功能常見的依賴整合在一起(如web)

在這里插入圖片描述

在spring boot web開發環境中,已經集成了Tomcat

在這里插入圖片描述

2.1.請求
2.1.1.apifox

apifox官網:https://app.apifox.com/

apifox使用教程:https://www.bilibili.com/video/BV1Jc41147xC

在使用apifox之前要安裝插件Apifox Browser Extension

在這里插入圖片描述

嘗試用apifox測試接口

在這里插入圖片描述

2.1.2.簡單參數

簡單參數:參數名和變量名相同,定義形參即可接收參數

@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name, int age) {System.out.println(name + ":" + age);return "OK";}
}

在這里插入圖片描述

如果方法形參名稱與請求參數名稱不匹配,不能接收值,但是不會報錯

這時,可以使用@RequestParam完成映射,但是該注解的required屬性默認是true,代表請求參數必須傳遞

@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name = "name") String username, int age) {System.out.println(username + ":" + age);return "OK";}
}
2.1.3.實體參數

實體參數:多個參數名和形參變量名相同,定義POJO接收即可

@RestController
public class RequestController {@RequestMapping("/simplePojo")public String simpleParam(User user) {System.out.println(user);return "OK";}
}
public class User{private String name;private int age;// Getter、Setter、toString
}

在這里插入圖片描述

  • 示例

    為上面用戶添加地址信息(包含省份和城市)

    @RestController
    public class RequestController {@RequestMapping("/complexPojo")public String complexPojo(User user) {System.out.println(user);return "OK";}
    }
    
    public class User{private String name;private int age;private Address address;// Getter、Setter、toString
    }
    
    public class Address {private String province;private String city;// Getter、Setter、toString
    }
    

    在這里插入圖片描述

2.1.4.數組集合參數
  • 數組參數:請求參數名與形參數組名稱相同,定義數組類型形參即可接收參數

    @RestController
    public class RequestController {@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}
    }
    

    在這里插入圖片描述

  • 集合參數:請求參數名與形參集合名稱相同,通過@RequestParam綁定參數關系

    @RestController
    public class RequestController {@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}
    }
    

    在這里插入圖片描述

2.1.5.日期參數

日期參數:使用@DateTimeFormat注解完成日期參數格式的轉換

@RestController
public class RequestController {@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}
}

在這里插入圖片描述

2.1.6.(重點)JSON參數

JSON參數:JSON數據鍵名和形參屬性名相同,定義POJO類型形參即可接收參數,需要使用@RequestBody標識

在上面的請求中,都是用的GET請求方式,請求參數在請求行,但利用json字符串傳參要用POST請求方式,請求參數在請求體

  • 例如:

    {"name":"Tom","age":18,"address":{"province":"四川","city":"成都"}
    }
    
  • json參數傳遞

    @RestController
    public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
    }
    

    在這里插入圖片描述

2.1.7.路徑參數

路徑參數:通過URL直接傳遞參數,使用{}來標識該路徑參數,需要使用@RequestMapping獲取路徑參數

@RestController
public class RequestController {@RequestMapping("/pathParam/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}
}

在這里插入圖片描述

  • 傳遞多個路徑參數

    @RestController
    public class RequestController {@RequestMapping("/pathParam/{id}/{uid}")public String pathParam(@PathVariable Integer id, @PathVariable Integer uid) {System.out.println(id + "," + uid);return "OK";}
    }
    

    在這里插入圖片描述

2.2.響應

@RestController注解包含了@ResponseBody注解@Controller注解

  • 統一響應結果:

    1. 響應碼
    2. 提示信息
    3. 返回的數據
    // Result
    public class Result {private Integer code ;//1 成功 , 0 失敗private String msg; //提示信息private Object data; //數據 datapublic Result() {}public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data){return new Result(1, "success", data);}public static Result success(){return new Result(1, "success", null);}public static Result error(String msg){return new Result(0, msg, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
    }
    
  • 改寫請求

    @RequestMapping("/simpleParam")
    public Result simpleParam(String name, int age) {System.out.println(name + ":" + age);return Result.success("Hello World");
    }
    

    在這里插入圖片描述

2.3.綜合練習

獲取員工數據,返回統一響應結果,在頁面中渲染(相關資料可以在黑馬官方公眾號下載)

  1. 在pom.xml文件中引入dom4j的依賴,用于解析XML文件

    <!-- 解析xml -->
    <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
    </dependency>
    
  2. 引入資料中提供的解析XML的工具類XMLParserUtils、對應的實體類Emp、XML文件 emp.xml

  3. 引入資料中提供的靜態頁面文件,放在resources下的static目錄下

    在這里插入圖片描述

  4. 編寫Controller程序,處理請求,響應數據

    @RestController
    public class EmpController {@RequestMapping("/listEmp")public Result list() {// 1. 加載解析xmlString file = "D:\\桌面\\Java\\Java(下)\\spring_demo\\src\\main\\resources\\emp.xml";List<Emp> empList = XmlParserUtils.parse(file, Emp.class);// 2. 對數據進行轉換處理empList.forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)) {emp.setGender("男");}else if("2".equals(gender)) {emp.setGender("女");}String job = emp.getJob();if("1".equals(job)) {emp.setJob("教師");}else if("2".equals(job)) {emp.setGender("學生");}});// 3. 響應數據return Result.success(empList);}
    }
    
  • 嘗試發送請求

    在這里插入圖片描述

  • 通過瀏覽器訪問前端頁面

    在這里插入圖片描述

3.三層架構

在上一節的綜合練習中,代碼的不同的業務邏輯寫在了一起,導致代碼復用性差,難以維護

在這里插入圖片描述

為此設計了三層架構來優化

功能分類對應層說明
數據訪問controller(控制層)接收前端發送的請求,對請求進行處理,并響應數據
邏輯處理service(業務邏輯層)處理具體的業務邏輯
接收請求、響應數據dao(數據訪問層,Data Access Object)數據訪問操作(包括增、刪、改、查)

controller => service => dao (=>表示調用關系)

3.1.三層拆分

我們將上面三部分的代碼分別寫到對應層,每個對應層有一個接口(要做的事情),每個接口可以有若干個實現方案(實現類)

在這里插入圖片描述

  1. 數據訪問層(dao)

    // 接口
    public interface Empdao {// 獲取員工列表public List<Emp> empList();
    }
    
    // 實現類
    public class EmpDaoA implements Empdao {@Overridepublic List<Emp> empList() {// 1. 加載解析xmlString file = "D:\\桌面\\Java\\Java(下)\\spring_demo\\src\\main\\resources\\emp.xml";List<Emp> empList = XmlParserUtils.parse(file, Emp.class);return empList;}
    }
    
  2. 業務邏輯層(service)

    // 接口
    public interface EmpService {public List<Emp> empList();
    }
    
    // 實現類
    public class EmpServiceA implements EmpService {private Empdao empdao = new EmpDaoA();@Overridepublic List<Emp> empList() {// 調用dao層接口List<Emp> empList = empdao.empList();// 2. 對數據進行轉換處理empList.forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)) {emp.setGender("男");}else if("2".equals(gender)) {emp.setGender("女");}String job = emp.getJob();if("1".equals(job)) {emp.setJob("教師");}else if("2".equals(job)) {emp.setGender("學生");}});return empList;}
    }
    
  3. 控制層(controller)

    @RestController
    public class EmpController {private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list() {// 3. 響應數據return Result.success(empService.empList());}
    }
    
3.2.分層解耦
  • 內聚:軟件中各個功能模塊內部的功能聯系。
  • 耦合:衡量軟件中各個層/模塊之間的依賴、關聯的程度。
  • 軟件設計原則:高內聚低耦合

在上節的三層拆分中,三個層級耦合性比較高,我們要降低耦合性

控制反轉(IOC):對象的創建控制器由程序自身轉移到外部(容器),通過@Component注解實現

依賴注入(DI):容器為應用程序提供運行時所依賴的資源,通過@Autowired注解實現

  1. Service層、Dao層的實現類,交給IOC容器管理(控制反轉)

    // Service層
    @Component
    public class EmpServiceA implements EmpService {private Empdao empdao;// ...
    }
    
    // Dao層
    @Component
    public class EmpDaoA implements Empdao {// ...
    }
    
  2. 為Controller層、Service層注入運行時依賴的對象(依賴注入)

    @RestController
    public class EmpController {@Autowiredprivate EmpService empService;// ...
    }
    
    // Service層
    @Component
    public class EmpServiceA implements EmpService {@Autowired  // 程序在運行時,IOC容器會提供該類型的bean對象,并賦值給該變量private Empdao empdao;// ...
    }
    
3.3.補充
注解聲明位置
@Componentbean的基礎注解不屬于以下三類時,用此注解(eg:工具類)
@Controller@Component的衍生注解標注在控制器類上(@RestController注解已包括,一般不寫)
@Service@Component的衍生注解標注在業務邏輯類上
@Repository@Component的衍生注解標注在數據訪問類上(由于與mybatis整合,用的少)

了解:

  • 聲明bean的時候,可以通過value屬性指定bean的名字,如果沒有指定,默認為類名首字母小寫。
  • 前面聲明bean的四大注解,要想生效,還需要被組件掃描注解@ComponentScan掃描。
  • @ComponentScan注解雖然沒有顯式配置,但是實際上已經包含在了啟動類聲明注解 @SpringBootApplication 中,默認掃描的范圍是啟動類所在包及其子包

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

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

相關文章

C++的多態-上

目錄 多態的概念 多態的定義及實現 1.虛函數 2. 多態的實現 2.1.多態構成條件 2.2.虛函數重寫的兩個例外 (1)協變(基類與派生類虛函數返回值類型不同) (2)析構函數的重寫(基類與派生類析構函數的名字不同) 2.3.多態的實現 2.4.多態在析構函數中的應用 2.5.多態構成條…

網絡安全的重要性與防護措施

隨著信息技術的飛速發展&#xff0c;互聯網已經成為我們日常生活、工作和學習的必需品。無論是通過社交媒體與朋友互動&#xff0c;還是在網上進行銀行交易&#xff0c;網絡已經滲透到我們生活的方方面面。然而&#xff0c;隨之而來的是各種網絡安全問題&#xff0c;包括數據泄…

CMake學習--Window下VSCode 中 CMake C++ 代碼調試操作方法

目錄 一、背景知識二、使用方法&#xff08;一&#xff09;安裝擴展&#xff08;二&#xff09;創建 CMake 項目&#xff08;三&#xff09;編寫代碼&#xff08;四&#xff09;配置 CMakeLists.txt&#xff08;五&#xff09;生成構建文件&#xff08;六&#xff09;開始調試 …

訪問數組元素(四十四)

1. 數組下標與類型 數組的索引從 0 開始。例如&#xff0c;一個包含 10 個元素的數組&#xff0c;其合法下標范圍為 0 到 9&#xff0c;而不是 1 到 10。為了表示下標&#xff0c;通常使用 size_t 類型&#xff0c;它是一種與機器相關的無符號整型&#xff0c;足夠大以存放內存…

計算機網絡 3-1 數據鏈路層(功能+組幀+差錯控制)

【考綱內容】 &#xff08;一&#xff09;數據鏈路層的功能 &#xff08;二&#xff09;組幀 &#xff08;三&#xff09;差錯控制 檢錯編碼&#xff1b;糾錯編碼 &#xff08;四&#xff09;流量控制與可靠傳輸機制 流量控制、可靠傳輸與滑動窗口機制&#xff1b;停止-等…

Django中使用不同種類緩存的完整案例

Django中使用不同種類緩存的完整案例 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 Django中使用不同種類緩存的完整案例步驟1:設置Django項目步驟2:設置URL路由步驟3:視圖級別…

Spring Boot 集成Redis 的Lua腳本詳解

1. 對比Lua腳本方案與Redis自身事務 對比表格 對比維度Redis事務&#xff08;MULTI/EXEC&#xff09;Lua腳本方案原子性事務命令序列化執行&#xff0c;但中間可被其他命令打斷&#xff0c;不保證原子性Lua腳本在Redis單線程中原子執行&#xff0c;不可中斷計算能力僅支持Red…

【大模型】DeepSeek + 藍耕MaaS平臺 + 海螺AI生成高質量視頻操作詳解

目錄 一、前言 二、藍耘智能云MaaS平臺介紹 2.1 藍耘智算平臺是什么 2.2 平臺優勢 2.3 平臺核心能力 三、海螺AI視頻介紹 3.1 海螺AI視頻是什么 3.2 海螺AI視頻主要功能 3.3 海螺AI視頻應用場景 3.4 海螺AI視頻核心優勢 3.5 項目git地址 四、藍耘MaaS平臺DeepSeek海…

12-產品經理-維護模塊

需求模塊是幫助產品經理進行需求的分類和維護。 1. 維護模塊 在具體產品的“研發需求”頁面左側&#xff0c;點擊“維護模塊”。也可以在具體產品的“設置”-“模塊”下進行維護。 點擊保存后&#xff0c;返回模塊頁面。還可以點擊“子模塊”對已有模塊進行子模塊的維護。 點擊…

考研單詞筆記 2025.04.06

area n領域&#xff0c;范圍&#xff0c;方面&#xff0c;地區&#xff0c;地方&#xff0c;場地&#xff0c;面積 aspect n方面&#xff0c;層面&#xff0c;外表&#xff0c;外觀 boundary n限度&#xff0c;界限&#xff0c;分界線&#xff0c;邊界 cap n最高限額&#x…

護網藍初面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

玄機-apache日志分析

靶場任務 1、提交當天訪問次數最多的IP&#xff0c;即黑客IP&#xff1a; 查看apache日志 apache訪問日志的位置是&#xff1a;/var/log/apache2/access.log.1 匹配正則算法 首先先cat看看 發現地址都在第一行&#xff0c;直接匹配計算輸出 cat access.log.1 |grep -Eo &…

C++ I/O 流通俗指南

1. std::ostream 是什么&#xff1f; 定義&#xff1a;std::ostream 是 C 標準庫中的輸出流類&#xff0c;負責將數據輸出到各種目標&#xff08;如屏幕、文件、網絡等&#xff09;。你可以把 std::ostream 想象成一根“數據水管”&#xff1a; 數據從 C 代碼流進 std::ostrea…

Systemd 使用教程(二):Unit 的概念

目錄 【二】 Systemd 單元&#xff08;Unit&#xff09;的概念 本教程將由淺入深的介紹 linux 中 Systemd 的知識和相關使用&#xff08;同時也方便自己后續查閱&#xff09; 【二】 Systemd 單元&#xff08;Unit&#xff09;的概念 雖然我想介紹的比較偏實際操作&#xff0…

樹莓派PICO 設備燒錄成cmsis dap

文章目錄 1. 實際操作2. IO連接 1. 實際操作 2. IO連接

IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置與實戰指南

?前言 Spring Boot 3.4.x作為當前?最新穩定版本?&#xff0c;全面支持Java 17與Jakarta EE 10規范。本文以?Spring Boot 3.4.1?和?Redis 7.x?為例&#xff0c;詳解如何在IDEA中快速接入Redis&#xff0c;涵蓋?最新依賴配置?、?數據序列化優化?、?緩存注解?及?高…

VectorBT:使用PyTorch+Transformer訓練和回測股票模型 進階五

VectorBT&#xff1a;使用PyTorchTransformer訓練和回測股票模型 進階五 本方案基于PyTorch框架與Transformer模型&#xff0c;結合VectorBT回測引擎構建多股票量化交易系統&#xff0c;采用滑動窗口技術構建時序特征&#xff0c;通過自注意力機制捕捉市場規律預測收益率&#…

4.3-4.6學習總結 Java:Set系列集合+雙列集合+Map

Set系列集合&#xff1a; 元素是唯一的。 HashSet&#xff1a; 哈希值&#xff1a; 如果沒有重寫hashcode方法和equals方法&#xff0c;那么哈希值是根據地址值計算的。 LinkedHashSet&#xff1a; TreeSet底層為紅黑樹。 紅黑樹&#xff1a;兩個紅色節點不能相連。 雙列集合&…

unreal engine5開發仿鬼泣5的游戲,把敵人擊飛到空中4連擊

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、實現思路二、具體藍圖 前言 unreal engine5開發仿鬼泣5的游戲&#xff0c;把敵人擊飛到空中4連擊&#xff0c;先看下效果 一、實現思路 unreal engine5開發仿鬼泣5的游戲&#xff0c;把敵人擊飛到空中4連擊 在Unreal Engi…

功耗日志抓取需求

最近羅列了一些功耗分析需要的常見日志&#xff1a; 測試功耗前&#xff1a; adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 測試功耗后&#xff0c;使用腳本導出如下功耗日志&#xff1a; 腳本 chmod x collect_logs.s…