1. 程式人生 > 實用技巧 >@RequestParam @PathVariable @ @RequestBody的使用演示

@RequestParam @PathVariable @ @RequestBody的使用演示

@RequestParam

1、作用

語法:@RequestParam(value=”引數名”,required=”true/false”,defaultValue=””)
 
value:引數名
 
required:是否包含該引數,預設為true,表示該請求路徑中必須包含該引數,如果不包含就報錯。
 
defaultValue:預設引數值,如果設定了該值,required=true將失效,自動為false,如果沒有傳該引數,就使用預設值
package com.day01springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 20:58 2018/11/16
 */
@Controller
@RequestMapping("hello")
public class HelloController2 {
 
    /**
     * 接收普通請求引數
     * http://localhost:8080/hello/show16?name=linuxsir
     * url引數中的name必須要和@RequestParam("name")一致
     * @return
     */
    @RequestMapping("show16")
    public ModelAndView test16(@RequestParam("name")String name){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello2");
        mv.addObject("msg", "接收普通的請求引數:" + name);
        return mv;
    }
 
    /**
     * 接收普通請求引數
     * http://localhost:8080/hello/show17
     * url中沒有name引數不會報錯、有就顯示出來
     * @return
     */
    @RequestMapping("show17")
    public ModelAndView test17(@RequestParam(value="name",required=false)String name){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello2");
        mv.addObject("msg", "接收普通請求引數:" + name);
        return mv;
    }
 
    /**
     * 接收普通請求引數
     * http://localhost:8080/hello/show18?name=998 顯示為998
     * http://localhost:8080/hello/show18?name 顯示為hello
     * @return
     */
    @RequestMapping("show18")
    public ModelAndView test18(@RequestParam(value="name",required=true,defaultValue="hello")String name){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello2");
        mv.addObject("msg", "接收普通請求引數:" + name);
        return mv;
    }
 
}

@PathVariable

@PathVariable("xxx")
通過 @PathVariable 可以將URL中佔位符引數{xxx}繫結到處理器類的方法形參中@PathVariable(“xxx“)

@RequestMapping(value=”user/{id}/{name}”)
請求路徑:http://localhost:8080/hello/show5/1/james

package com.day01springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 20:58 2018/11/16
 */
@Controller
@RequestMapping("hello")
public class HelloController2 {
    /**
     *3、佔位符對映
     * 語法:@RequestMapping(value=”user/{userId}/{userName}”)
     * 請求路徑:http://localhost:8080/hello/show5/1/james
     * @param ids
     * @param names
     * @return
     */
    @RequestMapping("show5/{id}/{name}")
    public ModelAndView test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","佔位符對映:id:"+ids+";name:"+names);
        mv.setViewName("hello2");
        return mv;
    }
}

@requestBody

1、@requestBody註解常用來處理content-type不是預設的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json型別。

  2、

    通過@requestBody可以將請求體中的JSON字串繫結到相應的bean上,當然,也可以將其分別繫結到對應的字串上。
    例如說以下情況:
    $.ajax({
        url:"/login",
        type:"POST",
        data:'{"userName":"admin","pwd","admin123"}',
        content-type:"application/json charset=utf-8",
        success:function(data){
          alert("request success ! ");
        }
    });

    @requestMapping("/login")
    public void login(@requestBody String userName,@requestBody String pwd){
      System.out.println(userName+" :"+pwd);
    }
    這種情況是將JSON字串中的兩個變數的值分別賦予了兩個字串,但是呢假如我有一個User類,擁有如下欄位:
      String userName;
      String pwd;
    那麼上述引數可以改為以下形式:@requestBody User user 這種形式會將JSON字串中的值賦予user中對應的屬性上
    需要注意的是,JSON字串中的key必須對應user中的屬性名,否則是請求不過去的。

 3、

    在一些特殊情況@requestBody也可以用來處理content-type型別為application/x-www-form-urlcoded的內容,只不過這種方式

    不是很常用,在處理這類請求的時候,@requestBody會將處理結果放到一個MultiValueMap<String,String>中,這種情況一般在
    特殊情況下才會使用,
    例如jQuery easyUI的datagrid請求資料的時候需要使用到這種方式、小型專案只建立一個POJO類的話也可以使用這種接受方式