Spring Web MVC入门(下)

1. 响应

1.1 返回静态页面

创建前端页面,如下图所示:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index页面</title>
</head>
<body>
    Hello,Spring MVC,我是Index⻚⾯
</body>
</html>

后端代码如下:

java 复制代码
@RestController
@RequestMapping("/user")
public class ResponseController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }

访问结果如下结果:

我们发现,直接返回了一个字符串,那么就说明Spring MVC没有识别我们返回的是一个前端页面,那么怎么让它识别出来是 /index.html 文件,而不是字符串呢?就需要把注解@RestController改为@Controller,正确代码如下:

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }
}

访问127.0.0.1:8080/user/index,我们可以得到我们想要的页面,如下所示:

1.1.1 @RestController 和 @Controller

下面来讲解一下@RestController 和 @Controller之间的关联和区别

之前所说的MVC模式中后端会返回视图,这是早期的概念,但随着互联网的发展,项目流行 "前后端分离" 模式,Java主要用来做后端项目,所以也就不再处理前端相关的内容了。

如上图,MVC也随之发生改变,View不再返回视图,而是返回显示视图所需要的数据,所以前面使用的@RestController返回的就是数据。

@RestController = @Controller + @ResponseBody

@Controller:定义了一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。

@ResponseBody:定义返回数据格式为非视图,返回一个text / html信息。

源码如下:

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

故此可知: @RestController 或 (@Controller + @ResponseBody)注解返回的是前端所需要的数据,@Controller 返回的是视图。

1.2 返回数据 @ResponseBody

@ResponseBody 表示返回数据,代码如下:

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
  @ResponseBody
   @RequestMapping("/index1")
   public String index1() {
       return "/index.html";
     }

}

因为加上了@ResponseBody注解,所以index方法就会把 "/index.html" 当做一个数据返回给前端,浏览器页面如下:

@ResponseBody作用在类和方法的情况说明:

@ResponseBody作用在类上,表示该类上的所有方法,返回的都是数据。

@ResponseBody作用在方法上,表面该方法返回的是数据。

1、也就是说明在类上添加注解@ResponseBody,相当于该类上所有的方法都添加了注解@ResponseBody。

2、因为@RestController = @Controller + @ResponseBody,所以如果类上添加了注解@RestController,相当于该类的所有方法都添加了注解@RestController。

3、如果一个类里面,既要返回数据,又要返回视图,那么就使用注解@Controller添加在该类上,然后需要返回数据的方法添加注解@ResponseBody,返回视图的方法就不同管它。

一个方法是返回视图,一个方法是返回数据,代码如下:

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        return "/index.html";
    }

    @ResponseBody
    @RequestMapping("returnData")
    public String returnData() {
        return "该方法返回数据";
    }

}

浏览器分别访问http:127.0.0.1:8080/user/index 和http:127.0.0.1:8080/user/returnData,页面分别如下:

如果returnData方法删去注解@ResponseBody,代码如下:

java 复制代码
 @RequestMapping("returnData")
    public String returnData() {
        return "该方法返回数据";
    }

访问结果如下:

404错误码,因为该类是注解@Controller修饰的,访问该类的方法默认返回的是视图,程序就会认为需要返回视图(returnData方法没加@ResponseBody注解),然后根据内容进行查找文件,但查询不到,也就是路径不存在,所以报错404。

1.3 返回HTML代码片段

后端返回数据时,如果数据有HTML代码,也会被浏览器解析,代码如下:

java 复制代码
 @ResponseBody
    @RequestMapping("/reml")
    public String returnHtml() {
        return "<h1> Hello, HTML</h1>";
    }

访问结果如下:

通过fiddler观察Content-Type,如图:

响应中的Content-Type常见的取值:
1、text / html:body数据格式是 HTML。

2、text / css:body数据格式是 CSS。

3、application / Javascript:body数据格式是 JavaScript。

4、application / json:body数据格式是 JSON。

如果请求的是js文件,Spring MVC会自动设置Content-Type为 application / Javascript。

如果请求是css文件,Spring MVC会自动设置Content-Type为 text / css。

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0\&vd_source=866da5be2ef0ddd213b053523da53138


电子签名:上嘉路

相关推荐
即将进化成人机1 分钟前
springboot项目创建方式
java·spring boot·后端
教练、我想打篮球10 分钟前
117 javaweb servlet+jsp 项目中修改了 数据库连接配置, 却怎么都不生效
java·servlet·jdbc·jsp
你不是我我12 分钟前
【Java 开发日记】我们来说一说 Redis IO 多路复用模型
java·开发语言·redis
SadSunset14 分钟前
(13)复杂查询
java·笔记·架构·mybatis
浩瀚地学15 分钟前
【Java】ArrayList
java·开发语言·经验分享·笔记
阿杰同学23 分钟前
Java 设计模式 面试题及答案整理,最新面试题
java·开发语言·设计模式
这样の我23 分钟前
java 模拟chrome指纹 处理tls extension顺序
java·开发语言·chrome
Genevieve_xiao28 分钟前
【数据结构与算法】【xjtuse】面向考纲学习(下)
java·数据结构·学习·算法
4311媒体网30 分钟前
php和c++哪个更好学?C++难学吗?
java·c++·php
毕设源码-朱学姐35 分钟前
【开题答辩全过程】以 基于SpringBoot的流行音乐网站的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端