文章目录
- 1、常用的原生API参数
- 2、一些自带的复杂参数
- 3、自定义Bean参数
- 4、自定义参数转换服务
- 5、总结
1、常用的原生API参数
作用说明:在接口方法参数放入一些原生API
作为参数使用。
案例:
接口收参形式:
@RequestMapping("/test")
public void test(HttpServletRequest request,
HttpServletResponse response,
ServletRequest sreq,
WebRequest webRequest,
MultipartRequest mrequest,
Reader reader,
HttpSession session,
PushBuilder pushBuilder,
Principal principal,
InputStream inputStream,
HttpMethod method,
Locale locale,
TimeZone timeZone,
ZoneId zoneId) {
}
请求传参形式:
注意
MultipartRequest mrequest,
Reader reader, 这个参数,我暂时没找到用postman如何传值
这两个参数,必须要传入对应的实参值,否则接口报错。
对应的参数解析器:org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver#supportsParameter
返回结果:
空字符串
2、一些自带的复杂参数
Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder
这里,我不在一个个的测试,大家可以自己在接口方法处写上这些参数,然后,debug
,查看对应的参数解析器原理即可。
这里,我重点说明一下Map、Model
的作用。
在接口方法参数设置Map、Model
之后,如果我们的接口做转发处理,那么,对应的参数设置在Map、Model
内,会自动代入转发后的接口的request对象中,从而,通过request
对象获取新设置的参数值。
案例:
接口收参形式:
转发接口
@GetMapping("/params")
public String testParam(Map<String,Object> map,
Model model,
HttpServletRequest request,
HttpServletResponse response){
map.put("hello","world666");
model.addAttribute("world","hello666");
request.setAttribute("message","HelloWorld");
Cookie cookie = new Cookie("c1","v1");
response.addCookie(cookie);
return "forward:/success";
}
目标接口
@ResponseBody
@GetMapping("/success")
public Map success(@RequestAttribute(value = "msg",required = false) String msg,
@RequestAttribute(value = "code",required = false)Integer code,
HttpServletRequest request){
Object msg1 = request.getAttribute("msg");
Map<String,Object> map = new HashMap<>();
Object hello = request.getAttribute("hello");
Object world = request.getAttribute("world");
Object message = request.getAttribute("message");
Object content = request.getAttribute("content");
map.put("reqMethod_msg",msg1);
map.put("annotation_msg",msg);
map.put("hello",hello);
map.put("world",world);
map.put("content",content);
map.put("message",message);
return map;
}
请求传参形式:
返回结果:
{
"reqMethod_msg": null,
"world": "hello666",
"annotation_msg": null,
"hello": "world666",
"message": "HelloWorld",
"content": null
}
可以看出,在转发接口中,通过Map、Model
设置的参数值,被request
带到目标接口处。
3、自定义Bean参数
作用说明:将页面多个字段参数,封装成我们自己的Bean
,简化代码。
案例:
接口收参形式:
两个Bean
对象
@Data
public class Person {
private String userName;
private Integer age;
private Date birth;
private Pet pet;
}
@Data
public class Pet {
private String name;
private Integer age;
}
@PostMapping("/saveuser")
public Person saveuser(Person person){
return person;
}
请求传参形式:
字段名和值类型、格式,要和Bean
中的字段名和值类型、格式对应上。
返回结果:
{
"userName": "zhangsan",
"age": 18,
"birth": "2019-12-09T16:00:00.000+00:00",
"pet": {
"name": "4444",
"age": 5555
}
}
原理解析:
这个自定义Bean的参数解析器是
org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor
这个参数解析器里面,涉及到两个新的组件
1、数据绑定器:WebDataBinder
。
2、数据类型转换服务:Converters
(springboot默认配置了124种)
我们也可以自定义转换服务,注册到IOC容器
中,处理我们自定义的数据格式。
4、自定义参数转换服务
配置类里注册自定义转换服务
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter<String, Pet>() {
@Override
public Pet convert(String source) {
// 啊猫,3
if(!StringUtils.isEmpty(source)){
Pet pet = new Pet();
String[] split = source.split(",");
pet.setName(split[0]);
pet.setAge(Integer.parseInt(split[1]));
return pet;
}
return null;
}
});
}
};
}
这样配置后了,我们页面关于pet的参数就可以这样传递
<input name="pet" value="啊猫,3"/>
不需要再pet.name
和pet.age
了
5、总结
对于这些传参,收参,返参
的方式,以上作为学习了解。
实际开发中,我们都采用ajax+json
传参,@RequestBody+json
收参,@ResponseBody+json
返参。