类上:
@Controller:声明为组件
@RequestMapping:放在类上即所有handler方法都先加上此路径
@EnableWebMvc:他会加入json处理器进行json数据处理。否则使用@RequestBody注解时无法将json数据映射到对应的对象上。需要导入jackson依赖。
@RestController
方法上:
@RequestMapping:将请求URL地址与请求处理的方法(handler方法)绑定起来
@GetMapping、@PostMapping、@PutMapping(更新)、@DeleteMapping(删除)
理解handler方法的作用和组成:
/**
* TODO: 一个controller的方法是控制层的一个处理器,我们称为handler
* TODO: handler需要使用@RequestMapping/@GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!
* TODO: handler作用总结:
* 1.接收请求参数(param,json,pathVariable,共享域等)
* 2.调用业务逻辑
* 3.响应前端数据(页面(不讲解模版页面跳转),json,转发和重定向等)
* TODO: handler如何处理呢
* 1.接收参数: handler(形参列表: 主要的作用就是用来接收参数)
* 2.调用业务: { 方法体 可以向后调用业务方法 service.xx() }
* 3.响应数据: return 返回结果,可以快速响应前端数据
*/
@GetMapping
public Object handler(简化请求参数接收){
调用业务方法
返回的结果 (页面跳转,返回数据(json))
return 简化响应前端数据;
}
接收数据:
param传参(@RequestParam):适用于简单的数据类型传递
- 形参数名和类型与传递参数相同,即可自动接收!
- 如果参数名不一致,可使用注解@RequestParam("name") String UserName,将客户端参数名为name的参数绑定到形参UserName上。
- 提交的数据的时候一个key对应多个值,可以使用集合进行接收 @RequestParam List<String> keyname
- 实体接收时:要求属性名必须等于参数名,否则无法映射!形参:(User user)不需要写注解
路径参数接收(@PathVariable ):
如果我们想将 /user/{id}
路径下的 {id}
映射到控制器方法的一个参数中,则可以使用 @PathVariable
注解来实现。
@GetMapping("/user/{id}/{name}")
@ResponseBody
public String getUser(@PathVariable Long id,
@PathVariable("name") String uname) {
System.out.println("id = " + id + ", uname = " + uname);
return "user_detail";
}
json参数接收(@RequestBody 常用):
@RequestBody
注解来将 JSON 数据转换为 Java 对象,表示当前方法参数的值应该从请求体中获取。 json数据需要有对应的实体类——XXXVo类
@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {// 在这里可以使用 person 对象来操作 JSON 数据中包含的属性
return "success";
}
@RequestBody
注解将请求体中的 JSON 数据映射到person对象上。
接收Cookie数据(@CookieValue):
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) {
//...
}
接收请求头数据(@RequestHeader):
@GetMapping("/demo")
public void handle(
@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
//...
}
响应数据:
- 页面控制跳转(不常用)
- 返回JSON(@ResponseBody 重点)
使用 @ResponseBody
注解,用于将方法返回的对象序列化为 JSON 或 XML 格式的数据,并发送给客户端。也是用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,而不是由视图解析器来解析并渲染生成响应体(即viewResolver没用)
@GetMapping("/accounts/{id}")
@ResponseBody
public Object handle() {
// ...
return obj;
}
如果类中每个方法上都标记了 @ResponseBody 注解,那么这些注解就可以提取到类上。
类上的 @ResponseBody 注解可以和 @Controller 注解合并为 @RestController 注解。
3.返回静态资源(不常用)