java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringMVC参数传递

SpringMVC参数传递技巧与实战指南(完整案例)

作者:爱吃烤鸡翅的酸菜鱼

文将通过一个完整的RequestController案例,详解10种常见参数传递方式,助你彻底掌握SpringMVC参数传递技巧,感兴趣的朋友一起看看吧

1.前言

哈喽大家好吖,在SpringMVC开发中,参数传递是开发者每天都要面对的核心问题。不同的业务场景需要采用不同的参数接收方式,合理的参数处理能大幅提升开发效率和代码质量。本文将通过一个完整的RequestController案例,详解10种常见参数传递方式,助你彻底掌握SpringMVC参数传递技巧。

2.正文

官方文档:Spring Framework Documentation :: Spring Framework

https://docs.spring.io/spring-framework/reference/

2.1基础参数传递

2.1.1单参数

@RequestMapping("/r1")
public String r1(String keyword){
    return "接收参数:" + keyword;
}
  • 调用示例/request/r1?keyword=spring
  • 特点
    • 参数名与方法参数名严格匹配
    • 自动完成基本类型转换(String→int等)
    • 若参数不存在会注入null

2.1.2多参数

@RequestMapping("r2")
public String r2(String name, int id){
    return "receive:" + name + id;
}
  • 调用示例/request/r2?name=Alice&id=1001
  • 注意事项
    • 基本类型参数不能为null(如int)
    • 推荐使用包装类型Integer避免空指针异常

避免空指针:

@RequestMapping("r3")
    public String r3(Integer number){
        return "receive" + number;
    }

2.2对象参数绑定

2.2.1自动封装对象

@RequestMapping("r4")
public String r4(student s1){
    return "receive" + s1.toString();
}
  • 调用示例/request/r4?id=1002&name=Bob
  • 实现机制
    • Spring自动创建Student实例
    • 通过setter方法进行属性注入
    • 支持嵌套对象属性绑定

2.2.2参数别名处理

@RequestMapping("/r5")
public String r5(@RequestParam(value = "n", required = false)String name){
    return "receive" + name;
}
  • 注解说明
    • value:指定参数别名
    • required:是否必须参数(默认true)
    • defaultValue:默认值设置

2.3集合类型处理

2.3.1数组接收

@RequestMapping("/r6")
public String r6(String[] array){
    return "receive" + Arrays.toString(array);
}
  • 调用方式
    • /request/r6?array=1&array=2
    • /request/r6?array=1,2,3

2.3.2List集合接收

@RequestMapping("/r7")
public String r7(@RequestParam List<Integer> list){
    return "receive:" + list;
}
  • 特别注意
    • 必须使用@RequestParam注解
    • 禁止使用ArrayList等具体实现类
    • 推荐使用包装类型避免转型异常

2.4JSON参数处理

2.4.1介绍JSON

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于纯文本,使用Unicode编码,具有广泛的兼容性和灵活性,常用于网络应用之间的数据传输。

JSON格式以键值对的形式组织数据,支持两种主要的数据结构:

  • 对象(Object)
    • 一个无序的键值对集合,用大括号“{}”括起来。
    • 键(Key)必须是字符串类型,值(Value)可以是字符串、数值、布尔值、数组、对象或null
    • 键与值之间用英文冒号“:”分隔,键值对之间用英文逗号“,”分隔。
    • 例如:
{
  "name": "Kimi",
  "age": 25,
  "isStudent": false,
  "hobbies": ["reading", "traveling"],
  "address": {
    "city": "Beijing",
    "country": "China"
  }
}
  • 数组(Array)
    • 一个有序的值集合,用方括号“[]”括起来。
    • 数组中的值可以是任意类型,包括字符串、数值、布尔值、对象、数组或null
    • 数组中的值之间用英文逗号“,”分隔。
    • 例如:
[
  "apple",
  123,
  true,
  null,
  {"key": "value"},
  [1, 2, 3]
]

在SpringMVC中,JSON参数的自动转换依赖于HttpMessageConverter体系。当检测到请求的Content-Typeapplication/json时,框架会使用MappingJackson2HttpMessageConverter进行数据绑定。

  • 处理流程
    • 前端发送JSON格式请求体
    • DispatcherServlet选择匹配的消息转换器
    • Jackson库将JSON反序列化为Java对象
    • 通过@RequestBody注入方法参数

2.4.2传递JSON参数

@RequestMapping("/r8")
public String r8(@RequestBody student student1){
    return student1.toString();
}
  • 请求要求
    • Content-Type必须为application/json
    • 需要Jackson依赖支持
    • 支持嵌套复杂对象解析
  • 请求示例
{"id": 1003, "name": "Carol"}

2.5RESTful风格参数

@RequestMapping("/path/{pathid}")
public String r9(@PathVariable Integer pathid){
    return "获取路径id" + pathid;
}
  • 调用示例/request/path/1004
  • 最佳实践
    • 适合资源定位场景
    • 支持正则表达式校验
    • 可配合@GetMapping等注解使用

2.6文件上传处理

@RequestMapping("/r10")
public String r10(MultipartFile file) throws IOException {
    file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));
    return "文件上传成功";
}
  • 表单需设置enctype="multipart/form-data"
  • 支持多文件同时上传
  • 注意文件存储路径权限问题

2.7完整调试代码

package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;
class student{
    int id;
    String name;
    public student() {}
    public student(int id, String name) {
        this.id = id;
        this.name = name;
    }
    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;
    }
    @Override
    public String toString() {
        return super.toString();
    }
}
@RequestMapping("/request")
@Controller
@ResponseBody
public class RequestController {
    @RequestMapping("/r1")
    public String r1(String keyword){
        return "接收参数:" + keyword;
    }
    @RequestMapping("r2")
    public String r2(String name, int id){
        return "receive:" + name + id;
    }
    @RequestMapping("r3")
    public String r3(Integer number){
        return "receive" + number;
    }
    @RequestMapping("r4")
    public String r4(student s1){
        return "receive" + s1.toString();
    }
    //从前端接受参数n,赋值给name
    @RequestMapping("/r5")
    public String r5(@RequestParam(value = "n", required = false)String name){
        return "receive" + name;
    }
    //传递数组
    @RequestMapping("/r6")
    public String r6(String[] array){
        return "receive" + array.toString();
    }
    //传递集合
    @RequestMapping("/r7")
    public String r7(@RequestParam List<Integer> list){
        return "receive:" + list;
    }
    //传递json
    @RequestMapping("/r8")
    public String r8(@RequestBody student student1){
        return student1.toString();
    }
    //从URL中获取参数
    @RequestMapping("/path/{pathid}")
    public String r9(@PathVariable Integer pathid){
        return "获取路径id" + pathid;
    }
    //上传文件
    @RequestMapping("/r10")
    public String r10(MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));
        return "文件上传成功";
    }
}

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!

到此这篇关于SpringMVC参数传递技巧与实战指南(完整案例)的文章就介绍到这了,更多相关SpringMVC参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文