SpringMVC中有关请求参数的问题(映射路径,传递不同的参数)

目录

请求映射路径

get请求与psot请求发送普通参数

get请求发送参数

post请求发送参数

post请求乱码问题

5种参数类型传递

普通参数传递(不同名)

实体类对象传递

数组传递

集合参数

json数据传递参数

JSON数组

JSON对象

​编辑

JSON引用集合

日期型参数传递


请求映射路径

问题:在团队多人开发中,每人设置不同的请求路径,冲突问题该如何解决...

示例:在controller包下,有两个类下的方法设置的请求路径均为/save

java 复制代码
@RequestMapping("/save")
    @ResponseBody
    public String Book(){
        System.out.println("book save......");
        return "{'module':'book koob'}";
    }
java 复制代码
@RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save");
        return "{'module':'user save'}";
    }

这种情况下运行项目会报错。可以设置模块名作为请求路径前缀

java 复制代码
@RequestMapping("/book/save")
    @ResponseBody
    public String Book(){
        System.out.println("book save......");
        return "{'module':'book koob'}";
    }
java 复制代码
@RequestMapping("/user/save")
    @ResponseBody
    public String save(){
        System.out.println("user save");
        return "{'module':'user save'}";
    }

除了在方法上指定请求路劲,也可以在类上使用@RequestMapping设置路径前缀,相当于给该类下的所有路径都添加上了相同的前缀

java 复制代码
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String Book(){
        System.out.println("book save......");
        return "{'module':'book koob'}";
    }
}

get请求与psot请求发送普通参数

在controller类接收参数,只需要添加参数列表,即可直接引用:

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(String string,int age){
        System.out.println("普通参数传递 string == >"+ string);
        System.out.println("普通参数传递 age == >"+ age);
        return "{'module':'user save'}";
    }
}

get请求发送参数

get发送请求参数,只需要在url后接 ?key=value&key1=value1.....

post请求发送参数

post请求参数在请求体中,所以下方按钮要选择Body,再选择x-www-form-urlencoded(编码表单)。

补充:

  • form-data(表单数据):传文件或混合文本和文件数据。

  • x-www-form-urlencoded(编码表单):提交简单键值对数据(无文件)。

  • raw(原始数据):发送 JSON、XML 等结构化数据。

  • binary(二进制文件):直接上传二进制文件(如图片、视频)。

post请求乱码问题

上面post请求传递的参数在控制台显示乱码,解决方案

设置过滤器:

servlet容器中进行乱码处理,重写getServletFilters()方法

java 复制代码
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

重新发送请求,此时乱码问题已解决:

5种参数类型传递

普通参数传递(不同名)

当传递的参数key值与方法的参数列表名不一致时,会出现参数无法传递的情况:

解决方案

在控制器类对应的方法参数前,添加@RequestParam("对应的参数名"):

java 复制代码
public String save(@RequestParam("name") String string, int age){
        System.out.println("普通参数传递 string == >"+ string);
        System.out.println("普通参数传递 age == >"+ age);
        return "{'module':'user save'}";
    }

此时可以成功传递参数,但是用原来的参数名会报错

实体类对象传递

准备了一个实体类,接下来就将该类的对象作为参数传递:

java 复制代码
public class User {
    private String name;
    private int age;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
java 复制代码
    @RequestMapping("/pojo")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo参数传递===="+user);
        return "{'module':'pojo param'}";
    }

可以直接使用对象属性名进行参数传递:


当类的属性里有其他对象时:

java 复制代码
public class Person {
    private int height;
    private int weight;

    @Override
    public String toString() {
        return "Person{" +
                "height=" + height +
                ", weight=" + weight +
                '}';
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}

普通属性直接使用属性名,引用类型使用pojo.属性名传递

java 复制代码
    @RequestMapping("/pojoCoin")
    @ResponseBody
    public String pojoCoinPojo(User user){
        System.out.println("pojo参数传递===="+user);
        return "{'module':'pojo param'}";
    }

数组传递

当传入的参数为数组时,url参数的key只需使用相同的命名即可

java 复制代码
    @RequestMapping("/arr")
    @ResponseBody
    public String pojoCoinPojo(String[] arr){
        System.out.println("pojo参数传递===="+ Arrays.toString(arr));
        return "{'module':'array param'}";
    }

集合参数

传入的参数为集合时,需要再list参数前加上注解@RequestParam,传递时只需key相同即可。

java 复制代码
    @RequestMapping("/list")
    @ResponseBody
    public String listParam(@RequestParam List<String> lists){
        System.out.println("pojo参数传递===="+ lists);
        return "{'module':'list param'}";
    }

json数据传递参数

JSON数组

在实验之前,首先要导入jackson-databind依赖:

XML 复制代码
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.5</version>
    </dependency>

想要传递json数据,点击Body,数据格式选择raw,右侧选择JSON,使用get和post提交都可。

还需要再springmvc配置类中加上注解:@EnableWebMvc 。在Controller类的方法参数前也要加上注解**@RequestBody**:

java 复制代码
    //json集合参数
    @RequestMapping("/listJSON")
    @ResponseBody
    public String listJSONParam(@RequestBody List<String> lists){
        System.out.println("JSON数组传递===="+ lists);
        return "{'module':'listJSON param'}";
    }

JSON对象

JSON对象的传递与JSON数组的传递只在传递的JSON格式不同,其他完全相同

仍要注意传入的JSON对象的key值要和方法参数列表的对象属性的属性名一致,否则接收不到。引用类型的数据则是用属性名再用大括号包裹它对应的属性

JSON引用集合

传入的参数还可以是引用类型的集合,仅有参数列表和传入的数据形式改变:

java 复制代码
    //json的对象集合
    @RequestMapping("/pojoJSONList")
    @ResponseBody
    public String pojoJSONParam(@RequestBody List<User> users){
        System.out.println("JSON引用集合传递===="+ users);
        return "{'module':'pojoJSONList param'}";
    }

日期型参数传递

日期类型的数据基于系统的不同格式也不同:

  • 2024-10-01
  • 2024/10/01
  • 01/10/2024
    斜线格式的处理方法如下:直接使用date类型的参数
java 复制代码
    @RequestMapping("/dateParam")
    @ResponseBody
    public String dataParam(Date date){
        System.out.println("日期类型的参数===="+ date);
        return "{'module':'date param'}";
    }


传递的参数为其他格式时,需要加上注解**@DateTimeFormat(pattern="日期格式")**来指定日期格式。

相关推荐
简 洁 冬冬14 分钟前
java中过滤器
java
前端付杰22 分钟前
从Vue源码解锁位运算符:提升代码效率的秘诀
前端·javascript·vue.js
然后就去远行吧23 分钟前
小程序 wxml 语法 —— 37 setData() - 修改对象类型数据
android·前端·小程序
用户32035783600223 分钟前
程序员鸡翅-Java微服务从0到1带你做社区项目实战
javascript
用户32035783600225 分钟前
高薪运维必备Prometheus监控系统企业级实战(已完结)
前端
V+zmm1013426 分钟前
电器维修系统小程序+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
一只爱打拳的程序猿28 分钟前
【SpringBoot】实现登录功能
javascript·css·spring boot·mybatis·html5
黄天才丶31 分钟前
高级前端篇-脚手架开发
前端
PawSQL32 分钟前
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
java·数据库·人工智能·sql·sql优化·pawsql·deepseek
乐闻x43 分钟前
React 如何实现组件懒加载以及懒加载的底层机制
前端·react.js·性能优化·前端框架