主题
- 如何在SpringMVC controller中获取请求request 里的参数 request parameter
- 如何将请求参数绑定到不同的参数对象
- 如何使用@RequestParam,并且知晓何时不需要该注解
- 以下案例都是get 请求获取request 参数
- 且要明白request上的请求参数 都是以String形式pass的,Spring需要做很多中间处理,将String类型的值转成Controller中你设定的目的类型
@RequestParam 案例
@Requestparam 注解用来建立 方法参数(method param)与请求参数(request param)的对应关系
1. 绑定方法参数与请求参数的对应关系
- url: /books?category=java //参数category 不可缺
- Controller 代码
@RequestMapping("/books")
//@RequestParam("category") 建立 url中 请求参数-category 和 方法参数-cat 之间的对应关系
//注:当请求参数和方法参数同名时,可省略@RequestParam中的value 值-自动绑定
public String books(@RequestParam("category") String cat) {
//bussiness logic
sout("category " + cat)
return "book.jsp";
}
2. 自动类型转换
当Request Param 不是 String类型如而是 number时,我们可自动将其转成 number类型的 method 参数
- url: /books?rate=5&maxprice=150.55
- 目的:将rate转成int,将 maxprice 转成 BigDecimal
@RequestParam("category")
//只需直接指定想要转变成的类型,如 rate 为 int,maxprice 为 BigDecimal
public String books(@RequestParam("rate") int rate,
@RequestParm("maxprice") BigDecimal maxprice) {
//bussiness logic
sout("rate " + rate +", maxprice " + maxprice)
return "book.jsp";
}
3. request参数为日期类型
- url: /books?from=2012-01-12
- 目的:想传递一个日期类型,且controller自动将字符串“2012-01-12” 转成controller方法参数中日期格式
@RequestMapping("/books")
public String books(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@RequestParam("from") LocalDate from) {
//首先用 @DateTimeFormat注解,而且是用其中的ISO.DATE做格式转化, DATE 标识:yyyy-MM-dd
//再用LocalDate格式做参数,LocalDate 标识:year-month-day
//java.util.Date:年 月 日 hh mm ss
System.out.println("from " + from);
return "book.jsp";
}
4. request 参数为不必须
- url: /books?category=math
- category 不是必须的
@RequestMapping("/books")
public String books(@RequestParam("category", required=false) String cat) {
//@RequestParam 默认required = true,为false时 该参数不必须
System.out.println("category " + cat);
return "book.jsp";
}
5. request 自带默认值, 用于以下1/2种场景
- url1: /books? //输出:history --category 为 null, required 可以为 false
- url2: /books?category= //输出:history --category 为 null
- url3: /books?category="" // 输出:""
@RequestMapping("/books")
public String books(@RequestParam("category", defaultValue="history") String cat) {
System.out.println("category " + cat);
return "book.jsp";
}
6. @RequestParam 为List or array
- url: /books?authors=zhangsi&authors=lisi
- request 中同名的参数将自动转化成 controller 中的@RequestParam List ,必要时可用 value 属性指定参数名
- 方法参数写成 String[] 也可以
@RequestMapping("/books")
public String books(@RequestParam List<String> authors) {
System.out.println("authors " + authors);
return "book.jsp";
}
7. @RequestParam 为Map,一个key 对应一个value值
- url: /books?category=math&authors=lisi
- controller 参数在这种情况下不能通过 @RequestParam的value指定具体request 参数名
- controller参数类型 为 Map 就出现了一个 谁是 Key,谁是Value的问题,这个是自动装配
- 根据requet 参数请求顺序,前面的为 key , 后面的为 value
@RequestMapping("/books")
public String books(@RequestParam Map<String, String> book) {
System.out.println("book " + book);
return "book.jsp";
}
输出:{category=math, authors=lisi}
8. @RequestParam 为MultiValueMap,一个key 对应一个多个 value 值
- url: /books?category=math&authors=lisi&authors=zhangsi
- 参数同样具有顺序性,第一个为key, 其余同名参数封装为 value
@RequestMapping("/books")
public String books(@RequestParam MultiValueMap<String, List<String>> book ) {
System.out.println("book " + book);
return "book.jsp";
}
输出:{category=[math], authors=[lisi, zhangsi]}
9. 不声明 @RequestParam
- url: /books?category=math
- 默认 request 和 controller 方法参数同名,可省略 @RequestParam
@RequestMapping("/books")
public String books(String category) {
System.out.println("category " + category);
return "book.jsp";
}
输出:math
建议:指明 @RequestParam
10. request 参数为field, 而 controller 参数为 Object
- url: /books?category=math&author=lisi
- Object 对象 封装了两个field: category, author
- 这个转换非常有用,尤其是多request 参数转成封装对象时
- 注意此时是无@RequestParam的,有则400
public class Box{
String category;
String author;
getter;
setter;
String toString() {
return "category=" + category +", author=" + author;
}
}
@RequestMapping("/books")
public String books(Box box ) {
System.out.println("box " + box);
return "book.jsp";
}
输出:category=math, author=lisi
注意
- 以上 @RequestMapping 省略掉method 属性,则说明所匹配的方法 可以接受任何请求,PUT/GET/DELETE/POST,并非默认为GET
- 当method 为 PUT/POST/DELTE时,url 中仍可以用"**?name=lisi" 传递参数,因为POSTMAN中这些方法没有parameter选项,直接写在url中即可