【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错误
    • 手动设置@RequestParamfalse,那么,客户端就可以不传,不传的话,该参数值为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到架构师③进阶互联网架构师.


本文完,感谢您的关注支持!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值