【JavaEE进阶】SpringMVC 响应
目录
🎍前言
🌳 返回静态页面
🌲@RestController 与 @Controller 的关联和区别
🌴返回数据 @ResponseBody
🎋返回HTML代码片段
🍃返回JSON
🍀设置状态码
🎄设置Header
🚩设置Content-Type
🚩设置其他Header
🎍前言
在我们前⾯的代码例⼦中,我们返回的是数据,并不是页面
Http响应结果可以是数据,也可以是静态页面,也可以针对响应设置状态码,Header信息等.
🌳 返回静态页面
首先先创建一个静态页面,前端代码位置如下:
注意:创建好前端代码之后,右侧有对应的浏览器访问,不要通过此处访问
编写前端代码:
假如此时点击右侧的Chrome浏览器访问:观察浏览器的中http请求,这个请求表示去找到了本地的63342端口号,这个端口号是idea进程,也就是说它是把这个请求交给了idea,通过idea去访问
正确访问方式:运行代码,通过这样的方式来访问,这是把请求交给了Tomcat
这个访问路径是从根目录往下开始访问,static就是根目录,若是一下这种路径就是 /aa/index.html
上述一系列过程也是在访问前端页面,并不是通过后端返回页面,接下来就开始讲述后端返回页面
返回上述的index.html页面
代码:通过接口来返回页面
发送请求:我们希望返回的是页面,当前确实一个字符串,显然不符合预期
这里的后端的代码和以前的代码就不一样了,想要返回一个静态界面。我们这里需要将 @RestController 改为 @Controller,并且在需要返回的页面前加上 /
代码:
index.html路径:
发送请求:此时就返回成功了
若在返回页面前不加上斜杠(/),会报404:
发送请求:
改变index.html的路径:
发送请求:还是上述未加斜杠(/)的代码,此时发现返回成功了
区别:
若返回页面中加上 / ,可理解为是一个绝对路径,不加 / 可理解为是一个相对路径,相对与当前response所在的路径,建议加上 / .
上述还把@RestController 改为 @Controller,那不改行不行?
代码:发现还是不行
那么现在就有问题了,在前面的文章中写返回数据的时候用的是 @RestController 注解,而现在返回静态界面却用的 @Controller 。它们之间有什么区别和联系呢?
🌲@RestController 与 @Controller 的关联和区别
在前面的文章说,当时把@RestController简单的理解为是打个标签,其实这里的@Controller也可简单的理解为也是打了个标签,只是打的不同的标签。
在前面讲述了MVC模式,后端会返回视图,这是早期时的概念
随着互联⽹的发展, ⽬前项⽬开发流⾏"前后端分离"模式, Java主要是⽤来做后端项⽬的开发,所以也就不再处理前端相关的内容了
MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.
所以前⾯使⽤的@RestController表示返回数据,当前的@Controller表示返回视图
查看@RestController的源码:发现在里面使用了@Controller
@RestController = @Controller + @ResponseBody
@ResponseBody表示响应正文,也就是返回数据,那么@RestController能够返回数据就是@ResponseBody起到的作用。
所以之前的代码中的@RestController完全的可以替换为@Controller + @ResponseBody,那么相当于是@Controller这个注解才是打了个标签(当前对象交给了Spring进行管理)。
- @Controller : 定义⼀个控制器,Spring 框架启动时加载, 把这个对象交给Spring管理.
- @ResponseBody :定义返回的数据格式为⾮视图,返回⼀个test /html信息
🌴返回数据 @ResponseBody
@ResponseBody 既是类注解,又是方法注解
如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据.
也就是说:在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.
同样,如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解,也就是当前类下所有的⽅法返回值做为响应数据
如果⼀个类的⽅法⾥,既有返回数据的,⼜有返回⻚⾯的,就把@ResponseBody 注解添加到对应的⽅法上即可
代码:
发送请求对比结果:
由于现在后端不会管前端,所以一般还是返回数据
🎋返回HTML代码片段
由于返回的是前端代码,只能当做数据来返回
代码:
发送请求:
通过Fiddler抓包查看响应信息:观察发现Content-Type类型 为 text/html,返回的是html代码
响应中的 Content-Type 常⻅取值有以下⼏种:
- text/html : body 数据格式是HTML
- text/css : body 数据格式是 CSS
- application/javascript : body 数据格式是 JavaScript
- application/json : body 数据格式是 JSON
注意:
- 如果请求的是js⽂件, Spring MVC会⾃动设置Content-Type为application/javascript
- 如果请求的是css⽂件, Spring MVC会⾃动设置Content-Type为 text/css
🍃返回JSON
Spring MVC 也可以返回JSON,返回JSON,首先它也是返回数据
后端⽅法返回结果为对象
代码:
发送请求:
Fiddler抓包:Content-Type 为 application/json,即后端返回的是对象,Spring会自动转为Json(返回稍微有点结构的,比如对象,Map等)
🍀设置状态码
Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
代码:
发送请求:
Fiddler抓包查看响应:
注意状态码不影响页面的显示,并不是说设置了404页面就会报404。
🎄设置Header
Http响应报头也会向客⼾端传递⼀些附加信息,⽐如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
所以我们先来看 @RequestMapping 的源码
- value: 指定映射的URL
- method: 指定请求的method类型,如GET,POST等
- consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
- Params: 指定request中必须包含某些参数值时,才让该⽅法处理
- headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求
🚩设置Content-Type
未设置Content-Type,返回一个Json,
代码:
发送请求:
Fiddler抓包查看响应:Content-Type类型为text/html,即返回的是字符串,并非JSON,对于前端而言是不一样的,一个是字符串,一个是对象
设置Content-Type:
代码:
发送请求:设置之后浏览器显示结果就是JSON
Fiddler抓包查看响应:
还可以设置它的编码:直接Content-Type的值后面,可理解为它也是Content-Type的值
代码:
Fiddler抓包查看响应:
🚩设置其他Header
设置其他Header的话, 需要使⽤Spring MVC的内置对象
HttpServletResponse 提供的⽅法来进⾏设置,这里也可以设置Content-Type,和上述是一样的
代码:
发送请求:
Fiddler抓包查看响应:
void setHeader(String name,String value)设置⼀个带有给定的名称和值的 header. 如果name 已经存在, 则覆盖旧的值