资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

springboot关于参数的注解-创新互联

基本介绍

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

创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为竹山企业提供专业的成都做网站、成都网站建设,竹山网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

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

@CookieValue,@RequestBody

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


@PathVariable

作用:获取路径中的变量

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

@PathVariable 路径变量 /id/name

后端接收参数输入

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

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

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

@RequestHeader

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

前端请求代码

@RequestHeader 请求头信息获取~

后端获取请求头代码

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

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


@RequestParameter

作用:获取请求参数。

前端参数传递。方法一:

@RequestParam 请求参数

方法二:

name:
fruit1:
fruit2:

后端参数接收

@GetMapping("/requestParam")
    public String requestParam(@RequestParam("name") String username,
                               @RequestParam("fruit") String fruit,
                               @RequestParam Mapparams){
        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的值

前端

@CookieValue--获取cookie值

后端:

代码说明:

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提交的。

@RequestBody 获取request的请求体
姓名:
年龄:

后端:

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

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

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

@RequestAttribute

作用:获取request域属性

前端:

@RequestAttribute--获取request域属性

后端:

踩坑:@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(Mapmap,
                               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() {

                    @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;
                    }
                });
            }
        };
    }
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻名称:springboot关于参数的注解-创新互联
当前链接:http://www.cdkjz.cn/article/cedogh.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220