@RequestParam用來處理Content-Type 為 application/x-www-form-urlencoded編碼的內容,將請求參數名映射到方法參數名。在Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型。接下來我們結合測試用例看一下@RequestParam注解的三個主要參數。
@RestController @RequestMapping("/user") public class UserController { private static Logger logger = LoggerFactory.getLogger(UserController.class); @GetMapping("/viewUserByBean") public User viewUserByBean(User user) { logger.info("@GetMapping中請求參數 ownerId = " + user.getId()); user.setName(user.getName() + " --> lucy"); return user; } @RequestMapping(value ="/viewUserByEachEle",method = RequestMethod.GET) public User viewUserByEachEle(@RequestParam(value = "id", required = false, defaultValue = "1") Long ownerId, @RequestParam("userName") String name) { logger.info("請求參數 ownerId = " + ownerId); User user = new User(); user.setId(ownerId); user.setName(name + " --> lucy"); return user; } @GetMapping("/testRequestParam") public String testRequestParam(@RequestParam(value = "id", required = false, defaultValue = "1") Long ownerId, @RequestParam("userName") String name) { logger.info("testRequestParam, userName: " + name + ", id: "
+ ownerId); return "SUCCESS"; } } // 定義User Bean
public class User implements Serializable { private static final long serialVersionUID = 7797704227043955944L; private Long id; private String name; // omit getter、setter and toString
}
使用postman模擬ajax請求,URL為http://localhost:8080/user/viewUserByEachEle?userName=licy&id=1002:
@RequestParam
@RequestParam可以接受簡單類型的屬性,也可以接受對象類型(如viewUserByBean方法)。創建一個實體類對象作為參數承載體,Spring MVC會根據參數名稱自動將參數綁定到實體類對象的屬性上,viewUserByBean就是這么處理的。
value:String 類型,請求參數名,如viewUserByEachEle 方法中的userName表示請求參數名,它的值將被綁定到方法參數name。
required:是否必須,默認值為true,表示請求參數中必須包含對應的參數,否則,將拋出400錯誤碼;異常信息是org.springframework.web.bind.MissingServletRequestParameterException,提示“Required String parameter 'userName' is not present”。
defaultValue:String 類型,表示如果請求中沒有同名參數時的默認值,默認值可以是SpEL表達式,如“#{systemProperties['java.vm.version']}”。
其實如果不使用@RequestParam,Spring MVC也會將request的parameter自動綁定到method的parameter中,使用@RequestParam只不過是對parameter進行配置和對URL更精確化的配置。例如,在請求參數名和方法參數名相同時,則可以省略@RequestParam注解。
@GetMapping
@GetMapping是一個組合注解,等價於@RequestMapping(method = RequestMethod.GET),它將HTTP Get請求映射到特定的處理方法上。例如,在測試用例中,使用@GetMapping("/testRequestParam")代替了@RequestMapping(value ="/viewUserByEachEle",method = RequestMethod.GET),顯然,這可以精簡我們的代碼。