当前位置:   article > 正文

springboot关于参数的注解_springboot接收参数注解

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 可以和形参不一致

  1. @RestController
  2. public class ParameterController {
  3. @GetMapping("/monster/{id}/{name}")
  4. public String pathVariable(@PathVariable("id") Integer id,
  5. @PathVariable("name") String username,
  6. @PathVariable Map<String,String> map){
  7. System.out.println("id="+id);
  8. System.out.println("username="+username);
  9. System.out.println("map="+map);
  10. return "PathVariable";
  11. }
  12. }

@RequestHeader

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

前端请求代码

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

后端获取请求头代码

  1. @GetMapping("/requestHeader")
  2. public String requestHeader(@RequestHeader("host") String host,
  3. @RequestHeader("ACCEPT")String accept,
  4. @RequestHeader() Map<String,String> header){
  5. System.out.println("host-"+host);
  6. System.out.println("accept-"+accept);
  7. System.out.println("header-"+header);
  8. return "requestHeader-success";
  9. }

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


@RequestParameter

作用:获取请求参数。

前端参数传递。方法一:

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

方法二:

  1. <form action="/spring/requestParam" method="get">
  2. name: <input type="text" name="name"><br/>
  3. fruit1:<input type="text" name="fruit"><br/>
  4. fruit2:<input type="text" name="fruit"><br/>
  5. <input type="submit" value="提交内容"><br/>
  6. </form>

后端参数接收

  1. @GetMapping("/requestParam")
  2. public String requestParam(@RequestParam("name") String username,
  3. @RequestParam("fruit") String fruit,
  4. @RequestParam Map<String,String> params){
  5. System.out.println("name="+username);
  6. System.out.println("fruit="+fruit);
  7. System.out.println("params="+params);
  8. return "RequestParam-success";
  9. }
  • @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

  1. @GetMapping("/cookie")
  2. public String cookie(@CookieValue(value="cookie_key", required=false) String cookie_value,
  3. HttpServletRequest request,
  4. @CookieValue(value="username",required = false)Cookie cookie){
  5. System.out.println("cookie_value="+cookie_value);
  6. System.out.println("cookie_username-"+cookie.getName()+"=>"+cookie.getValue());
  7. Cookie[] cookies = request.getCookies();
  8. for (Cookie cookie1 : cookies) {
  9. System.out.println(cookie1.getName()+"=>"+cookie1.getValue());
  10. }
  11. return "@cookieValue--success";
  12. }

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

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


@RequestBody

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

前端:

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

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

后端:

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

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

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

@RequestAttribute

作用:获取request域属性

前端:

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

后端:

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

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

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

  1. @Controller
  2. public class AttributeController {
  3. @GetMapping("/setAttribute")
  4. public String setAttribute(HttpServletRequest request){
  5. request.setAttribute("name","老韩");
  6. //需要使用请示转发,才能保证request域的内容不丢失
  7. return "forward:/getAttribute";
  8. }
  9. @GetMapping("/getAttribute")
  10. @ResponseBody
  11. public String getAttribute(@RequestAttribute(value="name",required = false) String attribute,
  12. HttpServletRequest request){
  13. System.out.println("attribute="+attribute);
  14. System.out.println("request_attribute="+request.getAttribute("name"));
  15. return "@RequestAttribute-success";
  16. }
  17. }

@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到浏览器

  1. //模拟一个注册场景,相应一个注册请求
  2. @GetMapping("/complex")
  3. public String register(Map<String,String> map,
  4. Model model,
  5. HttpServletResponse response){
  6. //注册请求会将数据封装到map和model中,它们又会被放入request中
  7. map.put("user","scott");
  8. map.put("job","java构架师");
  9. model.addAttribute("sal","80000");
  10. //演示通过response添加cookie到浏览器
  11. Cookie cookie = new Cookie("newCookie","testContent");
  12. response.addCookie(cookie);
  13. return "forward:/registerOk";
  14. }
  15. @GetMapping("/registerOk")
  16. @ResponseBody
  17. public String complexComplete(HttpServletRequest request){
  18. System.out.println("user->"+request.getAttribute("user"));
  19. System.out.println("job->"+request.getAttribute("job"));
  20. System.out.println("sal->"+request.getAttribute("sal"));
  21. return "complex-success";
  22. }

自定义对象参数

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

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

3.支持级联封装

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

  1. public String saveMonster(Monster monster){
  2. }

内置转换器

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

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

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

  1. @Configuration(proxyBeanMethods=false)
  2. public class WebConfig {
  3. @Bean
  4. public WebMvcConfigurer webMvcConfigurer(){
  5. return new WebMvcConfigurer() {
  6. @Override
  7. public void addFormatters(FormatterRegistry registry) {
  8. registry.addConverter(new Converter<String, Car>() {
  9. @Override
  10. public Car convert(String source) {
  11. if(!ObjectUtils.isEmpty(source)){
  12. String[] split = source.split(",");
  13. Car car = new Car();
  14. car.setName(split[0]);
  15. car.setPrice(Double.parseDouble(split[1]));
  16. return car;
  17. }
  18. return null;
  19. }
  20. });
  21. }
  22. };
  23. }
  24. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/580117
推荐阅读
相关标签
  

闽ICP备14008679号