Spring MVC【返回数据与请求转发和重定向】

news/2024/5/21 0:35:45/文章来源:https://blog.csdn.net/m0_59735420/article/details/128126514

Spring MVC【返回数据与请求转发和重定向】

  • 🍎一. 返回数据
    • 🍒1.1 返回静态页面
    • 🍒1.2 返回一个非静态页面
    • 🍒1.3 返回text/html类型页面
    • 🍒1.4 返回JSON对象
    • 🍒1.5 实现计算器功能
    • 🍒1.6 使用ajax方式实现登陆功能
  • 🍎二.请求转发与请求重定向
    • 🍒2.1 请求转发(forward)
    • 🍒2.2 请求重定向(redirect)
  • 🍎三.请求转发和请求重定向有什么区别
    • 🍒3.1 定义不同
    • 🍒3.2 跳转方不同
    • 🍒3.3 数据共享不同
    • 🍒3.4 最终 URL 地址不同
    • 🍒3.5 代码实现不同
    • 🍒3.6 转发和重定向的选择

我们知道,默认请求下⽆论是 Spring MVC 或者是 Spring Boot 都是由控制器(Controller)返回的是视图(View)(xxx.html),⽽现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使⽤@ResponseBody 注解了

🍎一. 返回数据

🍒1.1 返回静态页面

我们先创建一个前端输出的文字的页面,最后来通过Controller来进行访问

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>hello,spring mvc</title><script src="index.js"></script>
</head>
<body><h1>Hello,Spring MVC.</h1>
</body>
</html>
 //访问静态页面@RequestMapping("/sayhi")public String sayHi(){return  "/hello.html";}

在这里插入图片描述

🍒1.2 返回一个非静态页面

@ResponseBody是修饰类或方法的注解,作用是返回当前类中或方法中的非静态页面

 //访问非静态页面@ResponseBody@RequestMapping("/sayhi")public String sayHi(){return  "/hello.html";}

在这里插入图片描述

🍒1.3 返回text/html类型页面

这个和返回静态页面的区别就是,需要用@ResponseBody,并且需要使用

前端标题符

  @RequestMapping("/m7")@ResponseBodypublic String method_7() {return "<h1>Hello,HTML~</h1>";}

在这里插入图片描述

🍒1.4 返回JSON对象

 @RequestMapping("/m8")@ResponseBodypublic HashMap<String, String> method_8() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;}

在这里插入图片描述

🍒1.5 实现计算器功能

可使⽤ postman 传递参数,或使⽤ form 表单的⽅式提交参数

前端⻚⾯:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>计算器示例</title>
</head>
<body>
<form action="http://localhost:8080/calc"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 ">
</form>
</body>
</html>

后端页面:

@RestController
public class CalcController {@RequestMapping("/calc")public String calc(Integer num1,Integer num2){if (num1 == null || num2==null) {if (num1 == null || num2 == null) return "<h1>参数错误!</h1><a href='javascript:history.go(-1);'>返回</a>";}return "<h1>结果:" + (num1+num2) +"</h1>";}
}

在这里插入图片描述
在这里插入图片描述

🍒1.6 使用ajax方式实现登陆功能

前端代码:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><script src="js/jquery-1.9.1.min.js"></script><title>Document</title><script>// ajax 提交function mysub(){// 1.判空var username = jQuery("#username");var password = jQuery("#password");if(jQuery.trim(username.val())==""){alert("请先输入用户名!");username.focus(); // 光标重制到此元素return;}if(jQuery.trim(password.val())==""){alert("请先输入密码!");password.focus(); // 光标重制到此元素return;}jQuery.ajax({url:"/user/login3",type:"POST",contentType:"application/json",data:JSON.stringify({"username":username.val(),"password":password.val()}),success:function(result){alert(JSON.stringify(result));}});}</script>
</head>
<body>
<div style="text-align: center;"><h1>登录</h1>用户:<input id="username"><br>密码:<input id="password" type="password"><br><input type="button" value=" 提交 " οnclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

后端代码:

 @RequestMapping("/login3")public HashMap<String,Object> login2(String username, String password){HashMap<String,Object> result = new HashMap<>();int state = 200; //状态码int data = -1;   //等于1,登陆成功,否则登陆失败String msg = "未知错误";//使用Spring提供的方法tringUtils.hasLength方法就可以同时判断username是否是"空"和null了if (StringUtils.hasLength(username) && StringUtils.hasLength(password) && username.equals("admin") && password.equals("admin") ){if ( username.equals("admin") && password.equals("admin")) {data = 1;msg = "";}else {msg = "用户名或密码错误";}}else {// 参数为空msg = "非法参数";}result.put("state",state);result.put("data",data);result.put("msg",msg);return result;}

在这里插入图片描述

🍎二.请求转发与请求重定向

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:
forward 是请求转发

redirect:请求重定向

forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如:
你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;
如果你妈妈让你⾃⼰去买,那么就是请求 redirect 重定向

🍒2.1 请求转发(forward)

代码示例:

// [请求转发]// 实现方法(1)@RequestMapping("/fw")public String myForward(){return "forward:/hello.html";}// 实现方法(2)@RequestMapping("/fw2")public void myFoward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getRequestDispatcher("/hello.html").forward(request,response);}

在这里插入图片描述

我们可以使用fiddler来进行抓包验证,我们可以发现请求转发客户端只是访问了一次,而转发的过程中是由服务器内部进行访问静态页面后返回数据给服务端的
在这里插入图片描述
在这里插入图片描述

🍒2.2 请求重定向(redirect)

代码示例:

  // [请求重定向]// 实现方法(1)@RequestMapping("/rd")public String myRedirect(){return "redirect:/hello.html";}// 实现方法(2)@RequestMapping("/rd2")public void myRedirect(HttpServletResponse response) throws IOException {response.sendRedirect("/hello.html");}

在这里插入图片描述

我们可以使用fiddler来进行抓包验证,我们可以发现请求1转发客户端是先访问服务器,而服务器内部会响应客户端的请求1,之后客户端会进行请求2,服务器进行进行访问静态页面后返回数据给客户端的,我们看到页面就了解了,重定向会将页面地址最后跳转到我们需要访问的静态页面地址
在这里插入图片描述

在这里插入图片描述

🍎三.请求转发和请求重定向有什么区别

请求转发和请求重定向主要区别,包含以下 5 点:
● 定义不同
● 跳转方不同
● 数据共享不同
● 最终 URL 地址不同
● 代码实现不同

🍒3.1 定义不同

请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端

请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向

🍒3.2 跳转方不同

请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端;
而请求重定向是客户端的行为,它们的交互流程
如下图所示:

在这里插入图片描述
在这里插入图片描述

🍒3.3 数据共享不同

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的

🍒3.4 最终 URL 地址不同

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的

请求转发:
在这里插入图片描述
请求重定向:
在这里插入图片描述

🍒3.5 代码实现不同

// [请求转发]// 实现方法(1)@RequestMapping("/fw")public String myForward(){return "forward:/hello.html";}// 实现方法(2)@RequestMapping("/fw2")public void myFoward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getRequestDispatcher("/hello.html").forward(request,response);}// [请求重定向]// 实现方法(1)@RequestMapping("/rd")public String myRedirect(){return "redirect:/hello.html";}// 实现方法(2)@RequestMapping("/rd2")public void myRedirect(HttpServletResponse response) throws IOException {response.sendRedirect("/hello.html");}

🍒3.6 转发和重定向的选择

1、重定向的速度比转发慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发

2、因为转发只能访问当前web的应用程序,所以不同web应用程序之间的访问,特别是要访问到另外一个web站点上的资源的情况,这个时候就只能使用重定向了

3、另外,重定向还有一个应用场景:避免在用户重新加载页面时两次调用相同的动作
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_239585.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】P1 算法简介

算法什么是算法正确与错误的算法算法可以解决什么问题本专栏有哪些算法什么是算法 算法 (Algorithm) 取某个值或集合作为 输入&#xff0c;并产生某个值或集合作为 输出。算法就是把输入转换为输出的计算&#xff0c;描述这个计算的过程来实现输入与输出的关系。 正确与错误的…

股票量化分析工具QTYX使用攻略——实盘交易信号监控(更新2.5.7)

搭建自己的量化系统如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。如何学会搭建自己的量化交易系统&#xff1f;边学习边实战&#xff0c;在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习&#xff0c;也可以用于实战炒股分析的量化…

插值算法基本原理

插值&#xff1a;数据处理的手段 将缺失数据补全处理 线性内插 拉格朗日插值法 牛顿插值 拟合&#xff1a;预测&#xff0c;寻找规律的手段 是插值的外延 插值算法&#xff1a;使用在现有的数据极少&#xff0c;不足以支撑分析的进行&#xff0c;这时就需要使用一些数学方法…

【Vue】Vue重写教室管理系统的前端网页V1(前后端分离)--20221222

项目说明 目的 练习并熟悉Vue2 的API&#xff0c;来为Vue项目做准备&#xff1a; 插值语法插槽props和data父子组件通信Ajax异步请求数据生命周期函数methods方法computed属性vue-router、路由守卫、query/params传参、编程函数式路由模拟后端服务器传送数据打包项目 需要加…

Python正在消亡?致命弱点是否会让Python被新语言取代?

被业界称为“瑞士军刀”的编程语言&#xff0c;可能会被更适合该任务的其他语言取代吗&#xff1f; 自从1990年代初Python发布以来&#xff0c;它引起了很多热议。当然&#xff0c;编程社区花了至少20年的时间才逐渐注意到它的存在&#xff0c;而当它一旦开始流行起来&#xf…

Apache DolphinScheduler 发布 3.1.2 版本,Python API 实现优化

点亮 ⭐️ Star 照亮开源之路https://github.com/apache/dolphinscheduler近日&#xff0c;Apache DolphinScheduler 发布了 3.1.2 版本。此版本主要基于 3.1.1 版本进行了 6 处 Python API 优化&#xff0c;19 处 Bug 修复&#xff0c;并更新了 4 个文档。其中较为重要的 Bug…

Doo Prime 提供高达 1000 倍杠杆,助您撬动无限机遇

2022 年 11 月 19 日&#xff0c;Doo Prime 正式将全部账户类型的可选杠杆从 1:500 上调至 1:1000 倍&#xff0c;提供更灵活的杠杆选择&#xff0c;让全球客户有机会以更少的资金撬动更高的潜在利润&#xff0c;进一步拓展投资机遇。 *备注&#xff1a;杠杆调整详情请参阅下文…

JavaDS1-时间复杂度空间复杂度

目录 1.算法效率 1.1.时间效率&#xff08;时间复杂度&#xff09;——衡量算法运行速度 1.2.空间效率&#xff08;空间复杂度&#xff09;——衡量算法所需额外空间&#xff08;如今不再特别关注&#xff09; 2.时间复杂度 2.1.概念 2.2.大O的渐进表示法 2.2.1.O(F(n))…

学到羊之Kafka

1 kafka 是啥 Kafka 是一款开源的消息引擎系统&#xff0c;用来实现解耦的异步式数据传递。即系统 A 发消息给到 消息引擎系统&#xff0c;系统 B 通过消息引擎系统读取 A 发送的消息&#xff0c;在大数据场景下&#xff0c;能达到削峰填谷的效果。 2 Kafka 术语 Kafka 中的分…

day28【代码随想录】回溯之组合、组合总和|||、电话号码的字母组合

文章目录前言一、组合&#xff08;力扣77&#xff09;剪枝优化二、组合总和 III&#xff08;力扣216&#xff09;剪枝优化三、电话号码的字母组合&#xff08;力扣17&#xff09;总结前言 1、组合 2、组合总和||| 3、电话号码的字母组合 一、组合&#xff08;力扣77&#xff0…

解析 Navicat 最受欢迎的功能 | SQL 查询编辑器与 SQL 创建工具

近期发起的线上投票调查中&#xff0c;我们很高兴地看到&#xff1a;SQL 查询编辑器、SQL 创建工具已成为用户最常用的功能之一&#xff0c;并且深受用户欢迎&#xff01;在人类社会发展的历史长河中&#xff0c;离不开工具的演进与发展。而 Navicat 作为领先的数据库管理开发工…

【Pandas入门教程】如何读取和写入表格数据

如何读取和写入表格数据 来源&#xff1a;Pandas官网&#xff1a;https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 文章目录如何读取和写入表格数据导包【1】如何读取和写入表格数据【2】小结导包 import pandas as pd数据介绍&#xff1a; 使用存…

python--可重用的登录注册系统(上)

文章目录预期目标一、基本逻辑设计数据库模型二、前端界面设计与优化完善登录的视图函数三、session会话与登录的视图函数四、将项目上传到远程仓库预期目标 实现注册&#xff08;邮箱、手机、qq、微信&#xff09; 登录 注销等功能 路由配置 视图配置 数据库模型 模板&#xf…

【云服务器 ECS 实战】一文掌握弹性伸缩服务原理及配置方法

1. 弹性伸缩概述2. 实现模式3. 基于 GRE 实现 VPC 的互联4. 弹性伸缩服务的配置使用4.1 创建伸缩组4.2 伸缩配置4.3 创建伸缩规则1. 弹性伸缩概述 弹性伸缩&#xff08;Auto Scaling&#xff09;就是自动为我们调整弹性计算资源大小&#xff0c;以满足业务需求的变化&#xff…

机器学习之回归

回归算法 线性回归 求解线性回归方法 正规方程梯度下降 迭代 API sklearn.linear_model.LinearRegression 正规方程优化fit_intercept 是否计算偏置量&#xff0c;没有的化经过原点属性 coef_ 回归系数intercept_ 偏置量 sklearn.linear_model.SGDRegressor 使用随机梯度…

前端自动化测试精讲

单元测试 端对端测试 持续集成方案&#xff0c;在项目中落地前端自动化测试 作者介绍 祯民&#xff0c;字节跳动前端开发工程师&#xff0c;掘金小册《SSR实战&#xff1a;官网开发指南》作者&#xff0c;公众号「祯民讲前端」作者。曾负责 抖音前端技术团队官网 和 字节官网…

逻辑回归、激活函数sigmoid、损失及优化、案例代码实现

一、逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;&#xff1a;是机器学习中的一种分类模型&#xff0c;是一种分类算法&#xff0c;与回归之间有一定的联系&#xff0c;由于算法的简单和高效&#xff0c;在实际中应用非常广泛 应用场景&#xff1a;广告点击…

创新京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了

导言 算法是一门学问&#xff0c;但却总遭到一些程序员的冷落。现在的开发人员&#xff0c;更热衷于编程语言的修炼&#xff0c;以应付面试需求时的需要&#xff0c;所以对算法的学习&#xff0c;稍许忽略了些。实际上&#xff0c;近些年来&#xff0c;各互联网公司对于算法的…

大学宿舍四位舍友皆为软测,3年后的现状~

笔者最近收到测试员好友小H的分享&#xff0c;临年关&#xff0c;他参加了一场大学舍友毕业3年后的聚会&#xff0c;感慨良多。 从2019年至今&#xff0c;这已经是毕业的第3个年头了。小H的寝室大多来自五湖四海&#xff0c;毕业后&#xff0c;能够相聚的时间也少之又少&#…

linux命令date

linux命令date 文章目录linux命令date一、date二、使用&#xff08;一&#xff09;结合格式&#xff0c;格式输出数据&#xff08;二&#xff09;结合选项&#xff08;options&#xff09;一、date date命令可以获取到当前系统时间&#xff0c;主要是为了shell脚本的 date用法…