Spring MVC 详解(2)

目录

[3. 返回数据的功能](#3. 返回数据的功能)

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

[3.2 请求转发 VS 请求重定向](#3.2 请求转发 VS 请求重定向)


前言

上一篇文章已经介绍了 Spring MVC 框架的两个功能,和前端建立连接的功能和从前端获取参数的功能,还有最后一个功能就是 输出数据的功能。

3. 返回数据的功能

返回的数据大致可以分为三类:

|--------------------|
| 1. 静态页面 |
| 2. text / html |
| 3. 返回 json 对象 |

3.1 返回静态页面

要返回一个静态页面首先要有一个静态页面,之后将这个静态页面返回给前端,如下代码:

注:++创建一个静态页面需要在 static 目录下新建 html 文件,static 目录下就是专门存静态页面的。++

之后在 Controller 层新建一个 TestController类,实现将这个静态页面返回给前端:

注:++(1)在类上加的注解是 @Controller ,而如果加 @RestController,此时下面代码返回的是一个字符串。++

++(2)在返回静态页面之前需要在 index.html 前加一个 " / ",如果不加斜杠此时无法正确的访问到返回的静态页面;加斜杠之后默认在 跟目录(static)下面找静态页面,不加斜杠默认是从 /test 目录下找 index.html。++

java 复制代码
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TextController {
    @RequestMapping("/test/getIndex")
    public Object getIndex() {
        return "/index.html";
    }
}

运行结果:

3.2 请求转发 VS 请求重定向

上述方式就是请求转发,请求的是一个接口的地址,而后后端返回的是一个页面,所以请求转发就是 将请求做转发的,而请求重定向就是返回一个链接,然后前端再根据后端返回的链接地址 再去重定向别的地址。

就例如:你交给我做一件事,我说好然后就帮你去做,尽管我做不了,但是我去求助别人然后最终帮你完成了这件事,这就是请求转发,但是请求重定向不一样,你还是交给我一件事,我还是能力有限,做不了,此时我告诉你谁可以帮你完成这件事,你又去问别人,此时就是请求重定向。

如下代码演示请求转发和请求重定向:

请求转发:

java 复制代码
//请求转发
    @RequestMapping("/forWard")
    public String forWard() {
        return "forward: /index.html";
    }

请求重定向:

java 复制代码
//请求重定向
    @RequestMapping("/redirect")
    public String redirect() {
        return "redirect:/index.html";
    }
    @RequestMapping("/redirect2")
    public void redirect2(HttpServletResponse response) throws IOException {
        response.sendRedirect("https://www.baidu.com");
    }

上述两种方式都是请求重定向的写法,一个是可以通过注解来实现,一个可以通过 Servlet API来实现 请求重定向。

可以看到请求转发和请求重定向的第二个区别:当访问 一个接口的地址的时候,请求转发中的 url 地址不会改变,但是请求重定向中的地址改变了,原因就是请求转发是 后端帮我们实现的,但是请求重定向后端会返回一个链接(重定向到另一个 url)然后让浏览器去自动访问。

除此之外,请求转发和请求重定向还有一个区别:数据共享不同,请求转发是服务器帮忙做的转发,在整个执行流程中,浏览器只需要发送一次请求,所以整个交互的过程中使用的都是同一个请求和响应,所以返回的数据是和服务器共享的,但是请求重定向相当于是浏览器发送了两次不同的请求,所以请求返回的数据是不经过后端的,所以两次请求的数据是不共享的。

相关推荐
嘻哈∠※4 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7985 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2586 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息8 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒8 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了8 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道9 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950639 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路10 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq