一、控制器相關注解
@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 user
在submitForm
方法中接收表單提交的數據,并自動綁定到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 應用。