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

Spring MVC 參數綁定與 Servlet 資源注入全解析:@PathVariable、@RequestParam、@RequestHeader、@CookieValue 實戰指南

     編輯:Java 綜合教學

核心註解體系

Spring MVC 通過 HandlerMethodArgumentResolver 機制,將 HTTP 請求各維度數據自動映射為 Controller 方法參數。

1. @PathVariable —— RESTful 路徑參數提取

@GetMapping("/users/{id}/posts/{postId}")
public ResponseEntity getPost(
    @PathVariable Long id,
    @PathVariable("postId") Long postId, // 參數名不同時指定
    @PathVariable Map allPathVars) { // 批量獲取
    // ...
}

支持正則約束:@GetMapping("/users/{id:\\d+}")。

2. @RequestParam —— 請求參數綁定 (query/form/data)

@PostMapping("/search")
public List search(
    @RequestParam(required = false, defaultValue = "10") int size,
    @RequestParam(required = false) List tags, // 多值綁定 List/Set/Array
    @RequestParam Map allParams,       // 全量參數 Map
    @RequestParam MultiValueMap mvParams) { // 多值 Map
    // ...
}

關鍵屬性:value/name (參數名)、required (默認 true、缺失拋 400)、defaultValue (隱含 required=false)。

3. @RequestHeader / @CookieValue —— Header 與 Cookie 映射

@GetMapping("/demo")
public void demo(
    @RequestHeader("User-Agent") String ua,
    @RequestHeader(required = false) String xRequestId,
    @CookieValue(value = "JSESSIONID", required = false) String sessionId,
    @CookieValue Map allCookies) {
    // ...
}

4. POJO 自動綁定 (Command/Form Backing Object)

public class UserForm {
    private String username;
    private int age;
    private Address address; // 級聯綁定 address.city
    // getter/setter
}

@PostMapping("/register")
public String register(UserForm form) { // 直接接收
    // Spring 自動按請求參數名匹配屬性,支持巢狀對象
}

原理:ServletRequestDataBinder → DataBinder.doBind() → PropertyAccessor 反射設置屬性。

5. 原生 Servlet API 直接注入

方法參數聲明即可自動注入,無需註解:

  • HttpServletRequest、HttpServletResponse
  • HttpSession
  • Locale、TimeZone
  • InputStream/Reader (請求體)、OutputStream/Writer (響應體)
  • Principal (安全主體)
@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest request) {
    return request.getSession().getId();
}

進階:自定義 ArgumentResolver

public class CurrentUserResolver implements HandlerMethodArgumentResolver {
    @Override public boolean supportsParameter(MethodParameter p) {
        return p.hasParameterAnnotation(CurrentUser.class);
    }
    @Override public Object resolveArgument(...) {
        return SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

// 配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override public void addArgumentResolvers(List resolvers) {
        resolvers.add(new CurrentUserResolver());
    }
}

// 使用
@GetMapping("/profile")
public User profile(@CurrentUser User user) { ... }

總結對比表

註解數據源典型場景多值支持
@PathVariableURL 路徑佔位符RESTful 資源標識否
@RequestParamQuery String / Form Data表單提交、查詢參數List/Set/Array/Map
@RequestHeaderHTTP Header認證 Token、客戶端信息List/Map
@CookieValueCookieSession 追蹤、偏好設置Map
POJO 綁定綜合以上複雜表單、DTO 接收級聯對象、集合屬性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved