1、第一階段邪修實戰總覽(9.1-9.30)
把第一階段(基礎夯實期)的學習計劃拆解成極具操作性的每日行動方案。這個計劃充分利用我“在職學習”的特殊優勢,強調“用輸出倒逼輸入”,確保每一分鐘的學習都直接服務于面試和實戰。
- 核心目標:構建起Java后端開發的知識樹主干,并能通過一個小型項目串聯起所有知識點。
- 核心策略:每天3小時雷打不動的高效學習(工作日可分散,周末集中攻堅)。
2、周目標(9.1-9.14)
Java核心+Sprig Boot破冰,能獨立使用Spring搭建Web后端并提供RESTful接口。
3、分日目標與邪修技巧
3.1、Day 9-10: Spring Boot開發RESTful API
- 行動:設計/api/ads相關的接口(GET、POST),用@PostMapping接收前端傳過來的JSON數據并解析。
- 邪修技巧:使用Postman軟件測試自己寫的接口,確保能通。這個過程和前端聯調一模一樣,這就是經驗。
3.1.1、學習分享
接下來我會講解一下我在學習這部分知識的時候編寫與測試GET接口的詳細步驟:
第一步:設計我們的數據模型
在編寫接收數據的API之前,需要先定義數據長什么樣。我們可以直接在我們7-8天測試的那個demo中進行修改。
- 創建實體類:在scr/main/java/com/adcampaign下新建一個entity包,并在該包下創建一個新的Java類,名為AdAdvertisement
- 編寫類代碼:
package com.adcampaign.entity;/*** 廣告活動數據模型類* 用于存儲廣告活動的核心數據,并提供數據計算和分析功能* 每個實例代表一天的廣告活動數據*/
public class AdAdvertisement {// 日期(例如:"2023-10-01")private String date;// 廣告花費(單位:元)private double cost;// 線索提交個數(用戶提交的潛在客戶信息數量)private int leadCount;// 私信消息數(收到的用戶私信數量)private int messageCount;/*** 構造方法:創建廣告活動數據對象* @param date 日期字符串* @param cost 廣告花費金額* @param leadCount 線索數量* @param messageCount 私信消息數量*/public AdAdvertisement(String date, double cost, int leadCount, int messageCount) {this.date = date;this.cost = cost;this.leadCount = leadCount;this.messageCount = messageCount;}// Getter方法:獲取私有屬性的值public String getDate() { return date; }public double getCost() { return cost; }public int getLeadCount() { return leadCount; }public int getMessageCount() { return messageCount; }// Setter方法:修改私有屬性的值public void setDate(String date) { this.date = date; }public void setCost(double cost) { this.cost = cost; }public void setLeadCount(int leadCount) { this.leadCount = leadCount; }public void setMessageCount(int messageCount) { this.messageCount = messageCount; }/*** 計算單個線索成本* 公式:單個線索成本 = 廣告花費 ÷ 線索數量* @return 單個線索成本(元/個),如果線索數量為0則返回0*/public double calculateCostPerLead() {// 防止除以零錯誤:如果線索數為0,返回0return (leadCount > 0) ? cost / leadCount : 0;}/*** 計算私信消息轉化成本* 公式:私信轉化成本 = 廣告花費 ÷ 私信消息數* @return 私信轉化成本(元/條),如果私信數為0則返回0*/public double calculateCostPerMessage() {// 防止除以零錯誤:如果私信數為0,返回0return (messageCount > 0) ? cost / messageCount : 0;}/*** 分析廣告花費隨日期的變動情況* @param previousCampaign 上一個日期的廣告活動數據(用于比較)* @return 變動情況描述,包含變動金額和百分比*/public String analyzeCostChange(AdAdvertisement previousCampaign) {// 檢查是否有歷史數據可供比較if (previousCampaign == null) return "無歷史數據可供比較";// 計算變動金額:當前花費 - 上一期花費double changeAmount = this.cost - previousCampaign.getCost();// 計算變動百分比:(變動金額 ÷ 上一期花費) × 100%double changeRate = (changeAmount / previousCampaign.getCost()) * 100;// 格式化輸出:保留兩位小數,顯示變動金額和百分比return String.format("花費變動: %.2f元 (%.2f%%)", changeAmount, changeRate);}/*** 分析單個線索成本隨日期的變動情況* @param previousCampaign 上一個日期的廣告活動數據(用于比較)* @return 變動情況描述,包含變動金額和百分比*/public String analyzeCostPerLeadChange(AdAdvertisement previousCampaign) {if (previousCampaign == null) return "無歷史數據可供比較";// 獲取當前和上一期的單個線索成本(調用已有的計算方法)double currentCpl = this.calculateCostPerLead();double previousCpl = previousCampaign.calculateCostPerLead();// 防止除以零錯誤if (previousCpl <= 0) return "歷史單個線索成本為0,無法計算變動率";double changeAmount = currentCpl - previousCpl;double changeRate = (changeAmount / previousCpl) * 100;return String.format("單個線索成本變動: %.2f元 (%.2f%%)", changeAmount, changeRate);}/*** 分析私信消息轉化成本隨日期的變動情況* @param previousCampaign 上一個日期的廣告活動數據(用于比較)* @return 變動情況描述,包含變動金額和百分比*/public String analyzeMessageCostChange(AdAdvertisement previousCampaign) {if (previousCampaign == null) return "無歷史數據可供比較";// 獲取當前和上一期的私信轉化成本(調用已有的計算方法)double currentCpm = this.calculateCostPerMessage();double previousCpm = previousCampaign.calculateCostPerMessage();// 防止除以零錯誤if (previousCpm <= 0) return "歷史私信轉化成本為0,無法計算變動率";double changeAmount = currentCpm - previousCpm;double changeRate = (changeAmount / previousCpm) * 100;return String.format("私信轉化成本變動: %.2f元 (%.2f%%)", changeAmount, changeRate);}
}
(其實要是大家仔細研究過這個系列的前面,并且看了Data_Board-README文檔的話,不難發現,其實這個類是直接復制的,僅僅只是改了名字而已)
第二步:升級控制器
現在我們需要改造我們Day7-8創建的控制器或者來創建一個更專業的控制器,我們這里直接來創建吧
- 創建控制器:在controller包下,創建AdController.java
- 編寫Get接口(返回數據列表):
package com.adcampaign.controller;import com.adcampaign.entity.AdAdvertisement; // 導入剛剛創建的實體類
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;
import java.util.List;@RestController
@RequestMapping("/api/ads") // 所有這個控制器下的接口路徑都以 /api/ads 開頭
public class AdController {// 模擬一些靜態數據private List<AdAdvertisement> adList = Arrays.asList(new AdAdvertisement("2025-9-28",5000,10,50),new AdAdvertisement("2025-9-29",6000,15,60));@GetMapping // 等價于 @GetMapping(""),訪問路徑是 /api/adspublic List<AdAdvertisement> getAllAds() {return adList; // Spring Boot會自動將這個List序列化為JSON返回}
}
第三步:編寫啟動類
啟動類通常位于項目最頂級的包下,之前7-8天的測試自動生成了一個啟動類,我們這里直接刪除即可,接下來在src/main/java/com/adcampaign包下新建一個啟動類叫Data_Board_Application.java
- 編寫啟動類代碼:
package com.adcampaign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;// 核心注解:標記這是一個Spring Boot應用的主配置類
@SpringBootApplication
@RestController
public class Data_Board_Appliction {public static void main(String[] args) {SpringApplication.run(Data_Board_Appliction.class, args);}
}
- 測試GET接口
-
- 啟動項目,運行啟動類
Data_Board_Application.java
,然后在在終端窗口如果出現下面的樣式則代表運行成功:
- 啟動項目,運行啟動類
-
- 打開瀏覽器,訪問網址
http://localhost:8080/api/ads
,如果在瀏覽器中顯示如圖所示的兩條包含廣告數據的JSON數組,就證明成功了。
- 打開瀏覽器,訪問網址
第四步:編寫POST接口(接收數據)
這是最關鍵的一步,可以學會如何接收前端發送的JOSN數據。
- 在AdController中添加POST接口:
// 新增POST接口@PostMappingpublic String createAd(@RequestBody AdAdvertisement newAd) {// @RequestBody 注解告訴Spring:“請把請求體里的JSON數據,轉換成一個AdAdvertisement對象”// 模擬處理:打印接收到數據System.out.println("接收到新的廣告數據:");System.out.println("日期: " + newAd.getDate());System.out.println("廣告花費: " + newAd.getCost());System.out.println("線索提交個數: " + newAd.getLeadCount());System.out.println("私信消息數: " + newAd.getMessageCount());// 這里暫時不做實際存儲,只是返回成功消息return "廣告數據創建成功! " + newAd.getDate();}
- AdController控制器的完整代碼如下:
package com.adcampaign.controller;import com.adcampaign.entity.AdAdvertisement; // 導入剛剛創建的實體類
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;import java.util.Arrays;
import java.util.List;@RestController
@RequestMapping("/api/ads") // 所有這個控制器下的接口路徑都以 /api/ads 開頭
public class AdController {// 模擬一些靜態數據private List<AdAdvertisement> adList = Arrays.asList(new AdAdvertisement("2025-9-28",5000,10,50),new AdAdvertisement("2025-9-29",6000,15,60));@GetMapping // 等價于 @GetMapping(""),訪問路徑是 /api/adspublic List<AdAdvertisement> getAllAds() {return adList; // Spring Boot會自動將這個List序列化為JSON返回}// 新增POST接口@PostMappingpublic String createAd(@RequestBody AdAdvertisement newAd) {// @RequestBody 注解告訴Spring:“請把請求體里的JSON數據,轉換成一個AdAdvertisement對象”// 模擬處理:打印接收到數據System.out.println("接收到新的廣告數據:");System.out.println("日期: " + newAd.getDate());System.out.println("廣告花費: " + newAd.getCost());System.out.println("線索提交個數: " + newAd.getLeadCount());System.out.println("私信消息數: " + newAd.getMessageCount());// 這里暫時不做實際存儲,只是返回成功消息return "廣告數據創建成功! " + newAd.getDate();}
}
第五步:測試POST接口(使用Postman)
由于我們不能用瀏覽器地址欄測試POST請求,必須使用Postman或類似的API測試工具,所以需要我們來下載并安裝一個Postman來進行測試。
- 大家可以跟著這篇文章來初步了解一下Postman,postman接口測試工具詳解【全】,這篇文章中詳細介紹了如何下載、安裝與一些簡單的使用。
- 創建一個新請求:
-
- 方法選擇:POST
-
- URL輸入:localhost:8080/api/ads
- 設置請求頭:
-
- 點擊Headers標簽
-
- 添加一個Key:Content-Type,Value:application/json
- 設置請求體:
-
- 點擊Body標簽
-
- 選擇raw和JOSN
-
- 在下方文本框中輸入一段JOSN數據:
{"date": "2025-09-30","cost": 100.5,"leadCount": 5,"messageCount": 7
}
-
點擊Send:
-
- 成功標志:下方響應去會看到
廣告數據創建成功2025-9-30
- 成功標志:下方響應去會看到
-
- 同時,回頭看我們的IDE控制臺(運行Spring Boot)的窗口,應該能看到打印出的接收到的數據信息。
- 同時,回頭看我們的IDE控制臺(運行Spring Boot)的窗口,應該能看到打印出的接收到的數據信息。
-
這個項目的源碼我放到了我的GitHub里,點擊Data_Board_Spring_Boot鏈接直接學習和使用即可~
總結
@RequestBody是靈魂:
- 它完成了
HTTP請求體 -> Java對象
的魔法轉換。這個過程叫“反序列化”,由Spring內置的Jackson庫自動完成。只需要定義一個Java類,字段名能和JSON的key對上就行。
為什么要有無參構造器和Getter/Setter?
- Jackson庫在創建對象和讀取/設置屬性時需要使用它們。沒有他們,轉換就會失敗。這也是之前為什么要強調生成這些方法的原因。
Web開發經驗
- 使用Spring Boot的@RestController開發過RESTful接口,包括處理GET和POST請求。并且我知道如何使用@RequestBody注解來接收前端發送的JSON格式參數,完成反序列化。
@SpringBootApplication
是一個組合注解,它包含了三個核心功能:
@SpringBootConfiguration
:標記該類為配置類@EnableAutoConfiguration
:開啟自動配置,這是Spring Boot的魔法所在,它根據您引入的jar包依賴(如Spring-Web,MySQL Driver),自動配置應用程序鎖需的組件(如Tomcat服務器、SpringMVC)。@ComponentScan
:自動掃描當前包及其子包下的組件(如@Controller,@Service,@RestController,@Component等),并注冊為Spring Bean。
包路徑的重要性
AdControlle控制器類
必須放在啟動類
的同級或者子包下!例如,如果啟動類在com.example.demo
包下,那么您的控制器最好放在com.example.demo.controller
包下。如果放在一個毫不相干的包路徑下,@ComponentScan
將無法發現它,導致404錯誤。