controller相关的注解的使用和解释
可能未列全,但是这些是常见的controller注解
名称 | 作用 | 作为位置 |
---|---|---|
@Controller | 处理http的请求 | ElementType.TYPE |
@ResponseBody | 将方法的返回值作为body进行返回 | ElementType.METHOD,ElementType.TYPE |
@RestController | Restful请求风格,返回方法的返回值,常用于返回json格式内容,底层是@Controller和@ResponseBody的组合 | ElementType.TYPE |
@RequestMapping | 通用请求,不区分是GET/POST还是PUT之类的 | ElementType.METHOD |
@GetMapping | Get请求,底层是@RequestMapping(method = {RequestMethod.GET}) | ElementType.METHOD |
@PostMapping | Post请求,底层是@RequestMapping(method = {RequestMethod.POST}) | ElementType.METHOD |
@PutMapping | PUT请求,底层是@RequestMapping(method = {RequestMethod.PUT}) | ElementType.METHOD |
@DeleteMapping | Delete请求,底层是@RequestMapping(method = {RequestMethod.DELETE}) | ElementType.METHOD |
@PathVariable | 获取url参数 | ElementType.PARAMETER |
@RequestParam | 获取请求参数 | ElementType.PARAMETER |
@Controller是万能的注解,可以进行地址跳转,文件的下载,也可以与@ResponseBody组合,变成@RestController
例如 使用@Controller导出文件
/**
* 导出excel
*/
@Controller
public class ExportExcelController {
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
List<String> headList = Arrays.asList("姓名", "地址");
List<LinkedHashMap<String, Object>> dataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
map.put("姓名", "张三" + i);
map.put("地址", "北京" + i);
dataList.add(map);
}
ExcelExportUtils.exportExcel(headList, dataList, "学生名单1", "某校学生名单", response);
}
}
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@GetMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name){
return "hello "+name;
}
我们改用@Controller,再运行进行请求则会报错,@RestController表示将方法的返回值作为body返回。
我们对方法添加@ResponseBody注解,再次执行代码,则运行正常。
@ResponseBody:该注解即可添加在方法上,也可以添加在类上
不限制请求的类型是GET、POST、PUT、DELETE 等,属于通用型的请求。使用@RequestMapping时,swagger 显示API时会出现重复。
示例
@RequestMapping("/sayHello2/{name}")
public String sayHello2(@PathVariable("name") String name){
return "hello2 "+name;
}
只能接收客户端发出的GET请求
@GetMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name){
return "hello "+name;
}
只能接收客户端发送的POST请求
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@PostMapping("/save")
public String save(User user) {
log.info("save方法打印内容:" + JSON.toJSONString(user));
return "ok";
}
}
只接收PUT请求。
demo略。
只接收Delete请求。
demo略。
从请求的Path(路径,就是url路径)中获取参数,示例:
@GetMapping("/sayHello/{name}")
public String sayHello(@PathVariable("name") String name){
return "hello "+name;
}
RequestParam是指从request对象里获取参数,就是我们传统的request.getParameter(“name1”)一样,不区分请求类型,等价于下面这样的代码。
request.getParameter("name1");
request.getParameter("name2");
@PostMapping("/testInsert")
public String testInsert(@RequestParam("name1")String name1, @RequestParam("name2")String name2){
log.info("name1:"+name1);
log.info("name2:"+name2);
return "ok";
}
参数接收可以缺省注解,直接在方法括号内接收即可。
@PostMapping("/testUser")
public String testUser(User user){
log.info(JSON.toJSONString(user));
return "ok";
}
我们可以不设置注解,直接接收参数,显然在方法内接收参数,我们并没有使用@PathVariable和@RequestParam,直接缺省,同样可以获取到请求的参数。
@GetMapping("/testUser2")
public String testUser2(String name){
log.info("get "+name);
return "ok";
}
@PostMapping("/testUser3")
public String testUser3(String name){
log.info("post "+name);
return "ok";
}
@PathVariable和@RequestParam都支持自行设定参数是否必须,默认都是必传。
示例,name1非必传
@RequestParam(value = "name1",required = false)String name1
@PostMapping("/testInsert")
public String testInsert(@RequestParam(value = "name1",required = false)String name1, @RequestParam("name2")String name2, HttpServletRequest request){
request.getParameter("name1");
request.getParameter("name2");
log.info("name1:"+name1);
log.info("name2:"+name2);
// userService.insertTest(name1,name2);
return "ok";
}
如果使用@RestController,它本身就是@Controller和@@RequestBody的组合。
@RequestBody 返回方法的返回值,而不是将其进行解析成跳转路径等信息。
@RequestBody 添加在方法上,表示将该方法的返回内容输出的前端。
@RequestBody 添加在类上,表示这个类的每个方法都被作用到,等同于将@RequestBody添加在每个方法上。
举个例子:
下面这段代码,使用@Controller 则,而不使用@RequestBody,表示页面跳转到index2.html页面
@Controller
public class HelloController {
@RequestMapping("/")
public String hello(){
return "forward:index2.html";
}
}
如果添加@RequestBody,访问这个链接,则直接输出return的字符串