Spring MVC -- 响应

在这里插入图片描述

T04BF

????专栏: 算法|JAVA|MySQL|C语言

???? 今天你敲代码了吗

文章目录

  • 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";
    }

在这里插入图片描述

对于上述两个改动的解释:

  1. “index"改为”/index"

如果加上"/“,那么此时的路径就是"staitc/index”;如果没有"/“,那么此时的路径就是类路径加上文件名,即"static/response/index.html”

  1. 将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 "设置成功";
}

在这里插入图片描述

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

???? 今天记得敲代码
上一篇:STM32、Spring Boot、MQTT和React Native:智能停车管理系统的全栈开发详解(附代码示例)


下一篇:springboot项目 导入 maven坐标 错误 Could not transfer artifact XXX