美文网首页Java&Spring基础技术
request 参数和 controller 方法参数的绑定对应

request 参数和 controller 方法参数的绑定对应

作者: 当当一丢丢 | 来源:发表于2018-01-06 17:16 被阅读480次

主题

  • 如何在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中即可
参考:https://reversecoding.net/spring-mvc-requestparam-binding-request-parameters/#default-test

相关文章

网友评论

    本文标题:request 参数和 controller 方法参数的绑定对应

    本文链接:https://www.haomeiwen.com/subject/qqgynxtx.html