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

发布于:2025-03-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

请求映射路径

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

get请求发送参数

post请求发送参数

post请求乱码问题 

5种参数类型传递

普通参数传递(不同名)

实体类对象传递

数组传递

集合参数

json数据传递参数

JSON数组

JSON对象

​编辑

JSON引用集合

日期型参数传递


请求映射路径

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

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

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

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

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

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

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

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

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

@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()方法

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

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

5种参数类型传递

普通参数传递(不同名)

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

 解决方案

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

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

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

实体类对象传递

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

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;
    }
}
    @RequestMapping("/pojo")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo参数传递===="+user);
        return "{'module':'pojo param'}";
    }

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


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

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.属性名传递

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

数组传递

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

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

 

集合参数

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

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

json数据传递参数

JSON数组

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

    <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

    //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引用集合

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

    //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类型的参数

    @RequestMapping("/dateParam")
    @ResponseBody
    public String dataParam(Date date){
        System.out.println("日期类型的参数===="+ date);
        return "{'module':'date param'}";
    }

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


网站公告

今日签到

点亮在社区的每一天
去签到