@RequestMapping详解

        RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

       RequestMapping注解有六个属性:

  •     value, method;
        value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
        method:  指定请求的method类型, GET、POST、PUT、DELETE等;
  •     consumes,produces;
        consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
        produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
  •      params,headers;
         params: 指定request中必须包含某些参数值是,才让该方法处理。
         headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

地址参数获取

1.@PathVariable详解

            spring通过@PathVariable注解来获得请求url中的动态参数的,并且支持动态url访问,可以从url中直接提取参数而不需要采用?q=q&d=d的形式

@RestController
@RequestMapping("/dynamic")
public class DynamicUrlController {
    //localhost:8080/dynamic/id/123:hello
    @RequestMapping("/id/{id}")
    public String id(
            @PathVariable("id") String id ) {
        return id;
    }
    //localhost:8080/dynamic/number/123:hello
    @RequestMapping("/number/{number}:hello")
    public int number(
            @PathVariable("number") int number ) {
        return number;
    }
    //localhost:8080/dynamic/number/123:hello/t
    @RequestMapping("/number/{number}:hello/t")
    public int anInt(
            @PathVariable("number") int number ) {
        return number;
    }
    //localhost:8080/dynamic/number/qwerwww333/t
    @RequestMapping("/number/{number:[a-z-]+}{other:\\d{3}}/t")
    public String regular(
            @PathVariable("number") String number ,
            @PathVariable("other")String other) {
        return number+other;
    }
    //不支持
/*    @RequestMapping("/date/{date}")
    public Date date(
            @PathVariable("date") Date date ) {
        return date;
    }*/
}

2.@RequestParam详解

     GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上         

     @RequestParam 有三个属性:

  • value:请求参数名(必须配置)
  • required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)
  • defaultValue:默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置)

     @RequestParam用于将指定的请求参数赋值给方法中的形参。
(1) get请求:

url请求:http://localhost:8080/WxProgram/findAllBookByTag?tagId=1&pageIndex=3

userTest.jsp

<form action="/WxProgram/json/requestParamTest" method="get">
    requestParam Test<br>
    用户名:<input type="text" name="username"><br>
    用户昵称:<input type="text" name="usernick"><br>
    <input type="submit" value="提交">
</form>

UserController.java

@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
    public String requestParamTest(@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick){
        System.out.println("requestParam Test");
        System.out.println("username: " + userName);
        System.out.println("usernick: " + userNick);
        return "hello";
    }

 (2)post请求:

     跟get请求格式一样,只是把方法中的get换成post

     @RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

      RequestParam实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

       get方式中query String的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。

3.@RequestBody详解

    @RequestBody注解可以接收json格式的数据,并将其转换成对应的数据类型。

(1)@RequestBody接收一个对象

          url请求:http://localhost:8080/WxProgram/findBookByName

@RequestMapping(value="/findBookByName", method = RequestMethod.POST)
@ResponseBody
public DbBook findBookByName(@RequestBody DbBook book){
    System.out.println("book: " + book.toString());
    System.out.println("book name: " + book.getTitle());
    String bookName = book.getTitle();
    DbBook book = wxService.findBookByName(bookName);    
    return book;
}

(2)@RequestBody接收不同的字符串

前端页面

wx.request({
      url: host.host + `/WxProgram/deleteBookById`,
      method: 'POST',
      data: {
        nick: this.data.userInfo.nickName,
        bookIds: bookIds
      },
      success: (res) => {
        console.log(res);
        this.getCollectionListFn();
      },
      fail: (err) => {
        console.log(err);
      }
    })

后台控制

@RequestMapping(value="/deleteBookById",method=RequestMethod.POST)
@ResponseBody
public void deleteBookById(@RequestBody Map<String, String> map){
    String bookIds = map.get("bookIds");
    String nick = map.get("nick");
    String[] idArray = bookIds.split(",");
    Integer userId = wxService.findIdByNick(nick);
    for(String id : idArray){
        Integer bookid = Integer.parseInt(id);
        System.out.println("bookid: " + bookid);
        wxService.removeBookById(bookid, userId);
    }
}

@RequestBody
处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

@RequestBody用于post请求,不能用于get请求

获取Http头信息(@RequestHeader)

      @RequestHeader 获取请求头文件的信息

  • value值:对应头文件中的键
  • defaultValue:该参数的默认值当键值没有传输时将使用这个参数进行赋值
  • required是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

自动注入获取参数(HttpServletRequest)

/*
    HttpServletRequest request自动注入获取参数
     */
    @GetMapping("/v1/test_request")
    public Object testRequest(HttpServletRequest request){
        params.clear();
        String id =request.getParameter("id");
        params.put("id",id);
        return params;
    }

总结

当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:
1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。