• 中文
    • 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.3k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: