一. 通过形参名字映射请求参数名
还是采用《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”) 代表如果该请求参数没有传入,则其值为我们设置的默认值
请登录之后再进行评论