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


电子签名:上嘉路

相关推荐
小池先生3 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb6 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng9 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随17 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg26 分钟前
gitlab代码推送
java
hanbarger1 小时前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园1 小时前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造