Spring MVC(响应 + 状态码)

一、@RestController VS @Controller VS @ResponseBody

1.1 关于元注解

  1. 什么是元注解:可以被其他注解使用,用来描述该注解基本信息的注解
  2. 有什么
    • @Target:该注解可以修饰什么,指应用范围
      • ElementTYPE.TYPE:表示该注解可以修饰【类和接口】
      • ElementTYPE.METHOO:表示该注解可以修饰【方法】
    • @Retention:注解的生命周期
      • SOURCE:代码阶段,表示该注解只活在代码阶段,一编译注解就消失了
      • CLASS:编译阶段
      • RUNTIME:运行阶段
    • @Document:文档。我们去编译时,是否要保留JDK、注释之类的东西

1.2 @Controller

  1. 作用
    • 让Spring帮我们管理代码:Spring是一个容器,容器就是可以放东西的。该注解可以让我们把该代码交给Spring,由Spring帮我们管理(后续如果人要访问对应路径,Spring能意识到)
    • 返回视图:视图就是指前端页面

1.3 @ResponseBody

  1. 为什么要在方法上加上这个注解:因为现在用的是@Controller,即返回视图,此时就会去寻找“这是返回数据”这个视图,但是static里并没有该视图,故如果不加@ResponseBody表示这是返回数据,就会报404错误
  2. 关于字符集设置:Spring已经帮我们进行了字符集相关的处理,返回中文不需要再像Servlet一样,设置字符集了
@Controller
@RequestMapping("/param")
public class ParamController {
    @ResponseBody
    @RequestMapping("/responseData")
    public String responseData(){
        return "这是返回数据";
    }
}

在这里插入图片描述

1.4 @RestController

  1. 场景
    • 在前后端未分离之前,根据MVC架构,我们确实是使用@Controller注解返回视图。但随着时代发展,前后端分离,后端程序员不再进行相关的前端开发,只需要返回前端需要的数据即可
    • 返回数据就是依靠@ResponseBody注解,我们又同时需要@Controller把代码给Spring管理,这俩加起来就是@RestController注解
  2. 作用:把代码交给Spring管理(@Controller) + 返回数据(@ResponseBody)
    • 类注解情况:修饰的类下的方法全部返回数据
    • 方法注解情况:修饰的方法全部返回数据
      在这里插入图片描述
  3. 其他写法:用两个注解写
    • 当存在多个注解时,注解的顺序没有关系,可以随意写
      在这里插入图片描述

二、响应

2.1 Spring 对于响应的设置

  1. 不用手动设置返回类型:我们不需要像使用Servlet那样,专门对要返回的类型进行描述,Spring已经帮我们处理好了,这是依靠于Spring的解析器。
  2. Spring解析器:Spring会有各种解析器用来判断要返回的数据是哪个类型,能不能转换,如果该解析器无法转换就会换下个解析器,直到能选定一个为止。
  3. 落实到具体类型上:可以自己尝试测试一下
    • 当我们的接口返回的是【String/Integer之类】的,content-Type是【text/html】
    • 当我们的接口返回的【是对象/Map之类】的,content-Type是【application/json】

2.2 返回静态页面

  1. 静态页面放在哪:static目录下
  2. 关于访问静态页面:static目录下的静态文件可以直接访问
    • 直接打开该文件:相当于是用文件资源管理器来打开
    • 利用网络来访问:使用浏览器来访问,输入【127.0.0.1:8080/index.html】 类似的路径即可
  3. 如何返回
    • 注解:因为要返回视图而非数据,所以使用@Controller注解
    • 请求方法:Get
    • 返回的文件:文件前面要加“/”
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/index")
    public String index(){
        return "/index.html";
    }
}

2.3 返回HTML代码片段

  1. 方法:返回的数据中如果包含html标签,会直接被浏览器解析
  2. 如果只是想展示这串数据:用HTML的方法转义<>
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/returnHTML")
    public String returnHTML(){
        return "<h1>返回了h1标签</h1>";
    }
}

2.4 返回JSON

  1. 方法:当方法返回的数据是对象/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状态码

  1. 设置的HTTP状态码不影响页面的展示
  2. 设置方法:使用Servlet原生的方法(设置HTTP状态码操作不常用,故而Spring未提供注解)
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response){
        response.setStatus(404);
        return "ok";
    }
}

2.6 设置响应部分的Header

  1. 使用场景:虽然我们可以通过主体传大部分数据,使用Header传递数据的场景不是很多。但在一些特殊场景下,还是需要用的,比如鉴权(根据用户权限提供服务)
  2. 如何设置:@RequestMapping 注解中的produces属性
    • 注意虽然能设置,但也是要求【能转】的,不然会报错
@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping(value = "/setHeader", produces = "application/json;charset=utf-8")
    public String setHeader(){
        return "{‘username': 'zhangsan'}";
    }
}
  1. 关于utf8字符集的写法:不分大小写,utf8,utf-8、UTF-8、UTF8这四种方法都可以写
  2. 关于@RequestMapping注解
    在这里插入图片描述

二、状态码

2.1 HTTP 状态码

  1. 由谁定义:由HTTP返回,表示HTTP状态
  2. 与页面的关系:与页面能否正常展示无关
    • 我们可以在后端手动设置状态码,此时哪怕设置的状态码是404,只要代码正确,页面也依旧能正常展示
  3. 分类
    • 2XX:成功
    • 3XX:重定向
    • 4XX:客户端错误
    • 5XX:服务端错误

2.2 业务状态码

  1. 由谁定义:由后端自定义,我们通常会用一个其他的字段来表示
  2. 作用:使前端可以根据不同的业务状态码执行不同的操作
    • 解析:在HTTP响应成功的情况下,我们可以把业务的响应结果分为不同的状态。比如登录时,密码正确返回200,密码错误返回-1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值