响应
Http响应的结果可以是数据也可以是静态页面可以针对响应设置状态码 Header信息
返回静态页面注解@RestController和@Controller
我们创建一个前端页面

java
package com.example.demo.demos.web.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReturnController {
@RequestMapping("index")
public Object index(){
return "index.html";
}
}
当我们发起请求时发现页面返回的是一个字符串而不是刚刚的html静态界面
这时我们需要把注解@RestController 改成 注解@Controller就能正确返回想要显示的静态界面了
@Responsebody返回数据:定义返回的数据格式为⾮视图,返回⼀个text/html信息
@Controlle返回试图:定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理
@RestController=@Controlle+@Responsebody
但是随着MVC的概念发生变化View不再返回视图而是返回显示试图时需要的数据
我们可以查看@RestController的源码
java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
其中这三个是元注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
@Documented
@Target这个注解的作用是表示注解修饰的对象
@Retention表示注解的生命周期
@Documented表示在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
@Controller
@ResponseBody
这表示注解@RestController由这两个注解组成
返回数据注解@ResponseBody
可以修饰类也可以修饰方法
修饰类的时候表示这个类下的所有方法返回的都是数据
修饰方法时表示该方法返回的是数据
java
@RequestMapping("/return")
@Controller
public class ReturnController {
@RequestMapping("/index")
public Object index(){
return "index.html";
}
@RequestMapping("/returnData")
@ResponseBody
public String returnData(){
return "返回数据";
}
}

也可以返回Html片段
java
@RequestMapping("/return")
@Controller
public class ReturnController {
@RequestMapping("/index")
public Object index(){
return "index.html";
}
@RequestMapping("/returnData")
@ResponseBody
public String returnData(){
return "返回数据";
}
@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml(){
return "<h1>返回Html代码片段<h1>";
}
}

返回JSON
当我们返回接口的是String是conten-Type就是text/html
当我们返回接口时对象时这个注解就会自动设置为application/json Map
java
@RequestMapping("/returnJson")
@ResponseBody
public Person returnJson(){
Person person = new Person();
person.setAge(18);
person.setId(2021);
person.setName("张三");
return person;
}
java
@RequestMapping("returnMap")
@ResponseBody
public Map<String,String> returnMap(){
Map<String,String> kv = new HashMap<>();
kv.put("k1","k1");
kv.put("k2","k2");
kv.put("k3","k3");
return kv;
}

可以看到回自动定义为json格式
设置状态码
java
@RequestMapping("setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response){
response.setStatus(401);
return "设置状态码";
}
通常是200但是这里设置为401
状态码不影响页面显示

设置Header
我们可以通过@RequestMapping注解来实现http报头传递一些附加信息
比如
我们查看@RequestMapping的源码
java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
value: 指定映射的URL method:指定请求的method类型,如GET,POST等
consumes:指定处理请求(request)的提交内容类型(Content-Type),例如application/json,
text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
Params:设置request(响应)中必须包含某些参数值时,才让该⽅法处理
headers:
指定request中必须包含某些指定的header值,才能让该⽅法处理请求
设置其他Header
java
@RequestMapping(value = "/r1" , produces = "application/json;charset=utf-8")
@ResponseBody
public String r1(HttpServletResponse response){
//设置header
response.setHeader("myhead","myhead");
return "{'OK':1}";
}