文章目录
- 3.响应
- 3.1 返回静态页面
- 3.2 返回HTML代码片段
- 3.3 返回JSON
- 3.4 设置状态码
- 3.5 设置Header
- 设置Content-Type
- 设置其他Header
3.响应
3.1 返回静态页面
静态html页面一般放在static目录底下,访问路径是以static文件为根目录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<h1>我是页面</h1>
</body>
</html>
那么后端如何接收以后请求返回一个页面呢?
直接这样行吗?
@RestController
@RequestMapping("/response")
public class ResponseController {
@RequestMapping("/getIndex")
public String getIndex() {
return "index.html";
}
}
我们来看看请求返回结果:
直接是以字符串的形式返回了
正确的做法是,我们需要将RestController改为Controller,以及将"index"改为"/index"
@Controller
@RequestMapping("/response")
public class ResponseController {
@RequestMapping("/getIndex")
public String getIndex() {
return "/index.html";
}
对于上述两个改动的解释:
- “index"改为”/index"
如果加上"/“,那么此时的路径就是"staitc/index”;如果没有"/“,那么此时的路径就是类路径加上文件名,即"static/response/index.html”
- 将RestController改为Controller
如果使用的是RestController,我们来看看结果:
此时就是直接返回字符串格式
这就是二者的区别
@RestController 返回数据,@Controller返回视图
实际上,我们看看@RestController的实现:
不难发现,@RestController = @Controller + @ResponseBody
我们在之前说过,加上@RestController 表示这个类交给Spring管理,实际上是@Controller起的作用
而@ResponseBody起到返回数据的作用,@Controller起到返回视图的作用
如果运行这样的程序:
@Controller
//@RestController
@RequestMapping("/response")
public class ResponseController {
@RequestMapping("/getIndex")
public String getIndex() {
return "index.html";
}
@RequestMapping("getData")
public String getData() {
return "返回数据";
}
访问getData就会发现报错
因为加上了Controller注解,默认返回视图,而"返回数据"不是一个正确的路径
那么我们使用ResponseBody注解即可
或者可以修饰类
可以发现,此时就默认全部返回数据了
3.2 返回HTML代码片段
后端返回数据的时候,如果数据里面有HTML代码,就会被浏览器解析
3.3 返回JSON
@ResponseBody
@RequestMapping("getJSON")
public UserInfo getJSON() {
UserInfo userInfo = new UserInfo(20,"wcb");
return userInfo;
}
使用FIddler抓包:
即如果返回的是对象,会自动转为JSON
3.4 设置状态码
Spring MVC会根据我们方法的返回值结果自动响应设置状态码,程序员也可以手动指定状态码
@ResponseBody
@RequestMapping("setStatus")
public String setStatus(HttpServletResponse response) {
response.setStatus(401);
return "设置成功";
}
访问后使用Fiddler抓包
设置状态码是不影响响应结果的
3.5 设置Header
设置Header中的信息通过注解@RequestMapping实现
我们先来看@RequestMapping的源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
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/path:指定映射的URL
- mathod:指定请求的method类型.如GET//POST
- Params:指定request中必须包含某些参数值时,才让这个方法处理
- headers:指定request中必须包含某些特定的header值,才能让该方法处理请求
- consumes:指定处理request的提交类型(Content-Type),例如application/json…
- produces:指定返回的内容类型,仅当request请求头中的类型中包含该指定类型才返回
设置Content-Type
@ResponseBody
@RequestMapping(value = "/setContent-Type",produces = "application/json")
public String setContentType() {
return "{\"status\":200}";
}
同时也可以设置响应编码
@ResponseBody
@RequestMapping(value = "/setContent-Type",produces = "application/json;charset=UTF-8")
public String setContentType() {
return "{\"status\":200}";
}
设置其他Header
需要使用Spring MVC中的HttpServletResponse实现
@ResponseBody
@RequestMapping("/setHeader")
public String setHeader(HttpServletResponse response) {
response.setHeader("MyHeader","MyHeaderValue");
return "设置成功";
}