开发 RESTful API
时,一般都会在 Controller
上加上 @Controller
注解,但是有时候加上@RestController
。
@RestController
注解等价于@ResponseBody + @Controller
。
@RestController
和 @Controller
的共同点是都用来表示Spring
某个类是否可以接收HTTP
请求,二者区别:
@RestController
无法返回指定页面,而@Controller
可以
- 对于
Controller
, 如果只是使用@RestController
注解,则其方法无法返回指定页面,此时配置的视图解析器 InternalResourceViewResolver
不起作用,返回的内容就是 return
里的内容。 如果需要返回到指定页面,则需要用 @Controller
配合视图解析器 InternalResourceViewResolver
才行。
- 前者可以直接返回数据,后者需要
@ResponseBody
辅助。
- 如果需要返回
JSON
,XML
或自定义mediaType
内容到页面,@RestController
自己就可以搞定,这个注解对于返回数据比较方便,因为它会自动将对象实体转换为JSON
格式。而@Controller
需要在对应的方法加上@ResponseBody
注解。
RestController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.util.HashMap; import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;
@RestController @RequestMapping("/difference") public class DifferenceController {
// 跳转到上传文件的页面 @RequestMapping(value = "/goToSuccessPage", method = RequestMethod.GET) public String goToSuccessPage() { // 跳转到 视图层 success.html失败 return "success"; }
@RequestMapping(value = "findAll", method = RequestMethod.GET) public Map<String, String> findAll() { Map<String, String> all = new HashMap<>(); all.put("remark", "可以返回json,xml或自定义mediaType内容到页面"); return all; } }
|
Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Controller @RequestMapping("/login") public class LoginController {
@GetMapping(value = "/login") public String login() { return "login"; } @RequestMapping(value = "/getJson", method = RequestMethod.GET) @ResponseBody public Map<String, String> getJson() { Map<String, String> all = new HashMap<>(); all.put("remark", "结合注解 @ResponseBody 返回接送"); return all; } }
|