Skip to content

@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 同时支持两种数据来源:

  1. URL 查询字符串GET /search?q=spring
  2. POST 表单数据Content-Typeapplication/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

Based on Spring Framework.