邪修實戰系列(3)


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)的窗口,應該能看到打印出的接收到的數據信息。
      在這里插入圖片描述
  • 這個項目的源碼我放到了我的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錯誤。

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

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

相關文章

【GD32】ROM Bootloader、自定義Bootloader區別

Bootloader是應用程序跑起來之前&#xff0c;用于初始化的一段程序&#xff0c;它分為兩種&#xff0c;ROM Bootloader、自定義Bootloader。GD32芯片出廠時預燒錄在ROM中的Bootloader&#xff08;以下簡稱ROM Bootloader&#xff09;和自己編寫的Bootloader&#xff08;以下簡稱…

Linux防火墻-Firewalld

一、 概述 按表現形式劃分&#xff1a; 軟件防火墻&#xff1a; 集成在系統內部&#xff0c;Linux系統&#xff1a; iptables、firewalld、ufw&#xff1b; windows系統下&#xff1a; windows defender 硬件防火墻&#xff1a; 華為防火墻、思科防火墻、奇安信防火墻、深信服防…

【Qt】PyQt、原生QT、PySide6三者的多方面比較

目錄 引言 一、基本定義 二、核心對比維度 1. 編程語言與開發效率 2. 功能與 API 兼容性 3. 性能表現 4. 許可證與商業使用 5. 社區與文檔支持 三、遷移與兼容性 四、適用場景推薦 五、總結對比表 總結 引言 PySide6、PyQt&#xff08;通常指 PyQt5/PyQt6&#xf…

JavaWeb站內信系統 - 技術設計文檔

1. 系統概述1.1 項目背景本系統旨在為企業或社區平臺提供一套完整的站內信解決方案&#xff0c;支持用戶之間的消息發送、接收、管理等功能&#xff0c;提升用戶間的溝通效率。1.2 設計目標實現用戶間消息發送和接收支持一對一和一對多消息發送提供消息狀態跟蹤&#xff08;已讀…

Java基礎 9.10

1.System類常見方法和案例exit&#xff1a;退出當前程序arraycopy&#xff1a;復制數組元素&#xff0c;比較適合底層調用&#xff0c;一般使用 Arrays.copyOf 完成復制數組int[] src{1,2,3};int[] dest new int[3]; System.arraycopy(src, 0, dest, 0, 3);currentTimeMilens&…

詳解flink性能優化

1. 簡介 Apache Flink是一個強大的流處理框架&#xff0c;其性能很大程度上取決于內存的使用效率。在大規模數據處理場景中&#xff0c;合理的內存配置和優化可以顯著提升Flink作業的性能和穩定性。本文將深入探討Flink內存優化的各個方面&#xff0c;包括狀態后端選擇、內存配…

VueFlow的箭頭怎么調整

正好最近用到了VueFlow組件&#xff0c;發現箭頭默認樣式太小&#xff0c;無法體現流程展示&#xff0c;因此翻閱相關資料得出下列方法&#xff0c;有什么更好的方法&#xff0c;大家可以推薦推薦&#xff0c;謝謝。方法1&#xff1a;通過邊&#xff08;Edge&#xff09;的樣式…

【Python】S1 基礎篇 P9 文件處理與異常處理技術

目錄文件讀取操作讀取文件的全部內容相對路徑和絕對路徑逐行訪問文件內容文件寫入操作寫入單行內容寫入多行內容結構化數據的存儲異常處理機制理解異常的工作原理ZeroDivisionError異常示例try-except語句塊的使用else語句塊的正確使用靜默失敗的合理應用本文將深入探討Python中…

分布式事務實戰手冊:從四場業務災難看方案選型與落地陷阱

在分布式系統的穩定性戰役中&#xff0c;數據一致性問題如同潛伏的暗礁。某生鮮電商因分布式事務設計缺陷&#xff0c;在春節促銷期間出現"下單成功但無庫存發貨"的悖論&#xff0c;3小時內產生2300筆無效訂單&#xff0c;客服投訴量激增300%&#xff1b;某銀行轉賬系…

Java算法題中的輸入輸出流

在Java算法題中&#xff0c;處理輸入輸出主要依賴系統流&#xff08;System.in和System.out&#xff09;&#xff0c;常用的方法總結如下&#xff1a; 一、輸入方法&#xff08;讀取系統輸入&#xff09; 主要通過java.util.Scanner類或BufferedReader類實現&#xff0c;適用于…

墨水屏程序

EPD Reader 基于ESP32-C3的電子墨水屏閱讀器&#xff0c;支持ap 配網、sntp 時間同步、txt閱讀、天氣預報、顯示節假日信息、農歷顯示、自動休眠、web配置等功能。這是在另一個項目 一個rust embassy esp32c3 的練習項目-CSDN博客的基礎上修改的 。 界面比較粗糙&#xff0c;以…

Git 創建 SSH 密鑰

1.生成 SSH 密鑰 打開 Git Bash ssh-keygen -t ed25519 -C "your_email@example.com" 把 ”your_email@example.com“ 改成再 github 注冊的郵箱 系統會提示您三次輸入: 第一個提示:Enter file in which to save the key (/c/Users/86189/.ssh/id_ed25519): 直接…

當前 AI 的主流應用場景

當前AI技術已深度滲透至社會各領域,2025年的主流應用場景呈現出行業垂直化、交互自然化、決策自主化三大特征。以下從六大核心領域展開分析,結合最新技術突破與規模化落地案例,揭示AI如何重塑人類生產生活范式: 一、智能辦公與生產力革命 AI正從工具升級為「數字同事」,…

EI會議:第六屆電信、光學、計算機科學國際會議(TOCS 2025)

第六屆電信、光學、計算機科學國際會議&#xff08;TOCS 2025&#xff09;定于11月21-23日在中國南陽舉行&#xff0c;本屆會議以“電信、光學、計算機科學”為主題&#xff0c;旨在為相關領域的專家和學者提供一個探討行業熱點問題&#xff0c;促進科技進步&#xff0c;增加科…

回歸預測 | MATLAB基于GRU-Attention的多輸入單輸出回歸預測

代碼是一個基于 MATLAB 的深度學習時間序列預測模型,結合了 GRU(門控循環單元)和自注意力機制(Self-Attention),用于回歸預測任務。 一、主要功能 使用 GRU + Self-Attention 神經網絡模型對時間序列數據進行回歸預測,評估模型在訓練集和測試集上的性能,并可視化預測結…

【JavaEE】(24) Linux 基礎使用和程序部署

一、Linux 背景知識 Linux 的第一個版本開發者是 Linus&#xff0c;所以部分人會叫“林納斯”。Linux 只是一個開源的操作系統內核&#xff0c;有些公司/開源組織基于 Linux 內核&#xff0c;配套了不同的應用程序&#xff0c;構成不同的操作系統&#xff08;比如 vivo、&#…

視覺SLAM第9講:后端1(EKF、非線性優化)

目標&#xff1a; 1.理解后端的概念&#xff1b; 2.理解以EKF為代表的濾波器后端的工作原理&#xff1b; 3.理解非線性優化的后端&#xff0c;明白稀疏性是如何利用的&#xff1b; 4.使用g2o和Ceres實際操作后端優化。 9.1 概述 9.1.1 狀態估計的概率解釋 1.后端優化引出 前段…

樓宇自控系統監控建筑變配電系統:功效體現在安全與節能層面

建筑變配電系統是保障建筑電力供應的 “心臟”&#xff0c;負責將外界高壓電轉化為建筑內設備可使用的低壓電&#xff0c;為暖通、照明、電梯等核心系統供電。傳統變配電管理依賴人工巡檢&#xff0c;不僅存在 “監測滯后、故障難預判” 的安全隱患&#xff0c;還因無法精準調控…

【Docker安裝使用常見問題匯總】

文章目錄1. wsl update failed: update failed:2.dockerDesktopLinuxEngine: The system cannot find the file specified.3. 中文語言包3.1. 下載中文包3.2 默認路徑如下&#xff1a;3.3 備份并替換 app.asar 文件&#xff1a;4. Get "https://registry-1.docker.io/v2/&…

Android面試指南(八)

目錄 1、Java語言相關 1.1、String的intern方法 1.2、HashMap的擴容 1.3、Java數組不支持泛型 1.4、泛型類型保留到運行時 1.5、匿名內部類使用的外部變量需要加final 2、Kotlin語言相關 3、設計模式 1、Java語言相關 1.1、String的intern方法 1&#xff09;、String…