一、@RestController VS @Controller VS @ResponseBody
1.1 关于元注解
- 什么是元注解:可以被其他注解使用,用来描述该注解基本信息的注解
- 有什么:
- @Target:该注解可以修饰什么,指应用范围
- ElementTYPE.TYPE:表示该注解可以修饰【类和接口】
- ElementTYPE.METHOO:表示该注解可以修饰【方法】
- @Retention:注解的生命周期
- SOURCE:代码阶段,表示该注解只活在代码阶段,一编译注解就消失了
- CLASS:编译阶段
- RUNTIME:运行阶段
- @Document:文档。我们去编译时,是否要保留JDK、注释之类的东西
1.2 @Controller
- 作用:
- 让Spring帮我们管理代码:Spring是一个容器,容器就是可以放东西的。该注解可以让我们把该代码交给Spring,由Spring帮我们管理(后续如果人要访问对应路径,Spring能意识到)
- 返回视图:视图就是指前端页面
1.3 @ResponseBody
- 为什么要在方法上加上这个注解:因为现在用的是@Controller,即返回视图,此时就会去寻找“这是返回数据”这个视图,但是static里并没有该视图,故如果不加@ResponseBody表示这是返回数据,就会报404错误
- 关于字符集设置:Spring已经帮我们进行了字符集相关的处理,返回中文不需要再像Servlet一样,设置字符集了
@Controller
@RequestMapping("/param")
public class ParamController {
@ResponseBody
@RequestMapping("/responseData")
public String responseData(){
return "这是返回数据";
}
}

1.4 @RestController
- 场景:
- 在前后端未分离之前,根据MVC架构,我们确实是使用@Controller注解返回视图。但随着时代发展,前后端分离,后端程序员不再进行相关的前端开发,只需要返回前端需要的数据即可
- 返回数据就是依靠@ResponseBody注解,我们又同时需要@Controller把代码给Spring管理,这俩加起来就是@RestController注解
- 作用:把代码交给Spring管理(@Controller) + 返回数据(@ResponseBody)
- 类注解情况:修饰的类下的方法全部返回数据
- 方法注解情况:修饰的方法全部返回数据

- 其他写法:用两个注解写
- 当存在多个注解时,注解的顺序没有关系,可以随意写

二、响应
2.1 Spring 对于响应的设置
- 不用手动设置返回类型:我们不需要像使用Servlet那样,专门对要返回的类型进行描述,Spring已经帮我们处理好了,这是依靠于Spring的解析器。
- Spring解析器:Spring会有各种解析器用来判断要返回的数据是哪个类型,能不能转换,如果该解析器无法转换就会换下个解析器,直到能选定一个为止。
- 落实到具体类型上:可以自己尝试测试一下
- 当我们的接口返回的是【String/Integer之类】的,content-Type是【text/html】
- 当我们的接口返回的【是对象/Map之类】的,content-Type是【application/json】
2.2 返回静态页面
- 静态页面放在哪:static目录下
- 关于访问静态页面:static目录下的静态文件可以直接访问
- 直接打开该文件:相当于是用文件资源管理器来打开
- 利用网络来访问:使用浏览器来访问,输入【127.0.0.1:8080/index.html】 类似的路径即可
- 如何返回:
- 注解:因为要返回视图而非数据,所以使用@Controller注解
- 请求方法:Get
- 返回的文件:文件前面要加“/”
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/index")
public String index(){
return "/index.html";
}
}
2.3 返回HTML代码片段
- 方法:返回的数据中如果包含html标签,会直接被浏览器解析
- 如果只是想展示这串数据:用HTML的方法转义<>
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/returnHTML")
public String returnHTML(){
return "<h1>返回了h1标签</h1>";
}
}
2.4 返回JSON
- 方法:当方法返回的数据是对象/Map等时,Spring MVC会自动设置返回的content-Type为 【application/json】
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/returnJSON")
public Person returnJSON(){
Person person = new Person();
person.setUsername("zhangsan");
person.setAge(19);
return person;
}
}
2.5 设置HTTP状态码
- 设置的HTTP状态码不影响页面的展示
- 设置方法:使用Servlet原生的方法(设置HTTP状态码操作不常用,故而Spring未提供注解)
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){
response.setStatus(404);
return "ok";
}
}
2.6 设置响应部分的Header
- 使用场景:虽然我们可以通过主体传大部分数据,使用Header传递数据的场景不是很多。但在一些特殊场景下,还是需要用的,比如鉴权(根据用户权限提供服务)
- 如何设置:@RequestMapping 注解中的produces属性
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping(value = "/setHeader", produces = "application/json;charset=utf-8")
public String setHeader(){
return "{‘username': 'zhangsan'}";
}
}
- 关于utf8字符集的写法:不分大小写,utf8,utf-8、UTF-8、UTF8这四种方法都可以写
- 关于@RequestMapping注解:

二、状态码
2.1 HTTP 状态码
- 由谁定义:由HTTP返回,表示HTTP状态
- 与页面的关系:与页面能否正常展示无关
- 我们可以在后端手动设置状态码,此时哪怕设置的状态码是404,只要代码正确,页面也依旧能正常展示
- 分类:
- 2XX:成功
- 3XX:重定向
- 4XX:客户端错误
- 5XX:服务端错误
2.2 业务状态码
- 由谁定义:由后端自定义,我们通常会用一个其他的字段来表示
- 作用:使前端可以根据不同的业务状态码执行不同的操作
- 解析:在HTTP响应成功的情况下,我们可以把业务的响应结果分为不同的状态。比如登录时,密码正确返回200,密码错误返回-1。