SpringBoot笔记:控制类Controller
一个类想要变成控制类,只需要在类上加一个@Controller注解即可,其作用为指定请求路径及其对应的处理方法。
一、请求路径和传参
常用注解 :可以直接使用@RequestMapping、@PostMapping、@GetMapping、@PutMapping、@DeleteMapping等注解指定某个方法对应的请求路径,从注解的名称其实就可以看出来,除了第一个注解是可以自定义请求方式的,后面的几个注解的请求方式都已经写死了。
指定请求路径 :以注解@RequestMapping为例,在对应的方法上使用注解 @RequestMapping(value = "/string-demo", method = RequestMethod.GET)
指定请求路径,指定之后,在浏览器输入 http://localhost:8080/string-demo
即可访问。这个注解也可以放在类上,此时指定的请求路径就表示这个类下的所有方法请求路径的前缀了,一个方法最终的完整请求路径就会是“类+方法”的请求路径了。另外,如果method参数不指定的话,这个方法将接收所有满足条件的请求。
接收请求body :@PostMapping这类请求方式如果需要接收请求body,那么需要在对应的方法参数上使用@RequestBody注解进行接收。
接收查询参数 :在请求路径中定义的查询参数,直接在方法中定义一个同名的参数即可。
接收path参数 :如果在url中定义了path参数,那么需要在对应的方法参数上使用@PathVariable注解进行接收。
package com.yun.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
// 指定控制类
@Controller
// 指定url前缀
@RequestMapping(value = "/hello")
public class MvcDemoController {
// 浏览器访问:http://localhost:8081/hello/string-demo
@RequestMapping(value = "/string-demo", method = RequestMethod.GET)
// 自动解析返回值到浏览器
@ResponseBody
public String stringDemo() {
return "String demo";
}
// 此url只能使用POST请求方式访问
@PostMapping(value = "/object-demo")
@ResponseBody
// 使用@RequestBody接收请求body
public Object objectDemo(@RequestBody Object body) {
return body;
}
// 浏览器访问:http://localhost:8080/hello/world?message=zhangsan
@RequestMapping(value = "/world")
@ResponseBody
// 使用同名的参数接收url中的查询参数
public String hello(String message) {
return "Hello " + message;
}
// 指定path参数
@RequestMapping(value = "/{name}")
@ResponseBody
// 使用注解@PathVariable接收path参数
public String pathDemo(@PathVariable("name") String name) {
return "Hello " + name;
}
}
二、返回值类型
RESTful编程 :如果想要某个方法返回json格式数据,只需要在该方法上加上注解@ResponseBody即可,表示根据返回值类型,自动解析返回值为json格式数据到前端,返回值类型通常有String、Object、Map,也可以将返回值统一定义为Object类型,@ResponseBody注解都可以自动解析后返回。如果想要整个Controller类的所有方法都返回json格式数据,只需要将注解@Controller替换为@RestController即可,该类下的所有方法就不用再使用注解@ResponseBody了。
package com.yun.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping(value = "/hello")
public class MvcDemoController {
@RequestMapping(value="/map-demo")
@ResponseBody
public Map<String, Object> mapDemo() {
HashMap<String, Object> responseMap = new HashMap<>();
responseMap.put("message", "Map demo");
return responseMap;
}
}