Spring MVC 全棧指南:RESTful 架構、核心注解與 JSON 實戰解析

目錄

  1. RESTful API 設計規范
  2. Spring MVC 核心注解解析
  3. 靜態資源處理策略
  4. JSON 數據交互全解
  5. 高頻問題與最佳實踐

一、RESTful API 設計規范

1.1 核心原則

原則說明示例 URI
資源為中心URI 使用名詞(復數形式)/users ?? /getUser ?
HTTP 方法語義化GET(查)、POST(增)、PUT(改)、DELETE(刪)DELETE /users/1
無狀態通信服務端不保存客戶端會話狀態每次請求攜帶完整認證信息

1.2 完整代碼示例

@RestController
@RequestMapping("/api/v1/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id);return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();}@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user) {User savedUser = userService.save(user);URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(savedUser.getId());return ResponseEntity.created(location).body(savedUser);}
}

1.3 高級技巧

  • HATEOAS 實現(響應中嵌入資源鏈接):
@GetMapping("/{id}/orders")
public CollectionModel<Order> getUserOrders(@PathVariable Long id) {List<Order> orders = orderService.findByUserId(id);Link selfLink = linkTo(methodOn(UserController.class).getUserOrders(id)).withSelfRel();return CollectionModel.of(orders, selfLink);
}
  • 響應示例
{"content": [ ... ],"_links": {"self": { "href": "/users/1/orders" }}
}

二、Spring MVC 核心注解解析

2.1 參數綁定注解

注解作用場景示例代碼
@PathVariable從 URI 路徑提取變量@GetMapping("/{id}")id=1
@RequestParam綁定查詢參數(支持默認值)@RequestParam(name="page", defaultValue="1")
@RequestBody將請求體 JSON 映射到 Java 對象public User createUser(@RequestBody User user)

2.2 元數據獲取注解

// 獲取 Cookie 值
@GetMapping("/session")
public String getSession(@CookieValue("JSESSIONID") String sessionId) { ... }// 讀取請求頭
@GetMapping("/headers")
public String getHeader(@RequestHeader("User-Agent") String userAgent) { ... }

2.3 作用域注解

注解作用域生命周期
@SessionAttribute讀取 Session 屬性用戶會話期間有效
@ModelAttribute預加載模型數據每次請求前執行

三、靜態資源處理策略

3.1 配置方式對比

方式配置示例適用場景
缺省 Servlet 放行web.xml 配置 <servlet-mapping>傳統項目兼容
resources 標簽<mvc:resources mapping="/img/**" location="/img/"/>明確指定資源目錄
default-servlet-handler<mvc:default-servlet-handler/>快速放行所有靜態資源

3.2 常見問題

  • JSP 未被放行:需通過視圖解析器處理,不屬于靜態資源。
  • 路徑沖突:避免控制器映射與靜態資源路徑重疊(如 /js/**/js/controller)。

四、JSON 數據交互全解

4.1 響應 JSON 配置

@RestController // = @Controller + @ResponseBody
public class ApiController {@GetMapping("/city/{id}")public City getCity(@PathVariable int id) {return cityService.findById(id);}
}

4.2 序列化控制

@Data
public class Product {@JsonIgnoreprivate String internalCode; // 不序列化@JsonFormat(pattern = "yyyy-MM-dd")private Date createTime;     // 日期格式化
}

4.3 依賴配置

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.0</version>
</dependency>

五、高頻問題與最佳實踐

5.1 常見錯誤

  1. RESTful 路徑設計混亂
    • ? /getUserOrders?userId=1 → ? GET /users/1/orders
  2. HTTP 方法誤用
    • ? 用 POST 請求更新資源 → ? 使用 PUT/PATCH
  3. JSON 日期序列化錯誤
    • 解決方案:@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

5.2 性能優化

  • 靜態資源緩存:配置 Cache-Control 頭減少重復請求。
  • Jackson 延遲加載:對大數據集使用 @JsonView 控制序列化字段。

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

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

相關文章

探索 JavaScript 中的 Promise 高級用法與實戰

在現代 Web 開發中&#xff0c;異步編程已成為不可或缺的一部分。JavaScript 作為 Web 開發的核心語言&#xff0c;提供了多種處理異步操作的方式&#xff0c;其中 Promise 對象因其簡潔、強大的特性而備受青睞。本文將深入探討 Promise 的高級用法&#xff0c;并結合實際案例&…

《軟件設計師》復習筆記(14.1)——面向對象基本概念、分析設計測試

目錄 一、面向對象基本概念 對象&#xff08;Object&#xff09; 類&#xff08;Class&#xff09; 抽象&#xff08;Abstraction&#xff09; 封裝&#xff08;Encapsulation&#xff09; 繼承&#xff08;Inheritance&#xff09; 多態&#xff08;Polymorphism&#…

ubuntu22.04 安裝有度即時通

1.官網下載deb的安裝包 官網地址&#xff1a;有度客戶端下載-有度 注意&#xff1a;這個網站的下載是有時間限制的&#xff0c;有時候無法下載 需要對應系統版本&#xff0c;否則無法使用 我之前使用了dpkg安裝了一個舊版本&#xff0c;卸載使用以下命名行&#xff1a; 使用…

ValueError: model.embed_tokens.weight doesn‘t have any device set

ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度學習框架(如 PyTorch)中使用,一般是在處理自然語言處理(NLP)任務時,用于指代模型中詞嵌入層(Embedding layer)的權重參數。下面詳細解釋: 詞嵌入層的作用 …

如何提高單元測試的覆蓋率

一、定位未覆蓋的代碼 ?利用 IDEA 的覆蓋率工具?&#xff1a; 右鍵測試類 → ?Run with Coverage&#xff0c;或使用 AltShiftF10&#xff08;Windows&#xff09;打開運行菜單選擇覆蓋率。?查看高亮標記?&#xff1a; ?綠色?&#xff1a;已覆蓋代碼行。?紅色?&#x…

聚合直播-Simple Live-v1.7.7-全網直播平臺能在一個軟件上看完

聚合直播-Simple Live 鏈接&#xff1a;https://pan.xunlei.com/s/VOO7u3o4FNL_XA9VJ6l7KBNfA1?pwdyrau# 聚合直播-Simple Live-v1.7.7-全網直播平臺能在一個軟件上看完

三大等待和三大切換

三大等待 1、三大等待&#xff1a;等待的方式有三種&#xff1a;強制等待&#xff0c;隱性等待&#xff0c;顯性等待。 1、強制等待&#xff1a;time.sleep(2)&#xff0c;秒 優點&#xff1a;使用簡單缺點&#xff1a;等待時間把握不準&#xff0c;容易造成時間浪費或者等待時…

使用Lombok @Builder 收參報錯提示沒有無參構造方法的原因與解決辦法

使用Lombok Builder 收參報錯提示沒有無參構造方法的原因與解決辦法 類上加了Builder之后接口接收前端傳來的參數報錯&#xff1a;(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 1.解決辦法…

SAP 查找JOB進程ID

如何查找后臺JOB的進程ID SM37勾選對于JOB

通過C# 將Excel表格轉換為圖片(JPG/ PNG)

Excel 表格可能會因為不同設備、不同軟件版本或字體缺失等問題&#xff0c;導致格式錯亂或數據顯示異常。轉換為圖片后&#xff0c;能確保數據的排版、格式和外觀始終保持一致&#xff0c;無論在何種設備或平臺上查看&#xff0c;都能呈現出固定的樣式&#xff0c;避免了因環境…

Langchain構建RAG對話應用

本文&#xff1a;關注 檢索器與上下文的子鏈、父鏈&#xff1b;即檢索器也需要上下文內容。 RAG是一種增強LLM知識的方法&#xff0c;通過引入額外的數據來實現。 實現思路&#xff1a;加載—》分割—》存儲—》檢索—》生成。 初始化 import os import bs4 from langchain.c…

關于模擬噪聲分析的11個誤區

目錄 1. 降低電路中的電阻值總是能改善噪聲性能 2. 所有噪聲源的噪聲頻譜密度可以相加&#xff0c;帶寬可以在最后計算時加以考慮 3. 手工計算時必須包括每一個噪聲源 4. 應挑選噪聲為ADC 1/10的ADC驅動器 5. 直流耦合電路中必須始終考慮1/f噪聲 6. 因為1/f噪聲隨著頻率降…

vue,uniapp解決h5跨域問題

如果有這樣的跨域問題&#xff0c;解決辦法&#xff1a; ? 第一步&#xff1a;在項目根目錄下創建 vue.config.js 和 package.json 同級目錄。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…

SQL通用語法和注釋,SQL語句分類(DDL,DML,DQL,DCL)及案例

目錄 SQL通用語法和注釋 SQL語句分類&#xff08;DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;TPL&#xff0c;CCL&#xff09; DDL&#xff08;數據定義語言&#xff09; 數據庫操作 查詢&#xff08;SHOW、SELECT&#xff09; 創建&#xff08;CREAT…

Linux:線程概念與控制

??所屬專欄&#xff1a;Linux?? ??作者主頁&#xff1a;嶔某?? Linux&#xff1a;線程概念于控制 var code “d7e241ae-ed4d-475f-aa3d-8d78f873fdca” 概念 在一個程序里的一個執行路線就叫做線程thread。更準確一點&#xff1a;線程是“一個進程內部的控制序列” …

人臉識別聯合行為檢測的辦公管理新模式

基于人臉識別與行為檢測的辦公智能化解決方案 一、背景 在傳統辦公場景中&#xff0c;員工考勤管理、工位使用情況統計、安全監控等環節存在諸多痛點。例如&#xff0c;傳統考勤方式如指紋打卡、刷卡等存在代打卡現象&#xff0c;考勤數據不準確&#xff1b;對于員工是否在工…

ceph weight 和 reweight 的區別

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630

WInform當今技術特性分析

Windows Forms (WinForms) 技術特性分析 引言 Windows Forms (WinForms) 作為微軟最早推出的基于.NET的圖形用戶界面開發框架&#xff0c;已經存在了20多年。在如今充滿了各種現代UI框架的軟件開發生態系統中&#xff0c;WinForms仍然保持著其獨特的地位。本文將深入分析WinF…

Spark rdd算子解析與實踐

一、RDD基礎回顧 RDD&#xff08;Resilient Distributed Dataset&#xff09; 是Spark的核心抽象&#xff0c;代表一個不可變、分區的分布式數據集合。其核心特性包括&#xff1a; 容錯性&#xff1a;通過血緣&#xff08;Lineage&#xff09;記錄數據生成過程&#xff0c;支…

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式數據庫。 所謂嵌入式&#xff0c;就是足夠簡單&#xff0c;可以嵌入到我們自己開發的應用程序之中。 在Linux系統中&#xff0c;sqlite的使用只需要使用它的API&#xff0c;連接它的動態連接庫&#xff0c;甚至都不用連接&#xff0c;sqlite的實現…