持续学习&持续更新中…
守破离
【Java从零到架构师第③季】【25】SpringMVC-@RequestMapping_获取请求参数_请求路径变量
@RequestMapping
@RequestMapping用于方法上
@Controller
public class UserController {
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
@ResponseBody
public String addUser() {
return "Add Success!";
}
@RequestMapping(value = "/removeUser", method = RequestMethod.POST)
@ResponseBody
public String removeUser() {
return "Remove Success!";
}
}
@RequestMapping用于类和方法上
@Controller
@RequestMapping("/skill")
public class SkillController {
/*
/skill/add
*/
@RequestMapping("/add")
@ResponseBody
public String add() {
return "SkillController - Add Success!";
}
/*
/skill/remove
*/
@RequestMapping("/remove")
@ResponseBody
public String remove() {
return "SkillController - Remove Success!";
}
}
@GetMapping、@PostMapping
@Controller
public class UserController {
// @RequestMapping(value = "/addUser", method = RequestMethod.GET)
// 等价于
@GetMapping("/addUser")
@ResponseBody
public String addUser() {
return "Add Success!";
}
// @RequestMapping(value = "/removeUser", method = RequestMethod.POST)
// 等价于
@PostMapping("/removeUser")
@ResponseBody
public String removeUser() {
return "Remove Success!";
}
}
总结及补充
-
实际开发中,建议严格区分GET、POST请求,而不是像Java②项目那样宽松,无论是GET还是POST都可以获取到数据。
-
@RequestMapping、@GetMapping、@PostMapping都可以传入多个URL:
@Controller public class UserController4 { @GetMapping({"/addUser", "/insertUser"}) @ResponseBody public String addUser() { return "Add Success!"; } @PostMapping({"/removeUser", "/deleteUser"}) @ResponseBody public String removeUser() { return "Remove Success!"; } @RequestMapping(value = {"/getUser", "/fetchUser"}, method = RequestMethod.GET) @ResponseBody public String getUser() { return "Get success!"; } }
获取请求参数
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
默认情况下,会主动传递一些参数给方法(这些参数的数量、顺序是无所谓的):
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
public String add(
HttpServletRequest request,
HttpServletResponse response,
HttpSession session,
WebRequest webRequest
) {
System.out.println("request : " + request);
System.out.println("response : " + response);
System.out.println("session : " + session);
System.out.println("webRequest : " + webRequest);
return "Add Success!";
}
}
获取请求参数方法一:
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
public String add(HttpServletRequest request) {
System.out.println("username : " + request.getParameter("username"));
System.out.println("password : " + request.getParameter("password"));
System.out.println("level : " + request.getParameter("level"));
return "Add Success!";
}
}
获取请求参数方法二:
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
public String add(String username, String password, Integer level) {
System.out.println(level);
System.out.println(username);
System.out.println(password);
return "Add Success!";
}
}
获取请求参数方法二—使用@RequestParam:
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
public String add(@RequestParam("username") String name,
@RequestParam("password") String psword,
@RequestParam("level") Integer skillLevel) {
System.out.println(name);
System.out.println(psword);
System.out.println(skillLevel);
return "Add Success!";
}
}
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
// required默认为true
public String add(@RequestParam(value = "username",required = true) String name,
@RequestParam(value = "password",required = true) String psword,
@RequestParam(value = "level", required = false) Integer skillLevel) {
System.out.println(name);
System.out.println(psword);
System.out.println(skillLevel);
return "Add Success!";
}
}
获取请求参数方法二—总结:
-
如果没有为某个参数加
@RequestParam
- 这个参数,客户端可传可不传,如果不传,该参数值为
null
- 如果需要客户端传,那么,方法形参名必须和客户端表单的
name
保持一致
- 这个参数,客户端可传可不传,如果不传,该参数值为
-
如果为方法的参数加上了
@RequestParam
- 方法形参名不必和客户端表单的
name
保持一致,可以通过@RequestParam(value="客户端表单name")
来设置该参数对应表单的哪个name @RequestParam
默认值为true
,也就是说,客户端必须传该参数,如果不传,会出现400错误- 手动设置
@RequestParam
为false
,那么,客户端就可以不传,不传的话,该参数值为null
- 方法形参名不必和客户端表单的
-
总结:如果必须让客户端传递某个参数:
@PostMapping("/add") @ResponseBody public String add(@RequestParam String username, // 相当于 @RequestParam(value = "username",required = true) @RequestParam String password, // 相当于 @RequestParam(value = "password",required = true) @RequestParam Integer level) { // 相当于 @RequestParam(value = "level",required = true) // ... return "Add Success!"; }
获取请求参数方法三—使用Model(domain)
public class Skill {
private String username;
private String password;
private Integer level;
// ...
}
@RequestMapping("/skill")
@Controller
public class SkillController {
@PostMapping("/add")
@ResponseBody
public String add(Skill skill) {
System.out.println(skill);
return "Add Success!";
}
}
这样也可以:
@PostMapping("/add")
@ResponseBody
public String add(Skill skill1, Skill skill2, String username, Integer level) {
System.out.println(skill1);
System.out.println(skill2);
System.out.println(username);
System.out.println(level);
return "Add Success!";
}
请求路径变量
做法一:
@Controller
@RequestMapping("/skill")
public class SkillController {
@GetMapping("/get")
@ResponseBody
public String get(Integer id) {
Skill skill = service.get(id);
return skill.toString();
}
}
访问:
http://localhost:8080/mvc02/skill/get?id=2
做法二:
@Controller
@RequestMapping("/skill")
public class SkillController {
@GetMapping("/get/{skillId}")
@ResponseBody
public String get(@PathVariable("skillId") Integer id) {
Skill skill = service.get(id);
return skill.toString();
}
}
访问:
http://localhost:8080/mvc02/skill/get/2
注意和一些细节
-
当不确定某个概念时,把代码敲出来,实际的去试一试即可。
-
当不清楚哪个API时,对某个API有疑惑时,点进去看看它的内部实现,多多学习。
-
多尝试,热爱代码。
参考
小码哥-李明杰: Java从0到架构师③进阶互联网架构师.
本文完,感谢您的关注支持!