• 中文
    • English
  • 注册
  • 查看作者
  • SpringMVC:获取请求参数

    一.  通过形参名字映射请求参数名

    还是采用《SpringMVC:简单使用》一文中数据,当我们访问http://localhost:8888/sm/test?name=张甲&age=21的时候,直接在test()方法中,通过形参可以即可获取对应的参数值

    package io.zhangjia.springmvc.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class test {
        @RequestMapping("/test")
        public String test(String name,Integer age){
            System.out.println("name = [" + name + "], age = [" + age + "]");
            return "test";
        }
    }
    输出:
    name = [张甲], age = [21]

    用上述方法SpringMVC会自动根据形参的名字来映射请求参数的名字,test方法中的形参name和age必须和请求参数中的http://localhost:8888/sm/test?name=张甲&age=21的参数名相同,也就是说,假如我们将test的形参名改成name1或者将请求参数的name=张甲改成name1=张甲,那么都将无法获取参数值

    二.  形参名和请求参数名不一致

    假如我们的形参名和请求参数名就要不一致,SpringMVC也为我们提供了解决方法,只需要给不一致的形参添加@ResultParam注解即可,假如我们访问http://localhost:8888/sm/test?username=张甲&age=21,则test方法可以修改为:

    package io.zhangjia.springmvc.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @Controller
    public class Test {
        @RequestMapping("/test")
        public String test(@RequestParam("username") String name, Integer age) {
            System.out.println("name = [" + name + "], age = [" + age + "]");
            return "test";
        }
    }

    在没有使用使用SpringMVC之前,我们获取的请求参数都是String类型,而使用SPringMVC后,比如我们想获取age,就可以直接写Integer,不需要ParsInt。

    三.  复杂类型获取参数值

    假如我们创建一个User的实体类,有name和age两个参数,在使用SpringMVC之前,如果想给User类的对象赋值,我们需要手动获取name和age两个参数,然后通过setter方法为其赋值,有了SpringMVC,我们便可以直接将User作为形参便可以为其赋值

    User实体类

    package io.zhangjia.springmvc.controller.entity;
    
    public class User {
        private String name;
        private Integer 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 Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }

    controller:

    package io.zhangjia.springmvc.controller;
    
    import io.zhangjia.springmvc.controller.entity.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class Test {
        @RequestMapping("/test")
        public String test(User user) {
            System.out.println("user = [" + user + "]");
            return "test";
        }
    }

    当我们访问http://localhost:8888/sm/test?name=张甲&age=21时,控制台输出:

    user = [User{name='张甲', age=21}]

    四.  复杂类含有非简单类型属性

    上面的User类中,String,Integer都是简单类型。我们先创建一个Book类,然后将其作为User的一个属性:

    package io.zhangjia.springmvc.controller.entity;
    
    public class Book {
        private String name;
        private String author;
        private Double price;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public Double getPrice() {
            return price;
        }
    
        public void setPrice(Double price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
    
    
    package io.zhangjia.springmvc.controller.entity;
    
    public class User {
        private String name;
        private Integer age;
        private Book book;
    
        .....
    }

    此时再次访问http://localhost:8888/sm/test?username=张甲&age=21,控制台输出:

    user = [User{name='张甲', age=21, book=null}]

    此时的book为null,如果想为其赋值,则参数应该采用下面的方式:

    http://localhost:8888/sm/test?name=张甲&age=21&book.name=皮皮鲁&book.author=郑渊洁&book.price=9.9

    此时控制台输出:

    user = [User{name='张甲', age=21, book=Book{name='皮皮鲁', author='郑渊洁', price=9.9}}]

    注意,请求参数不能直接写author或者price,必须加book.,其中book即为User对象的属性名

    五.  控制请求参数

    如果我们想规定某个参数必须传,则可以在其参数前添加@RequestParam注解:

    @Controller
    public class Test {
        @RequestMapping("/test")
        public String test(String name, @RequestParam Integer age) {
            System.out.println("name = [" + name + "], age = [" + age + "]");
            return "test";
        }
    }

    此时如果我们访问http://localhost:8888/sm/test?name=张甲,不带age参数,便会显示400状态码

    如果我们想规定某个参数有时候需要传,有时候不需要传(比如分页的时候的page这个参数,第一页的时候不需要传,其他页需要传),则可以采用下面的方法:

    package io.zhangjia.springmvc.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @Controller
    public class Test {
        @RequestMapping("/test")
        public String test(String name, @RequestParam(required = false,defaultValue = "1") Integer age) {
            System.out.println("name = [" + name + "], age = [" + age + "]");
            return "test";
        }
    }

    其中,required = false代表不是必须的参数,defaultValue = “1”代表如果没有传值,则默认为1

    六.  总结

    1.  通过形参名获取请求参数,SpringMVC会自动根据形参的名字来映射请求参数的名字,所以请求参数名应和形参名一致

    2.  如果请求参数名和形参名不一致,则在形参前添加(@RequestParam(“请求参数名“) 形参)来完成映射,而且可以根据请求参数的实际数据类型来设置形参的类型,不再和以前一样获取的请求参数的值都是String

    3.  如果需要使用请求参数为实体类赋值,则可以直接将实体类作为形参

    4.  如果需要使用请求参数为实体类赋值,并且该实体类的属性中依旧包含其他实体类或者复杂类型,则请求参数需要通过实体类中对象名.属性名的方法传入

    5.   形参前添加@RequestParam 注解代表该形参必须传入,添加 @RequestParam(required = false) 注解代表非强制性传入,添加@RequestParam(required = false,defaultValue = “xxx”) 代表如果该请求参数没有传入,则其值为我们设置的默认值

  • 0
  • 0
  • 0
  • 1.6k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: