文章目录 一、@RestController VS @Controller VS @ResponseBody 1.1 关于元注解 1.2 @Controller 1.3 @ResponseBody 1.4 @RestController 二、响应 2.1 Spring 对于响应的设置 2.2 返回静态页面 2.3 返回HTML代码片段 2.4 返回JSON 2.5 设置HTTP状态码 2.6 设置响应部分的Header 二、状态码
一、@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。