springmvc之注解
SpringMVC注解解释
1、@RequestParam
这个注解只能够接收来自请求地址后缀中的值,而不能够接收到请求体中的参数的值:
@PostMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value = "id") Integer id){
System.out.println(id);
return "success";
}
在利用ApiPost来进行测试的时候,可以看到:
Post:localhost:8080/hello/testRequestParam
{
"id":1
}
返回回来的结果是:
Request","trace":"org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter 'id' is not present\r\n\tat
这里是说需要的Integer类型的参数是没有展现出来。但是实际上,我是将这个参数放在了请求体中。
由此可以总结出来,@RequestParam这个注解注释的值只能够在localhost:8080/hello/testRequestParam?id=1,这个后缀后面来进行添加。而不管是post还是get方式的请求。将上面的@PostMapping修改成为@GetMapping即可。
再看下里面的参数:
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
// 这里默认是必须传的,这里可以手动设置
boolean required() default true;
// 如果不传值,那么将默认的使用这个值
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
2、@RequestBody
用于方法的参数上,表示把请求体的数据,赋值给方法参数。
从这里可以看到只有是Post方式的请求才会有请求体,所以这里必须是post请求方式才可以。
注意:这里使用这个注解是可以接收所有来自请求体中所有的内容的。通常这里传输的是json格式的数据,但是我们先通过下面的方式来测试一下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/hello/testRequestBody" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="submit" value="post提交">
</form>
</body>
</html>
然后在controller中编写一个测试用例:
@PostMapping("/testRequestBody")
public String testRequestBody(@RequestBody String str){
System.out.println(str);
return "success";
}
查看控制台输出:
username=111&password=222
但是通常我们都不会拿到这个数据来进行操作,我们希望能够将这串数据来进行转换。
也就是说希望能够将这串数据转换成json数据格式。
那么也是可以的,在当前的spring boot中已经集成了将json转换成对象的工具类,所以这里就不再需要我们来进行转换了。
这里在ApiPost中发送post请求,并传递json格式数据
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@Builder(toBuilder = true)
public class LoginUser {
private String username;
private String password;
}
测试代码:
@PostMapping("/testRequestBodyTwo")
public String testRequestBodyTwo(@RequestBody LoginUser loginUser){
System.out.println(loginUser);
return "success";
}
查看控制台:
LoginUser(username=111, password=222)
查看下源代码:
public @interface RequestBody {
boolean required() default true;
}
这里没什么好说的,默认为true,也就是需要请求体。
其他的之后再来慢慢进行补充。
从理论中来,到实践中去,最终回归理论