springboot关于参数的注解

基本介绍

1.SpringBoot接收客户端提交数据/参数会使用到相关注解

2.详解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、

@CookieValue,@RequestBody

接下来,演示各种方式提交数据/参数给服务器,服务器如何使用注解接收


@PathVariable

作用:获取路径中的变量

前端参数输出。不用在href指定method="get"

<a href="/spring/monster/100/qiuqiu" >@PathVariable 路径变量 /id/name</a>

后端接收参数输入

  • @PathVariable的value需要和{占位符}一致

  • @PathVariable的value 可以和形参不一致

@RestController
public class ParameterController {
    @GetMapping("/monster/{id}/{name}")
    public String pathVariable(@PathVariable("id") Integer id,
                               @PathVariable("name") String username,
                               @PathVariable Map<String,String> map){
        System.out.println("id="+id);
        System.out.println("username="+username);
        System.out.println("map="+map);
        return "PathVariable";
    }
}

@RequestHeader

作用:获取请求头全部信息,或者指定信息。

前端请求代码

<a href="/spring/requestHeader">@RequestHeader 请求头信息获取~</a>

后端获取请求头代码

    @GetMapping("/requestHeader")
    public String requestHeader(@RequestHeader("host") String host,
                                @RequestHeader("ACCEPT")String accept,
                                @RequestHeader() Map<String,String> header){
        System.out.println("host-"+host);
        System.out.println("accept-"+accept);
        System.out.println("header-"+header);
        return "requestHeader-success";
    }

可以通过@RequestHeader的value获取指定的字段。也可以不设置字段,传递给Map所有字段。


@RequestParameter

作用:获取请求参数。

前端参数传递。方法一:

<a href="/spring/requestParam?name=stein&fruit=pineapple&fruit=peach">@RequestParam 请求参数</a><br/>

方法二:

<form action="/spring/requestParam" method="get">
    name: <input type="text" name="name"><br/>
    fruit1:<input type="text" name="fruit"><br/>
    fruit2:<input type="text" name="fruit"><br/>
    <input type="submit" value="提交内容"><br/>
</form>

后端参数接收

    @GetMapping("/requestParam")
    public String requestParam(@RequestParam("name") String username,
                               @RequestParam("fruit") String fruit,
                               @RequestParam Map<String,String> params){
        System.out.println("name="+username);
        System.out.println("fruit="+fruit);
        System.out.println("params="+params);
        return "RequestParam-success";
    }
  • @RequestParam()的value依然和前端传递过来的参数名保持一致,形参名可以不一致

  • @RequestParam()和RequestParam是一样的。能把所有参数传递给map,因为map是集合,key是唯一的,所以有重复参数名的话,只能保存第一个。params={name=stein, fruit=pineapple}

  • 前端传递了2个fruit参数,都能保存到fruit里面。fruit=pineapple,peach

@CookieValue

作用:获取cookie的值

前端

<a href="/spring/cookie">@CookieValue--获取cookie值</a>

后端:

代码说明:

1.valve="cookie._key"表示接收名字为cookie_key的cookie

2.如果浏览器携带来对应的cookie,那么后面的参数是String,则接收到的是对应的valve。(参考cookie.name-cookie.value)

3.后面的参数是Cookie,则接收到的是封装好的对应的cookie。整个cookie

4.required=false,表明允许没有该参数时,可以继续执行。当写了required时,value属性名不能省略

5.HttpServletRequest是使用原来servlet的方式处理cookie

 @GetMapping("/cookie")
    public String cookie(@CookieValue(value="cookie_key", required=false) String cookie_value,
                       HttpServletRequest request,
                       @CookieValue(value="username",required = false)Cookie cookie){
        System.out.println("cookie_value="+cookie_value);
        System.out.println("cookie_username-"+cookie.getName()+"=>"+cookie.getValue());
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie1 : cookies) {
            System.out.println(cookie1.getName()+"=>"+cookie1.getValue());
        }
        return "@cookieValue--success";
    }

因为不存在指定名称的cookie,所以会返回null,调用cookie.getName(),会出现空指针异常。可以自己在浏览器新建指定名称的cookie。

不同的浏览器的位置不一样,firefox是在“存储”里面;chorme是在“应用->存储”里面。再找到cookie选项,新增即可。


@RequestBody

作用:获取POST的请求体。如果是GET请求的话,会丢失请求体,所以必须是POST

前端:

踩坑:没写对method,导致值无论怎么改,都是按照默认get提交的。

<h1>@RequestBody 获取request的请求体</h1>
<form action="/spring/requestBody" method="post">
    姓名: <input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交内容"><br/>
</form>

后端:

测试使用@RequestMapping来接收映射也没有问题。使用PostMapping更标准。

此时可以获得请求体。后面完善把请求体当作一个bean来封装的方法。

    @RequestMapping("/requestBody")
    public String requestBody(@RequestBody String content){
        System.out.println("content-"+content);
        return "@RequestBody-success~";
    }

@RequestAttribute

作用:获取request域属性

前端:

<a href="/spring/setAttribute">@RequestAttribute--获取request域属性</a><br/><br/>

后端:

踩坑:@RequestAttribute需要设置要取出的属性名value,否则报错miss attribute。

required = false ,需要添加该属性,避免没有时报错。

request域属性在后端的一个映射中设置,又在另一个中映射中取出,需要使用视图解析器,为便于使用@Controller注解,便重新创建了一类来单独演示。

@Controller
public class AttributeController {

    @GetMapping("/setAttribute")
    public String setAttribute(HttpServletRequest request){
        request.setAttribute("name","老韩");
        //需要使用请示转发,才能保证request域的内容不丢失
        return "forward:/getAttribute";
    }

    @GetMapping("/getAttribute")
    @ResponseBody
    public String getAttribute(@RequestAttribute(value="name",required = false) String attribute,
                               HttpServletRequest request){
        System.out.println("attribute="+attribute);
        System.out.println("request_attribute="+request.getAttribute("name"));
        return "@RequestAttribute-success";
    }
}

@SessionAttribute

作用:获取session域的属性。

用法几乎和@RequestAttribute一模一样。只是session可以用重定向来重新请求页面。下面一句仅帮助回忆session是如何设置的。其它都一样,就不再写了。

request.getSession().setAttribute("website","www.baidu.com");

复杂参数

  1. 包括Map、Model、Errors/BindingResult、RedirectAttributes、HttpServletResponse、

SessionStatus,UriComponentsBuilder,ServletUriComponentsBuilder,HttpSession

  1. 重点了解Map、Model、HttpServletResponse数据会被放在request域

  1. RedirectAttributes重定向携带数据

直接访问后端进行模拟,只有后端代码:

  • 跟SpringMVC一样,数据会自动封装到map和model中,它们又会被放入request中,所以能够在转发的页面使用request.getAttribute()取出。(而不是getModel()或者getMap())

  • 演示通过response添加cookie到浏览器

   //模拟一个注册场景,相应一个注册请求
    @GetMapping("/complex")
    public String register(Map<String,String> map,
                               Model model,
                               HttpServletResponse response){
        //注册请求会将数据封装到map和model中,它们又会被放入request中
        map.put("user","scott");
        map.put("job","java构架师");
        model.addAttribute("sal","80000");

        //演示通过response添加cookie到浏览器
        Cookie cookie = new Cookie("newCookie","testContent");
        response.addCookie(cookie);

        return "forward:/registerOk";
    }

    @GetMapping("/registerOk")
    @ResponseBody
    public String complexComplete(HttpServletRequest request){
        System.out.println("user->"+request.getAttribute("user"));
        System.out.println("job->"+request.getAttribute("job"));
        System.out.println("sal->"+request.getAttribute("sal"));
        return "complex-success";
    }

自定义对象参数

1.在开发中,SpringBoot在响应客户端/浏览器请求时,也支持自定义对象参数

2.完成自动类型转换与格式化

3.支持级联封装

前段按照POJO的属性名,利用form的post方式提交即可,后端的转换器会自动进行封装。比较简单

public String saveMonster(Monster monster){
}

内置转换器

  1. SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器

  1. SpringBoot也支持自定义转换器,这个内置转换器在debug的时候,可以看到,提供了124个内置转换器。看下源码GenericConverter-ConvertiblePair

自定义转换器的实现代码。将String类型的数据,转换封装成Car类型的数据。

@Configuration(proxyBeanMethods=false)
public class WebConfig {

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                registry.addConverter(new Converter<String, Car>() {

                    @Override
                    public Car convert(String source) {
                        if(!ObjectUtils.isEmpty(source)){
                            String[] split = source.split(",");
                            Car car = new Car();
                            car.setName(split[0]);
                            car.setPrice(Double.parseDouble(split[1]));
                            return car;
                        }
                        return null;
                    }
                });
            }
        };
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值