spring 注解 @RequestParam
@GetMapping("/Login")
public void Login(@RequestParam String name,
@RequestParam String pwd,
HttpServletRequest request,
HttpServletResponse response) {
}
用最通俗的话来解释:@RequestParam 就像快递柜上的“取件码”。
当你访问一个网址时(比如 /Login?name=张三&pwd=123),网址问号后面的 name 和 pwd 就是“取件码”。@RequestParam 的作用就是告诉 Spring 框架:“去请求里把叫 name 的那个值拿过来,塞进我后面这个 String name 变量里。”
结合你写的代码,可以拆成 3 个日常场景来理解:
1. 按名字“精准取货”(默认用法)
你写的 @RequestParam String name,相当于让程序去请求参数里找键名为 name 的值。如果用户发来的请求是 /Login?name=张三,那么 name 变量里就会被自动赋值为“张三”。
2. 强制“必须有货”(必填属性)@RequestParam 默认是强制要求的(required=true)。这就像取快递时,如果柜子里没这个件(用户没传 name 参数),程序会直接报错 400,而不是把 name 变成 null。这能帮你提前发现前端漏传参数的问题。
3. 防止“空箱子”(设置默认值)
如果有些参数是可选的,但没传时你想给个默认值,可以用 defaultValue。比如:@RequestParam(defaultValue = "1") int page
如果用户没传 page,程序就默认给你赋值为 1,省去了自己写 if 判断的麻烦。
一句话总结:
它就是帮你省掉了以前写 Servlet 时那行 request.getParameter("name") 的繁琐代码,让代码看起来更清爽,同时还能自动做类型转换(比如把字符串 "123" 自动转成 int 类型的 123)。
那如果name 有这个key 值为空,程序会直接报错 400?
结论是:不会报 400,程序会正常执行,但 name 变量的值会变成空字符串 ""。
三种常见情况摆在桌面上对比:
1. Key 存在,但值为空(你问的情况)
请求地址:/Login?name=&pwd=123
-
结果:不报错。Spring 认为“既然你传了这个 key,我就认”,它会把空值直接赋给
name,此时name = ""(空字符串)。 -
隐患:你的 方法会拿着空字符串去查数据库,大概率查不到用户,但不会报 400 错。
2. Key 完全不存在(常见错误)
请求地址:/Login?pwd=123(漏掉了 name)
-
结果:直接报 400 错误。因为
@RequestParam默认是required=true,Spring 找不到name这个 key,就会抛出MissingServletRequestParameterException。
3. Key 存在,但值是数字类型(特殊陷阱)
请求地址:/Login?age=&pwd=123(假设参数是 int age)
-
结果:直接报 400 错误。因为 Spring 试图把空字符串
""转成int数字,转换失败,抛出类型转换异常。
特别提醒你注意一个“坑”:
如果你为了解决空值问题,给 name 加了默认值,比如:@RequestParam(defaultValue = "admin") String name
此时如果请求是 ?name=(值为空),默认值并不会生效!name 依然是空字符串 ""。因为 defaultValue 只在 Key 完全不存在时才触发。
建议你在业务层加一个非空判断,或者直接用 @RequestParam(required = false) 配合业务校验,自己控制返回什么错误提示(比如“用户名不能为空”),比直接报 400 更友好。
更多推荐



所有评论(0)