@RestController 和 @Controller 的区别
如图所说: @RestController 相当于 @Controller 与 @ResponseBody 的组合。这里,了解了后两者的作用, @RestController 的作用自然就明白了。
-
@Controller :注解的作用是将当前类声明为 SpringMVC 中的 Controller ,注入到 Spring IOC 容器,IOC 容器的作用就是在程序开始运行时帮助开发人员自动实例化对象。单纯被 @Controller 修饰的方法返回的是字符串,或者与视图解析器结合使用返回字符串匹配的模板的名称,即直接渲染视图,与 HTML 页面配合使用,后端通过 model 对象(或者 modelAndView)绑定相关数据,传入前端展示到浏览器。
@Controller public class userController { @GetMapping("/user") public String getUser(Model model) { model.addAttribute("name","张三"); model.addAttribute("age", 25); return "userInfo"; } }
-
user.html 视图代码:
-
这里涉及到一个知识:springboot 如何从 controller 返回到页面
-
这里需要在 springboot 的默认配置文件 application.yml(没有则在 “resource” 下手动创建一个) 添加地址修饰
spring: mvc: view: prefix: / # 地址前缀 suffix: .html # 地址后缀
这样配置的好处就是在 controller 返回地址是,只需要写字符串匹配的页面模板名称,如:
return "userInfo"
,如果没有配置,则需要返回完整的地址,如:return "/userInfo.html"
。
-
<html xmlns:th="http://thymeleaf.org"> <body> <div> <p th:text="'name:' + ${name}"></p> <p th:text="'age:' + ${age}"></p> </div> </body> </html>
-
使用 @Controller + @ResponseBody,进行测试。
import java.util.HashMap;
import java.util.Map;
@Controller // 可以将@Controller + @ResponseBody 直接替换成 @RestController,也是同样的效果
public class helloController {
@ResponseBody
@GetMapping("/")
public String getUser() {
return "Hello World!";
}
@ResponseBody
@GetMapping("/Info")
public Map getInfo(){ // 不添加 @ResponseBody,单纯的@Controller只能返回String 字符串,见下图3
return new HashMap<String, String>(){{
put("name", "springboot");
}};
}
}
- @ResponseBody :注解的作用将修饰接口的返回值以 JSON 字符串的形式返回给客户端,如果返回的是 String 类型的数据,则以 Stirng 字符串返回。
如果接口返回的是其他数据类型,如:Map、Object 等,不添加 @ResponseBody,单纯的 @Controller 只能将无法识别并产生如下错误页面。