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


电子签名:上嘉路

相关推荐
Chen-Edward7 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
云创智城-yuncitys7 小时前
SpringCloud 架构在智慧交通路侧停车系统中的实践:从技术落地到城市级服务升级
spring·spring cloud·架构·智慧城市·停车系统·充电系统源码
陈小桔8 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!8 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36788 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July8 小时前
Hikari连接池
java
微风粼粼9 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad9 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
天若有情6739 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术9 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap