@RequestParam
你可以使用 @RequestParam 注解将 Servlet 请求参数(即查询参数或表单数据)绑定到控制器的处理方法参数上。
使用示例
java
@Controller
@RequestMapping("/pets")
public class EditPetForm {
@GetMapping
public String setupForm(@RequestParam("petId") int petId, Model model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
}kotlin
import org.springframework.ui.set
@Controller
@RequestMapping("/pets")
class EditPetForm {
@GetMapping
fun setupForm(@RequestParam("petId") petId: Int, model: Model): String {
val pet = this.clinic.loadPet(petId)
model["pet"] = pet
return "petForm"
}
}特性说明
- 可选性:默认情况下该参数是必传的。设置
required = false或使用java.util.Optional包装可将其变为可选。 - 多值支持:如果参数类型声明为数组或
List,可以接收同名的多个参数值。 - 全参数映射:如果注解在
Map<String, String>或MultiValueMap<String, String>上且未指定参数名,则 Map 会包含所有的请求参数。
隐式使用
如果方法参数是简单类型(由 BeanUtils#isSimpleProperty 确定)且未被其他解析器处理,Spring 会将其视为带有 @RequestParam 的参数。因此,该注解在许多情况下是可选的。
补充教学
1. 查询参数 vs 表单提交
@RequestParam 同时支持两种数据来源:
- URL 查询字符串:
GET /search?q=spring。 - POST 表单数据:
Content-Type为application/x-www-form-urlencoded的请求主体。 Spring 抹平了这两者的区别,让你的代码更统一。
2. 默认值的重要性
在处理分页或排序时,推荐始终提供 defaultValue:
java
public void list(@RequestParam(defaultValue = "1") int page)这样不仅能防止用户未传参数导致的 400 Bad Request 错误,还能提高接口的健壮性。
3. 不要搞混 @RequestParam 和 @PathVariable
- @PathVariable:用于获取 URL 路径结构中的一部分(
/users/12)。 - @RequestParam:用于获取
?之后的键值对或表单字段。 准则:如果是定位资源的核心标识,用PathVariable;如果是过滤、搜索或提交数据,用RequestParam。