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

news2024/12/23 8:57:01

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")
    @ResponseBody
    public String method_7() {
        return "<h1>Hello,HTML~</h1>";
    }

在这里插入图片描述

🍒1.4 返回JSON对象

 @RequestMapping("/m8")
    @ResponseBody
    public 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.coloradmin.cn/o/111777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126笔记十一:RTMP多路推流

若该文为原创文章,转载请注明原文出处。 一、介绍 在前面,已经了解了单路推流的方式了,也成功的推流和接收到RTMP流,我们把单路扩展成多路,实际方法是和单路相同的,只是多增加了参数和线程数,把ffmpeg参数多复制几路,推流线程多开几个,那就实际了多路推的方式了,具…

视图便捷类(QListWidget,QTableWidget,QTreeWidget)

常见的视图便捷类&#xff1a; QListWidget 列表QTableWidget 表格QTreeWidget 树列表便捷类&#xff1a;QListWidget &#xff08;继承自QListView&#xff09; 构造函数&#xff1a; 常用函数: addItem()添加项目addItems()添加多个项目count()项目的数量currentItem()…

微内核、宏内核、内核模块、printk

文章目录一、微内核和宏内核二、内核模块三、内核模块code四、Makefile注意注&#xff1a;&#xff0c;?, : 区别五、prink查看prink打印优先级修改printk的打印优先级六、内核模块参数module_param与module_param_array宏定义的使用七、内核符号表--全局共享函数接口与变量1.…

2022年最新中国科学院期刊分区表变化 | 生物类、医学类

fenqu❝早上刷到了新发布的《2022年中国科学院文献情报中心期刊分区表》&#xff08;https://mp.weixin.qq.com/s/QVfwnGPCjvOaLtBvGM184g&#xff09;&#xff0c;今天利用有限的非卧床时间浅爬了一下生物和医学大类2022和2021年的数据&#xff0c;做个简单的对比。&#xff0…

学习记录-mybatis+vue+elementUi实现批量删除

老规矩&#xff0c;还是从后端到前端还是分为四步骤 步骤一 ①写SQL语句 mapper接口代码&#xff1a; /*** 批量删除* param ids*/void deleteByIds(Param("ids") int[] ids);实现语句&#xff1a; <delete id"deleteByIds">deletefrom tb_brandwh…

本周推荐 | 设计模式在淘宝营销价格体系的实践

推荐语&#xff1a;本文详细描述责任链、中介者、适配器等多种设计模式在淘宝营销价格服务中的应用&#xff0c;从而实现了一套可扩展性的架构&#xff0c;应对灵活多变营销价格需求。——大淘宝技术研发工程师 小枫每年淘宝都有双11、双12等大促&#xff0c;我们价格服务小组的…

【车载开发系列】UDS诊断---常见的ISO标准集合

【车载开发系列】UDS诊断—常见的ISO标准集合 常见的ISO标准集合【车载开发系列】UDS诊断---常见的ISO标准集合一.前言二.基于CAN总线ISO1&#xff09;ISO118982&#xff09;ISO115193&#xff09;ISO15765三.UDS诊断1&#xff09;ISO142292&#xff09;ISO14229系列规范四.CAN…

我国余热发电行业现状:政策及企业积极性双管齐下 市场发展潜力大

根据观研报告网发布的《中国余热发电行业现状深度研究与发展前景预测报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;余热发电是指利用生产过程中多余的热能转换为电能的技术。余热发电技术可以回收利用如水泥、玻璃、钢铁、冶金等行业的余热资源&#xff0c;将余热…

深入浅出synchronized关键字

前言 无论在日常工作还是面试过程中&#xff0c;synchronized关键字作为并发场景下的操作&#xff0c;是一定要掌握的&#xff0c;本文从synchronized的使用方式、原理及优化三个方面&#xff0c;对synchronized关键字作一个系统化的说明。 使用方式 synchronized主要有三种…

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…

HashMap1.7和1.8源码解析

1.HashMap &#xff08;1&#xff09;数据结构 在JDK1.7中&#xff0c;HashMap中的数据结构是数组单链表的组合&#xff1b;在JDK1.8中的HashMap存储结构是由数组、链表、红黑树这三种数据结构形成。 &#xff08;2&#xff09;JDK1.7中HashMap源码分析 &#xff08;2.1&am…

Portal门户常见宕机或性能低问题分析与七大解决之道

不论使用什么产品构建门户&#xff0c;只要是基于Java技术的&#xff0c;就很容易宕机或出现性能低的问题。因为Portal产品比较复杂&#xff0c;且集成的数据特别多&#xff0c;架构特别复杂&#xff0c;涉及到的数据通信特别多。宕机或性能低也通常是用户较为头疼的问题。经常…

excel文本函数应用:单元格中的数字和字母,如何判断?

文本字符是Excel中除了数字以外的另一种非常常用的数据类型&#xff0c;Excel也提供了大量的文本函数。利用这些函数我们可以用来判断字符串开头是否为数字、字符串是否同时包含了数字和英文、字符串是否包含了指定字符&#xff0c;可以用来转换英文字母的大小&#xff0c;可以…

Java基础之Stream的使用078

1. Stream 的使用 Stream 是什么&#xff1f; Stream 是数据渠道&#xff0c;用于操作数据源&#xff08;数组、集合等&#xff09;所生成的元素序列。 Java8两大最为重要的改变就是 Lambda表达式 与 Stream API&#xff0c;这两种改变的引入带来的是新的抽象方式 &#xff08…

目标检测之Fast RCNN概述

基本原理 Fast Rcnn主要步骤为 利用SR算法生成候选区域利用VGG16网络进行特征提取利用第一步生成的候选区域在特征图中得到对应的特征矩阵利用ROI pooling将特征矩阵缩放到相同大小并平展得到预测结果 相对于RCNN的优化 主要有三个改进 不再将每一个候选区域依次放入CNN网络…

【基于通道-空间注意的高分辨率锐化】

Channel–spatial attention-based pan-sharpening of very high-resolution satellite images &#xff08;基于通道-空间注意的很高分辨率卫星影像全色锐化&#xff09; 全色锐化处理旨在生成新的合成输出图像&#xff0c;其保留全色的空间细节和多光谱图像输入的光谱细节。…

【服务器端程序的演进过程】

目录 1 服务器端程序的演进过程 阶段一:静态服务器 阶段二:普通动态服务器 阶段三: 以用户共享内容为主的互联网生态 阶段四: 微服务时代(有高并发需求或特征的网站) 2 Java服务器项目分类 3 微服务概述 3.1 什么是微服务 3.2 为什么需要微服务 3.3 怎么搭建微服务项…

C#获取计算机详细的软件和硬件信息

利用System.Management提供的类可以用于读取本地计算机设备的各种数据&#xff0c;包括操作系统、软件、硬件的各种详细信息&#xff0c;内容很丰富。 System.Management的命名空间下&#xff0c;ManagementObjectSearcher类用于查询特定类型的设备&#xff0c;ManagementObjec…

转行做“程序员”很难?这里有几个建议...

“是什么&#xff1f;为什么&#xff1f;怎么样&#xff1f;”的灵魂三连问在我们生活中比比皆是&#xff0c;目的是为了清晰思考和看到事物的本质。对于编程学习也是一样&#xff0c;需要带着疑问从本质上去学习编。 本人是某985高校的本硕连读&#xff0c;非计算机科班出身&…

利器 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

1080469 14.7 KB 上两篇文章介绍了自动遍历的测试需求、工具选择和 AppCrawler 的环境安装、启动及配置文件字段基本含义&#xff0c;这里将以实际案例更加细致的说明配置文件的用法和一些特殊场景的处理。 下面我们继续之前的例子&#xff0c;在雪球搜索框输入搜索内容后的页面…