Spring MVC 的常用注解

一、控制器相關注解

@Controller

@Controller注解用于標記一個類為 Spring MVC 的控制器。在 Spring MVC 框架里,控制器扮演著關鍵角色,負責接收 HTTP 請求并返回響應。當一個類被@Controller注解標記后,Spring 容器會自動識別并將其納入管理。例如:

@Controller
public class UserController {// 控制器方法將在這里定義
}

@RestController

@RestController是一個組合注解,它融合了@Controller@ResponseBody的功能。與傳統的@Controller不同,@RestController專門用于構建 RESTful Web 服務。在使用@RestController注解的類中,所有方法的返回值會直接作為響應體返回給客戶端,無需再進行視圖解析。這使得開發 RESTful 接口變得異常簡潔高效,例如:

@RestController
public class UserRestController {@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {// 從數據庫或其他數據源獲取用戶信息User user = userService.getUserById(id);return user;}
}

@RequestMapping

@RequestMapping是 Spring MVC 中用于映射 Web 請求到特定處理器方法的核心注解。它可以作用于類級別和方法級別。在類級別使用時,定義了該控制器的基礎路徑;在方法級別使用時,則定義了具體的 URL 模式映射。例如:

@Controller
@RequestMapping("/users")
public class UserController {@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String getUserById(@PathVariable Long id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "userDetails";}
}

在上述示例中,@RequestMapping("/users")定義了UserController的基礎路徑為/users,而@RequestMapping(value = "/{id}", method = RequestMethod.GET)則映射了一個 GET 請求到getUserById方法,路徑為/users/{id}

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping

這些注解分別對應 HTTP 的 GET、POST、PUT、DELETE、PATCH 請求方法,是@RequestMapping的快捷方式。它們使得代碼更加清晰易讀,明確表示了方法所處理的請求類型。例如:

@RestController
@RequestMapping("/products")
public class ProductController {@GetMapping("/{id}")public Product getProductById(@PathVariable Long id) {return productService.getProductById(id);}@PostMappingpublic Product createProduct(@RequestBody Product product) {return productService.createProduct(product);}@PutMapping("/{id}")public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {return productService.updateProduct(id, product);}@DeleteMapping("/{id}")public void deleteProduct(@PathVariable Long id) {productService.deleteProduct(id);}
}

二、請求參數綁定注解

@RequestParam

@RequestParam注解用于將 HTTP 請求中的參數綁定到控制器方法的參數上。它適用于 GET 和 POST 請求中的查詢參數或表單字段。例如:

@Controller
@RequestMapping("/search")
public class SearchController {@GetMappingpublic String searchProducts(@RequestParam String keyword, Model model) {List<Product> products = productService.searchProducts(keyword);model.addAttribute("products", products);return "searchResults";}
}

在這個例子中,@RequestParam String keyword將請求中的keyword參數綁定到searchProducts方法的keyword參數上。

@PathVariable

@PathVariable注解用于從 URI 模板中提取變量,并將其綁定到方法參數上,常用于 RESTful 風格的 URL 設計。例如:

@RestController
@RequestMapping("/orders")
public class OrderController {@GetMapping("/{orderId}")public Order getOrderById(@PathVariable Long orderId) {return orderService.getOrderById(orderId);}
}

在上述代碼中,@PathVariable Long orderId/orders/{orderId}這樣的 URL 路徑中提取orderId變量,并將其傳遞給getOrderById方法。

@RequestBody

@RequestBody注解用于將 HTTP 請求體的內容反序列化成 Java 對象,通常與 JSON 或 XML 格式的數據一起使用。在處理 POST 或 PUT 請求時,當請求體中包含復雜數據結構時,@RequestBody注解尤為重要。例如:

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);}
}

這里,客戶端發送的 JSON 格式的用戶信息會被自動反序列化為User對象,并傳遞給createUser方法。

@RequestHeader

@RequestHeader注解用于獲取 HTTP 請求頭信息并綁定到方法參數上。例如,要獲取請求中的Authorization頭信息:

@Controller
@RequestMapping("/protected")
public class ProtectedController {@GetMappingpublic String getProtectedResource(@RequestHeader String Authorization) {// 根據授權信息進行業務處理return "protectedResource";}
}

@CookieValue

@CookieValue注解用于獲取 Cookie 值并綁定到方法參數上。例如:

@Controller
@RequestMapping("/user")
public class UserProfileController {@GetMappingpublic String getUserProfile(@CookieValue("JSESSIONID") String sessionId) {// 根據會話ID獲取用戶信息return "userProfile";}
}

三、返回值處理注解

@ResponseBody

@ResponseBody注解表示該方法的返回結果應直接寫入 HTTP 響應體中,而不是解析為視圖名。在構建 RESTful 服務時,它常與@RestController一起使用。例如:

@Controller
public class JsonController {@ResponseBody@GetMapping("/data")public List<DataObject> getData() {return dataService.getData();}
}

@ModelAttribute

@ModelAttribute注解有兩個主要用途:一是將數據添加到模型中,供視圖使用;二是用于方法參數,接收來自表單提交的數據并綁定到對象上。例如:

@Controller
@RequestMapping("/form")
public class FormController {@GetMappingpublic String showForm(Model model) {model.addAttribute("user", new User());return "form";}@PostMappingpublic String submitForm(@ModelAttribute User user) {userService.saveUser(user);return "redirect:/success";}
}

在上述代碼中,@ModelAttribute User usersubmitForm方法中接收表單提交的數據,并自動綁定到User對象上。

四、數據驗證注解

@Valid 和 @Validated

@Valid@Validated注解用于觸發 JSR - 303/JSR - 380(Bean Validation API)的驗證機制,確保傳入的數據符合預定義的規則。@Valid通常直接用于方法參數上,而@Validated可以用于類、方法和參數上,并且支持分組驗證。例如:

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@Valid @RequestBody User user) {return userService.createUser(user);}
}

@Size、@Min、@Max、@NotNull、@Email 等

這些是具體的驗證注解,用于對字段進行約束檢查。例如,使用@Size注解限制字符串長度:

public class User {@NotNullprivate String username;@Size(min = 6, max = 20)private String password;@Emailprivate String email;// 省略getter和setter方法
}

在這個User類中,username字段不能為空,password字段長度必須在 6 到 20 之間,email字段必須符合郵箱格式。

五、攔截器和異常處理注解

@ExceptionHandler

@ExceptionHandler注解用于定義全局異常處理方法,可以捕獲并處理特定類型的異常。例如:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(NotFoundException.class)public ResponseEntity<String> handleNotFoundException(NotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found: " + ex.getMessage());}
}

@ControllerAdvice

@ControllerAdvice注解用于定義全局的異常處理邏輯或數據綁定邏輯,可以應用于所有控制器。它使得代碼中的異常處理更加集中和統一,提高了代碼的可維護性。

六、其他常用注解

@SessionAttributes

@SessionAttributes注解用于指定哪些模型屬性應該存儲在 HTTP 會話中,以便跨多個請求保持狀態。

@Controller
@SessionAttributes("user")
public class UserSessionController {@GetMapping("/login")public String login(Model model) {model.addAttribute("user", new User());return "login";}@PostMapping("/login")public String doLogin(@ModelAttribute User user, SessionStatus sessionStatus) {if (userService.validateUser(user)) {sessionStatus.setComplete();return "redirect:/home";} else {return "login";}}
}

@CrossOrigin

@CrossOrigin注解用于啟用跨域資源共享(CORS),允許前端應用從不同源訪問后端 API。在前后端分離的項目中,該注解非常有用。例如:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:3000")
public class ApiController {// API方法定義
}

在上述代碼中,@CrossOrigin(origins = "http://localhost:3000")允許來自http://localhost:3000的前端應用訪問該控制器的 API。

? ? ? ?Spring MVC 中的這些常用注解為開發者提供了強大而靈活的工具,極大地簡化了 Web 應用程序的開發過程。通過合理使用這些注解,我們能夠更加高效地構建功能豐富、易于維護的 Web 應用。

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

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

相關文章

Oracle APEX 利用卡片實現翻轉(方法一)

目錄 0. 以 Oracle 的標準示例表 EMP 為例&#xff0c;實現卡片翻轉 1. 創建PL/SQL動態內容區域 2. 添加 CSS 實現翻轉效果 3. 添加動態操作 (Dynamic Action) 4. 看效果 0. 以 Oracle 的標準示例表 EMP 為例&#xff0c;實現卡片翻轉 正面&#xff1a; 顯示員工姓名 (EN…

Gradio全解11——Streaming:流式傳輸的視頻應用(1)——FastRTC:Python實時通信庫

Gradio全解11——Streaming&#xff1a;流式傳輸的視頻應用&#xff08;1&#xff09;——FastRTC&#xff1a;Python實時通信庫前言第11章 Streaming&#xff1a;流式傳輸的視頻應用11.1 FastRTC&#xff1a;Python實時通信庫11.1.1 WebRTC協議與FastRTC介紹1. WebRTC協議的概…

一文學會二叉搜索樹,AVL樹,紅黑樹

文章目錄二叉搜索樹查找插入刪除AVL樹概念插入旋轉AVL驗證紅黑樹概念插入檢測二叉搜索樹 也稱二叉排序樹或二叉查找樹 二叉搜索樹&#xff1a;可以為空&#xff0c;若不為空滿足以下性質 ?1&#xff0c;非空左子樹小于根節點的值 ?2&#xff0c;非空右子大于根節點的值 ?3…

Android實戰進階 - 啟動頁

場景&#xff1a;當啟動頁處于倒計時階段&#xff0c;用戶將其切換為后臺的多任務卡片狀態&#xff0c;倒計時會繼續執行&#xff0c;直到最后執行相關邏輯&#xff08;一般會跳轉引導頁、進入主頁等&#xff09; 期望&#xff1a;而綜合市場來看&#xff0c;一般我們期望的是當…

無標記點動捕技術:重塑展廳展館的沉浸式數字交互新時代

在元宇宙浪潮的持續推進下&#xff0c;虛擬數字人正逐漸成為連接虛實世界的重要媒介。在展廳展館中&#xff0c;數字人不僅能夠扮演導覽員、講解員角色&#xff0c;更可通過情感化交互提升參觀體驗&#xff0c;使文化傳播更具感染力和沉浸感。虛擬人的引入&#xff0c;為傳統展…

輕松Linux-7.Ext系列文件系統

天朗氣清&#xff0c;惠風和煦&#xff0c;今日無事&#xff0c;遂來更新。 1.概述 總所周知&#xff0c;我們存的數據都是在一個叫硬盤的東西里面&#xff0c;這個硬盤又像個黑盒&#xff0c;這章就來簡單解析一下Linux中文件系統。 現在我們用的大都是固態硬盤&#xff0c;…

Matlab機器人工具箱使用4 蒙特卡洛法繪制工作區間

原理&#xff1a;利用rand隨機數&#xff0c;給各個關節設置隨機關節變量&#xff0c;通過正運動學得到末端位姿變換矩陣&#xff0c;然后利用變換矩陣2三維坐標標記出末端坐標&#xff0c;迭代多次就可以構成點云。教程視頻&#xff1a;【MATLAB機器人工具箱10.4 機械臂仿真教…

【項目】在AUTODL上使用langchain實現《紅樓夢》知識圖譜和RAG混合檢索(三)知識圖譜和路由部分

首先在數據集 - 開放知識圖譜下載紅樓夢的知識圖譜&#xff0c;這個網站上有各種各樣的知識圖譜&#xff0c;可以挑你感興趣的做( ? ?ω?? ) 這個知識圖譜的作者們已經將三元組抽取出來了&#xff0c;我們可以直接用&#xff0c;如果你對三元組是如何生成的感興趣&#xf…

pycharm 最新版上一次編輯位置

2025nipycharm方法一&#xff1a;用快捷鍵&#xff08;最方便&#xff09;跳回上一次編輯位置&#xff1a;Windows/Linux: Ctrl Alt ←macOS: ? Option ←跳到前一次位置&#xff1a;Windows/Linux: Ctrl Alt →macOS: ? Option →方法二&#xff1a;顯示工具欄按鈕在…

前端性能監控與優化:從 Lighthouse 到 APM

在當今競爭激烈的數字環境中&#xff0c;用戶對Web應用性能的要求日益提高。一個緩慢或響應遲鈍的應用不僅會流失用戶&#xff0c;更可能損害品牌形象和商業價值。因此&#xff0c;前端性能的監控與優化已成為前端開發不可或缺的關鍵環節。本文將深入探討從基礎的性能評估工具L…

TC_Motion多軸運動-電子齒輪

目錄 電子齒輪 【基本概念】 【應用示例】 【開發總結】 END 電子齒輪 【基本概念】 定義:通過軟件方法實現機械齒輪的速比調節功能(兩個軸成線性比例旋轉) 優點 免維護,告別機械損耗 易調節,任意修改齒輪比 精度高,無機械背隙 應用場景 多臺電機拖動同一負載,要求多臺…

CentOS 7 下載教程

訪問阿里云鏡像站 阿里巴巴開源鏡像站 選擇centos 點這個 選擇7版本 進入isos目錄 點這個 選擇這個版本 因為這個鏡像的日期更新 推薦下載 DVD 版&#xff1a;包含完整系統和常用軟件&#xff0c;無需額外聯網安裝組件Minimal 版&#xff1a;精簡版&#xff0c;僅包含基礎系…

MAC在home下新建文件夾報錯“mkdir: test: Operation not supported”

在Mac電腦中&#xff0c;home文件夾下不能直接mkdir&#xff0c;sudo 也還是不行&#xff0c;提示“mkdir: test: Operation not supported”。網上找的解決方案不好使&#xff0c;因為沒有關閉系統完整性保護關閉系統完整性保護查看SIP當前的狀態csrutil status如果是開啟狀態…

交叉導軌從測試儀到工作臺的精密運動控制

在精密儀器領域微米級的運動精度與納米級的穩定性往往是決定設備性能上限的核心指標。而支撐這一技術鴻溝跨越的&#xff0c;往往隱匿于機械結構的“毫厘之間”——交叉導軌。以下是其在不同精密儀器中的具體應用&#xff1a;光學測試儀&#xff1a;光學測試儀主要用于各種高精…

內網穿透的應用-Navidrome與cpolar本地搭建跨網絡訪問的云音樂服務器

文章目錄前言1. 安裝Docker2. 創建并啟動Navidrome容器3. 公網遠程訪問本地Navidrome3.1 內網穿透工具安裝3.2 創建遠程連接公網地址3.3 使用固定公網地址遠程訪問前言 音樂收藏存在平臺版權限制、音質壓縮和訪問不便等問題。Navidrome 開源音樂服務器與 cpolar 內網穿透服務的…

FastAPI 訪問不了API文檔或配置不生效的解決方法

FastAPI中文教程 本文背景 FastAPI框架自帶交互式api文檔,通過路由/docs或者/redoc 訪問&#xff0c;但是FastAPI 的文檔界面&#xff08;如 /docs 和 /redoc&#xff09;依賴于外部的 JavaScript 和 CSS 庫&#xff0c;如果項目部署環境網絡不佳或者無法訪問外網的時候&…

IAR 集成開發環境入門指南:字體設置與調試實戰

一、IAR 的基本使用教程1. IAR 顏色字體大小設置打開設置路徑&#xff1a;點擊頂部菜單欄 Tools → 選擇 Options&#xff0c;打開 IDE 配置窗口。進入字體顏色設置界面&#xff1a;在彈出的 “IDE Options” 窗口中&#xff0c;雙擊展開 Editor 選項&#xff0c;然后點擊 Colo…

10:00開始面試,10:06就出來了,問的問題有點變態。。。

從小廠出來&#xff0c;沒想到在另一家公司又寄了。到這家公司開始上班&#xff0c;加班是每天必不可少的&#xff0c;看在錢給的比較多的份上&#xff0c;就不太計較了。沒想到8月一紙通知&#xff0c;所有人不準加班&#xff0c;加班費不僅沒有了&#xff0c;薪資還要降40%,這…

Flink 狀態管理的核心能力

我們來看一個復雜的實際案例&#xff1a;阿里巴巴菜鳥的實時物流追蹤系統。 該系統處理來自多個電商平臺&#xff08;天貓、淘寶、速賣通&#xff09;的訂單包裹&#xff0c;通過一個復雜的處理流程&#xff1a; 合并與去重&#xff1a;通過聚合操作將不同來源的訂單合并并去重…

基于go語言的云原生TodoList Demo 項目,驗證云原生核心特性

以下是一個基于 Go 語言 的云原生 TodoList Demo 項目&#xff0c;涵蓋 容器化、Kubernetes 編排、CI/CD、可觀測性、彈性擴縮容 等核心云原生特性&#xff0c;代碼簡潔且附詳細操作指南&#xff0c;適合入門學習。項目概覽 目標&#xff1a;實現一個支持增刪改查&#xff08;C…