【JavaEE进阶】SpringMVC 响应

目录

🎍前言

[🌳 返回静态页面](#🌳 返回静态页面)

[🌲@RestController 与 @Controller 的关联和区别](#🌲@RestController 与 @Controller 的关联和区别)

[🌴返回数据 @ResponseBody](#🌴返回数据 @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 的源码

  1. value: 指定映射的URL
  2. method: 指定请求的method类型,如GET,POST等
  3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;
  4. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
  5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理
  6. 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 已经存在, 则覆盖旧的值

相关推荐
技术的探险家8 分钟前
R语言的文件操作
开发语言·后端·golang
violin-wang9 分钟前
SpringBoot的Bean-高级-第三方Bean以及Bean管理
java·spring boot·后端·bean
梅羽落12 分钟前
ideal jdk报错如何解决
java·经验分享·jdk·intellij-idea
珹洺14 分钟前
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
开发语言·前端·javascript·css·gitee·bootstrap·html
多多*14 分钟前
Sync底层字节码 monitorEnter和monitorExit 对象监视器
java·开发语言·windows·python·spring
爱掉发的小李14 分钟前
JavaWeb简单开发
java·spring·spring cloud·java-ee·tomcat·maven
缘友一世16 分钟前
Java 8 Stream API
java
计算机学姐17 分钟前
基于SpringBoot的健身房管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
爱上语文37 分钟前
MyBatis实现数据库的CRUD
java·开发语言·数据库·mybatis
qq_433618441 小时前
c++ chrono 操作 以及c语言的时间操作
开发语言·c++