首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 參數傳遞與數據綁定實戰:從 ModelAndView 到 @RequestBody 完整指南

     編輯:Java 綜合教學

Spring MVC 數據流向核心模型

前端請求 → DispatcherServlet → HandlerMapping → Controller方法參數綁定
                                                    ↓
返回 ModelAndView / String / @ResponseBody → ViewResolver → 視圖渲染 → 響應

一、ModelAndView 經典模式(後端→前端)

Controller 代碼

JSP 頁面取值 (success.jsp)

<%@ 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>

二、現代 REST 風格:@RequestBody + @ResponseBody (JSON 交互)

實體類

public class UserDTO {
    private String username;
    private String password;
    private Integer age;
    // getter/setter/toString 省略
}

Controller

 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));
}

JSR-303 校驗註解

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;
}

五、文件上傳綁定

六、常見問題與最佳實踐

1. @RequestParam vs @RequestBody 選擇

  • GET/DELETE:只能用 @RequestParam / @PathVariable(無請求體)
  • POST/PUT/PATCH:
    • Content-Type: application/x-www-form-urlencoded → @RequestParam / @ModelAttribute
    • Content-Type: application/json → @RequestBody
    • Content-Type: multipart/form-data → @RequestParam(MultipartFile)

2. 參數名匹配問題

// 前端傳 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;
    }
}

3. 避免在 Controller 處理業務邏輯

Controller 僅負責:參數接收→校驗→調用 Service→封裝響應。
業務邏輯、事務控制、異常處理全權委託 Service 層。

4. 統一異常處理

七、視圖解析器配置(傳統 JSP 模式)

<!-- 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% 場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved