【Java EE】Spring请求如何传递参数详解

文章目录

访问不同的路径,就是发送不同的请求.在发送请求时,可能会带些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收.

下面博主会对传递参数进行一个详解,咱们主要是使浏览器和Postman来模拟

??传递单个参数

复制代码
@RestController
public class hello {
    @RequestMapping("/test")
    public String test(String name){
        return "接受到的参数:"+name;
    }

}

当我们运行后,用浏览器进行访问

http://127.0.0.1:8080/pt/test1name=

访问结果如下:

注意:

  • 如果参数名不一致,获取不到参数,默认没有传参,默认值为null
  • 如果参数类型不致,是会进行报错的

    @RestController

    public class hello {

    @RequestMapping("/test")

    public String test(Integer name){

    return "接受到的参数:"+name;

    }

    }

注意:

  • 如果使基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误

    @RestController

    public class hello {

    @RequestMapping("/test")

    public String test(int name){

    return "接受到的参数:"+name;

    }

    }

日志中也会进行报错。

建议使用包装类!!!

??传递多个参数

与传递单个参数一样

不同的是当有多个参数时,前后端进参数匹配时,是以参数的名称进匹配的,因此参数的位置是不影响后端获取参数的结果

??传递对象

如果参数较多时,法声明就需要有很多形参.并且后续每次新增个参数,也需要修改法声明.

我们不妨把这些参数封装为个对象.

Spring MVC也可以动实现对象参数的赋值,如Person对象

复制代码
public class Person {
    private int id;
    private String name;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", password='" + password + ''' +
                '}';
    }
}



@RequestMapping("test5")
    public String test5(Person person) {
        return "接收到的参数名为:" + person.toString();
    }


注意

Spring会根据参数名称动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,如int类型的属性,会被赋值为0)

??后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不致,如前端传递了个time给后端,后端是使createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使 @RequestParam 来重命名前后端的参数值.

复制代码
    @RequestMapping("test6")
    public String test6(@RequestParam("time") String createtime) {
        return "接收到的参数名为:" + createtime;
    }

注意:

  • 使 @RequestParam 进参数重命名时,请求参数只能和@RequestParam 声明的名称致,才能进参数绑定和赋值.

  • 使 @RequestParam 进参数重命名时,参数就变成了必传参数

  • 如果我们不想让他变成必传参数,我们可以通过设置@RequestParam 中的 required=false (默认为true,必传)来避免不传递时报错

    复制代码
    @RequestMapping("test6")
    public String test6(@RequestParam(value = "time",required = false) String createtime) {
        return "接收到的参数名为:" + createtime;
    }

??传递数组

Spring MVC 可以动绑定数组参数的赋值

复制代码
    @RequestMapping("test7")
    public String test7(String[] names) {
        return "接收到的参数名为:" + Arrays.toString(names);
    }

数组传参时,有以下几种:

1:http://127.0.0.1:8080/pt/test7names=张三\&names=李四

2:http://127.0.0.1:8080/pt/test7names=张三%2C李四

3:http://127.0.0.1:8080/pt/test7names=张三,李四

??传递集合

集合参数:和数组类似,同个请求参数名有为多个

不同的时需要使 @RequestParam 绑定参数关系

传参方式与上述数组传参三种方式一样

复制代码
@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){
	return "size:"+listParam.size() + ",listParam:"+listParam;
}

??传递JSON数据

??JSON概念

JSON:JavaScript Object Notation【JavaScript对象表法】

JSON是种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的个集,采完全独于编程语的本格式来存储和表数据。

简单来说:JSON就是种数据格式,有的格式和语法,使本表个对象或数组的信息,因此JSON本质是字符串.

主要负责在不同的语中数据传递和交换

??JSON的语法

  1. 数据在 键值对(Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象 {} 表
  4. 数组 [] 表
  5. 值可以为对象,也可以为数组,数组中可以包含多个对象

??JSON的两种结构

  1. 对象:括号 {} 保存的对象是个序的 键值对 集合.个对象以左括号 { 开始,右括号 }结束。每个"键"后跟个冒号 :
    ,键值对使逗号 , 分隔
  2. 数组: 中括号 [ ] 保存的数组是值(value)的有序集合.个数组以左中括号 [ 开始,右中括号 ] 结束,值之间使逗号 , 分隔。

??JSON字符串和Java对象互转

JSON本质上是个字符串,通过本来存储和描述数据

Spring MVC框架也集成了JSON的转换具,我们可以直接使,来完成JSON字符串和Java对象的互转

??JSON的优点

  1. 简单易:语法简单,易于理解和编写,可以快速地进数据交换

  2. 跨平台持:JSON可以被多种编程语解析和成,可以在不同的平台和语之间进数据交换和传输

  3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占带宽较,可以提数据传输速度

  4. 易于扩展:JSON的数据结构灵活,持嵌套对象和数组等复杂的数据结构,便于扩展和使

  5. 安全性:JSON数据格式是种纯本格式,不包含可执代码,不会执恶意代码,因此具有较的安全性

基于以上特点,JSON在Web应程序中被泛使,如前后端数据交互、API接数据传输等

??传递JSON对象

接收JSON对象,需要使 @RequestBody 注解

RequestBody:请求正,意思是这个注解作在请求正的数据绑定,请求参数必须在写在请求正中

复制代码
    @RequestMapping("test9")
    public String test9(@RequestBody Person person) {
        return "接收到的参数名为:" + person.toString();
    }

??获取URL中参数@PathVariable

path variable:路径变量

和字表达的意思样,这个注解主要作在请求URL路径上的数据绑定

复制代码
    @RequestMapping("/test10/{id}/{name}")
    public String test10(@PathVariable Integer id, @PathVariable("name") String userName){
        return "解析参数id:"+id+",name:"+userName;
    }

注意:

  • 如果法参数名称和需要绑定的URL中的变量名称致时,可以简写,不给@PathVariable的属性赋值,如上述例中的id变量

  • 如果法参数名称和需要绑定的URL中的变量名称不致时,需要@PathVariable的属性value赋值,如上述例中的userName变量

??上传文件@RequestPart

代码实现如下:

复制代码
    @RequestMapping("/test11")
    public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
        //获取?件名称
        String fileName = file.getOriginalFilename();
        //?件上传到指定路径
        file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
        return "接收到?件名称为: "+fileName;
    }

??获取Cooki/Session

由于这部分内容较多,博主单独写了出来。链接如下:

??获取Header

??传统获取 header

复制代码
    @RequestMapping("/test17")
    public String test17(HttpServletRequest request, HttpServletResponse response) {
        String userAgent = request.getHeader("User-Agent");
        return  "userAgent:"+userAgent;
    }

??简洁获取header

复制代码
    @RequestMapping("/test18")
    public String test18(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:"+userAgent;
    }

总结

感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!

相关推荐
云烟成雨TD19 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Java成神之路-20 小时前
SpringMVC 响应实战指南:页面、文本、JSON 返回全流程(Spring系列13)
java·spring·json
砍材农夫20 小时前
spring-ai 第六模型介绍-聊天模型
java·人工智能·spring
云烟成雨TD21 小时前
Spring AI Alibaba 1.x 系列【5】ReactAgent 构建器深度源码解析
java·人工智能·spring
Flittly1 天前
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
java·笔记·spring·ai·springboot
Flittly1 天前
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
java·spring boot·笔记·spring·ai
mfxcyh1 天前
基于xml、注解、JavaConfig实现spring的ioc
xml·java·spring
Flittly1 天前
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
java·spring boot·spring·ai
xdscode1 天前
Spring 依赖注入方式全景解析
java·后端·spring