SpringBoot2:请求处理原理分析-常用接口方法参数整理

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.namepet.age

5、总结

对于这些传参,收参,返参的方式,以上作为学习了解。
实际开发中,我们都采用ajax+json传参,@RequestBody+json收参,@ResponseBody+json返参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值