前端請求 → DispatcherServlet → HandlerMapping → Controller方法參數綁定
↓
返回 ModelAndView / String / @ResponseBody → ViewResolver → 視圖渲染 → 響應
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html>
<!-- 1. EL 表達式直接取值(推薦) -->
簡單值: ${ok} <br/>
對象屬性: ${user.name}, ${user.age} <br/>
集合遍歷:
<c:forEach items="${list}" var="item">${item} </c:forEach> <br/>
<!-- 2. 顯式指定作用域 -->
requestScope: ${requestScope.ok} <br/>
sessionScope: ${sessionScope.user} <br/>
</html>
public class UserDTO {
private String username;
private String password;
private Integer age;
// getter/setter/toString 省略
}
e.getDefaultMessage())
.collect(Collectors.joining("; "));
return Result.error(400, msg);
}
// 2. 業務邏輯
UserVO vo = userService.login(dto.getUsername(), dto.getPassword());
// 3. 返回 JSON(自動序列化)
return Result.success(vo);
}
@GetMapping("/{id}")
public Result<UserVO> getById(@PathVariable Long id) {
return Result.success(userService.getById(id));
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
private Integer code; // 200 成功, 400 參數錯誤, 500 服務異常
private String message;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(200, "成功", data);
}
public static <T> Result<T> error(Integer code, String message) {
return new Result<>(code, message, null);
}
}
| 註解 | 用途 | 適用場景 | 示例 |
|---|---|---|---|
| @RequestParam | 綁定請求參數(query/form) | GET 參數、表單提交 | @RequestParam("id") Long id |
| @PathVariable | 綁定 URI 模板變量 | RESTful 路徑參數 | @PathVariable("id") Long id |
| @RequestBody | 綁定請求體(JSON/XML) | POST/PUT JSON 請求 | @RequestBody UserDTO dto |
| @RequestHeader | 綁定請求頭 | Token、Content-Type | @RequestHeader("Authorization") String token |
| @CookieValue | 綁定 Cookie 值 | Session 追蹤 | @CookieValue("JSESSIONID") String sessionId |
| @ModelAttribute | 綁定表單數據到對象 / 暴露模型數據 | 表單回顯、全局模型 | @ModelAttribute UserForm form |
| @SessionAttribute | 綁定 Session 屬性 | 登錄用戶信息 | @SessionAttribute("user") User user |
| @RequestAttribute | 綁定 Request 屬性(攔截器/Filter 設置) | 鏈路追蹤 ID | @RequestAttribute("traceId") String traceId |
public class OrderDTO {
private Long userId;
private List<OrderItemDTO> items; // 集合綁定
private AddressDTO address; // 嵌套對象綁定
// getter/setter
}
@PostMapping("/orders")
public Result<OrderVO> createOrder(@RequestBody @Valid OrderDTO dto) {
// JSON 示例:
// {
// "userId": 1,
// "items": [{"productId": 100, "quantity": 2}],
// "address": {"province": "浙江", "city": "杭州"}
// }
return Result.success(orderService.create(dto));
}
public class UserDTO {
@NotBlank(message = "用戶名不能為空")
@Size(min = 3, max = 20, message = "用戶名長度 3-20")
private String username;
@NotBlank(message = "密碼不能為空")
@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$", message = "密碼需含字母數字且≥8位")
private String password;
@Min(value = 18, message = "必須成年")
@Max(value = 120, message = "年齡不合法")
private Integer age;
@Email(message = "郵箱格式錯誤")
private String email;
}
// 前端傳 user_name,後端屬性 userName
// 方案1:@RequestParam("user_name") String userName
// 方案2:全局開啟駝峰映射(Jackson)
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
return mapper;
}
}
Controller 僅負責:參數接收→校驗→調用 Service→封裝響應。
業務邏輯、事務控制、異常處理全權委託 Service 層。
<!-- spring-mvc.xml -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- Controller 返回 "success" → 解析為 /WEB-INF/views/success.jsp -->
總結:Spring MVC 數據傳遞核心是「參數綁定」與「模型暴露」。現代項目以 @RestController + @RequestBody + JSON 為主,傳統項目用 @Controller + ModelAndView + JSP/Thymeleaf。掌握註解語義、綁定規則、校驗機制、異常統一處理,即可應對 95% 場景。