【Spring MVC】学会这些你就会利用Spring Boot进行前后端交互了,美滋滋,距离编程世界更近一步了,何乐而不为呢 ? ? ?

news2024/11/16 6:03:01

前言:
大家好,我是良辰丫,! ! !💌💌💌

🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述

目录

  • 1. 获取 Request 和 Response 对象
  • 2. servlet获取cookie
  • 3. Spring Boot注解方式获取cookie
  • 4. Spring Boot注解方式获取header
  • 5. 建立session信息
  • 6. 获取session信息
  • 7. 关于@ResponseBody注解
  • 8. 返回一个json对象
  • 9. 简单的前后端交互
  • 10. 前后端登录页面
  • 11. 请求转发与请求重定向

1. 获取 Request 和 Response 对象

  • Spring MVC(Spring Web) 内置了 HttpServletRequest 和 HttpServletResponse,也就是前端不需要传相关的参数.
  • 在servlet中我们就接触到了HttpServletRequest 和 HttpServletResponse,那么我们为什么要学习这呢? 我们是要学习网络通信,一切网络通信都基于http协议.
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/user11")
public class User11 {
    @GetMapping("/getparam")
    public String getParam(HttpServletRequest req) {
        return req.getParameter("username");
    }
}

在这里插入图片描述

通过这种方式我们就可以得到相关的参数.

2. servlet获取cookie

  • 虽然是servlet获取cookie,但是我们的Spring MVC项目中依然可以运行,因此呢,我们没有必要专门去创一样maven项目.
  • 我们先在我们的浏览器里面构造cookie,这样获取cookie的时候才有一定的效果.

在这里插入图片描述

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

@Slf4j
@RequestMapping("/user12")
@RestController
public class User12 {
    @RequestMapping("/getck")
    public String getCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        for (Cookie item : cookies) {
            log.error(item.getName() + ":" + item.getValue());
        }
        return "已经获取到cookie";
    }
}

在这里插入图片描述

接下来看我们的idea的控制台已经得到了cookie信息.

在这里插入图片描述

3. Spring Boot注解方式获取cookie

在这种方式我们中我们可以根据key值获取我们指定的cookie的value值,获取单一的cookie,而不是把所有的cookie都获取出来.

package com.example.demo;

import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user13")
@RestController
public class User13 {
    @RequestMapping("/getck")
    public String getCookie2(@CookieValue("qwer") String val) {
        return "Cookie的Value : " + val;
    }
}

在这里插入图片描述

4. Spring Boot注解方式获取header

package com.example.demo;

import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/getua")
public class GetUA {
    @RequestMapping("/ua")
    public String getUA(@RequestHeader("User-Agent") String userAgent) {
        return userAgent;
    }
}

  • UA属于我们的header里面的信息,我们可以获取到UA,什么是UA呢?
  • 在javaEE初阶我们已经接触过UA了,大家可以理解为UA用来区分我们的设备信息,这是非常重要的功能.

在这里插入图片描述

接下来我们要学习存储session.

5. 建立session信息

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@RequestMapping("/set")
@RestController
public class SetSession {
    @RequestMapping("/setsess")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("ylc", "123");
        return "Session 成功建立";
    }
}

在这里插入图片描述

6. 获取session信息

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/get")
public class GetSession {
    @RequestMapping("/getsession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession(false); // 切记一定要加 false
        if (session != null && session.getAttribute("ylc") != null) {
            return (String) session.getAttribute("ylc");
        } else {
            return "没有Session 信息";
        }
    }
}

在这里插入图片描述

第二种方式获取session :

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/get")
public class GetSession {
    @RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(value = "ylc", required = false) String userinfo) {
        return userinfo;
    }
}

在这里插入图片描述

7. 关于@ResponseBody注解

  • 我们先构造一个简单的html页面,名字叫做index.html.
  • 注意前端页面放在static目录下.
<!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>Document</title>
</head>
<body>
  <h1>你好,叶良辰</h1>
</body>
</html>

我们先来写一个没有@ResponseBody注解的后端代码.

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/resp")
@Controller
public class Ret {
    @RequestMapping("/func")
    public String func() {
        return "/index.html";
    }
}

随后,我们通过浏览器进行访问,我们会发现访问到了我们的前端页面.

在这里插入图片描述

接下来我们在后端代码添加上@ResponseBody注解后.

package com.example.demo;

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

@RequestMapping("/resp")
@Controller
@ResponseBody
public class Ret {
    @RequestMapping("/func")
    public String func() {
        return "/index.html";
    }
}

然后我们再进行页面访问,我们会发现拿到的是后端return的数据.


在这里插入图片描述

其实在我们前面已经介绍过这一点,怕大家不熟悉,毕竟是重点,多提及一下还是好的.

  • @ResponseBody表示后端代码返回数据,也就是return的数据.
  • 没有@ResponseBody注解默认返回的是return的页面,我们在return后面加的是html页面,那么就返回该页面.

8. 返回一个json对象

json格式是我们学习前后端交互非常重要的格式,因此我们需要多次学习,我们把json格式的数据存储在哈希表中,然后进行返回.

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
@RequestMapping("/json")
@RestController
public class ResoJson {
    @RequestMapping("/respjson")
    public HashMap<String, String> respJson() {
        HashMap<String, String> map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }
}

在这里插入图片描述

9. 简单的前后端交互

接下来我们实现一个简单的计算机,计算我们的整数乘法.


<!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>Document</title>
</head>
<body>
<form action="/qwer/calc">
    <div style="margin-top: 100px;text-align: center;">
        <h1>输入两个整数进行乘法运算:</h1>
        数字1<input name="num1"><br>
        数字2<input name="num2"><br><br>
        <input value="提 交" type="submit">
    </div>
</form>
</body>
</html>

在这里插入图片描述

package com.example.demo;

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

@RequestMapping("qwer")
@ResponseBody
@Controller
public class Calc {
    @RequestMapping("/calc")
    public String calc(Integer num1, Integer num2) {
        if (num1 == null || num2 == null) return "参数错误";
        return "结果为 " + (num1 * num2);
    }
}


在这里插入图片描述

10. 前后端登录页面

前后端登录页面让大家更加深刻的了解前后端交互.

<!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="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
    <title>Document</title>
    <script>
 function mysub() {
 var username = jQuery("#username").val();
 var password = jQuery("#password").val();
 jQuery.getJSON("/login",
 {
 "username":username,
 "password":password
 },
 function (result) {
 if(result.succ==200){
 alert("返回结果:"+result.msg);
 }else{
 alert("操作失败,请重试。");
 }
 });
 }
 </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    ⽤户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br><br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin top: 20px ;margin-left: 50px; ">
    
</div>
</body>
</html>
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
@RestController
public class Login {
    @RequestMapping(value = "/login")
    @ResponseBody
    public HashMap<String,Object> login(String username, String password){
        HashMap<String,Object> res = new HashMap<>();
        int succ = 200;
        if(username!=null && password!=null &&
                username.equals("ylc") && password.equals("123")){
            res.put("msg","登录成功");
        }else{
            res.put("msg","登录失败");
        }
        res.put("succ",succ);
        return res;
    }
}

账号密码正确的时候登录成功.

在这里插入图片描述

账号密码错误的时候登录失败.

在这里插入图片描述

11. 请求转发与请求重定向

请求转发与请求重定向是一个非常重要的面试题,大家要对二者进行区分.

  • forward 是请求转发。
  • redirect:请求重定向。

接下来我们通过代码进行演示

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/user14")
@Controller
public class User14 {
    // 请求重定向
    @RequestMapping("/index")
    public String index(){
        return "redirect:/index.html";
    }
    // 请求转发
    @RequestMapping("/index2")
    public String index2(){
        return "forward:/index.html";
    }
}
  1. 请求重定向直接跳转到html页面,相当于我们亲自去买东西.

在这里插入图片描述

请求转发只是一个代理,我们只是一个跑腿的.

在这里插入图片描述

二者区别如下:

  • 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  • 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
  • 请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

请求转发的问题?

  • 请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问.
  • 什么意思呢,我们的html页面是直接放在static目录下,如果我们在该目录下再创一个目录html目录,在html中再创一个test.html.
  • 我们通过index.html跳转test.html页面,观察重定向和转发的效果.
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/user14")
@Controller
public class User14 {
    // 请求重定向
    @RequestMapping("/index")
    public String index(){
        return "redirect:/index.html";
    }
    // 请求转发
    @RequestMapping("/index2")
    public String index2(){
        return "forward:/index.html";
    }
}

在这里插入图片描述

重定向正常访问我们的页面.

在这里插入图片描述

转发加载页面信息失败.

在这里插入图片描述

看到这里想必大家对重定向和转发有了一定的认识.

后序:
看到这里,我们的Spring MVC就结束了,下一篇文章我们就要开始我们数据库与代码建立连接了,期待与你们一同进步! ! !🍬🍬🍬

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

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

相关文章

【仪器使用操作笔记】 TDS1012示波器基础原理与使用

今日要学习使用的是一台实验室老旧战损版TDS1012示波器&#xff0c;它长这样&#xff1a; 本文会从以下目录的几个方面全方位介绍示波器的一些基础运用&#xff1a; 目录 一、面板按键旋钮介绍&#xff1a; 整体面板介绍&#xff1a; 示波器探头接线与校准接线&#xff1a; …

一文弄懂java中的代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额…

Atcoder Beginner Contest 305——D-F题讲解

蒟蒻来讲题&#xff0c;还望大家喜。若哪有问题&#xff0c;大家尽可提&#xff01; Hello, 大家好哇&#xff01;本初中生蒟蒻讲解一下AtCoder Beginner Contest 305这场比赛的D-F题&#xff01; D题 题外话 安利一波自己的洛谷博客&#xff1a;点这里 思路 这道题还是比…

Hazel游戏引擎(010)预编译头

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言如何实现 前言 此节目的 由于项目中的头文件或者cpp文件都包含着c的头文件&#xff0c;有些重复&#xff0c;可以将它们包含的c头文件放在一个头文件内&#xff0c;这样不仅使代码简洁&#xff0c;而且预编译头可以…

算法刷题-哈希表-两个数组的交集

两个数组的交集 349. 两个数组的交集思路拓展后记其他语言版本相关题目 如果哈希值比较少、特别分散、跨度非常大&#xff0c;使用数组就造成空间的极大浪费&#xff01; 349. 两个数组的交集 力扣题目链接 题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的…

Java集合框架:ArrayList详解

目录 一、ArrayList简介 二、ArrayList源码介绍&#xff08;动态扩容以及构造方法是如何实现的&#xff09; 1. 扩容机制&#xff1a; 源码&#xff1a; 源码详解&#xff1a; ​编辑 如何扩容&#xff1a; 2. 扩容源码详解&#xff1a; 三、ArrayList的构造方法 四、ArrayL…

【Linux运维】GitLab本地服务器搭建

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gitlab本地服务器的搭建。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新…

【JVM内存模型】—— 每天一点小知识

&#x1f4a7; J V M 内存模型 \color{#FF1493}{JVM内存模型} JVM内存模型&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x…

MyBatis-plus(2)

实现逻辑查询: 1)and:其实如果只是想实现and查询&#xff0c;只是需要连续调用对应的方法或者是通过wrapper对象实现两次调用即可 2)and的嵌套:假设现在有这样一条语句 select * from user where username"张三" and (age>26 or userID <19)&#xff0c;这条SQ…

使用django的APP在前端上传excel通过post传给后端读取并打印

文章目录 前言前端后端 前言 备研了&#xff0c;博客许久未更了&#xff0c;但是学期末的大作业&#xff0c;遇到了问题并成功解决了&#xff0c;不得不记录一下。 前端 <form method"post" enctype"multipart/form-data" action"/insurance/up…

Hazel游戏引擎(011)窗口抽象和GLFW创建窗口

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言步骤GIT添加GLFW子模块及编译Window类其它修改 效果Bug记录 前言 此节目的 为了有窗口效果&#xff0c;但不想使用原生的window32写起&#xff0c;所以用glfw窗口库。 也为了完成008计划事件系统的创建窗口部分 图…

AI数据标注工具Doccano

Doccano是一款开源的标注工具&#xff0c;用于自然语言处理和机器学习任务。它提供了用户友好的界面&#xff0c;使用户能够轻松地标注文本、序列标注、文本分类和文本配对等任务。doccano支持多种标注格式&#xff0c;并且可以方便地与其他机器学习工具集成。它的简单性和灵活…

基于 MySQL 事务、隔离级别及 MVCC 机制详细剖析

前言事务特性事务并发引发的问题脏读不可重复读幻读 隔离级别如何更改事务隔离级别 事务基本操作MVCC版本链ReadViewREAD COMMITTED脏读问题不可重复读问题 REPEATABLE READ不可重复读问题幻读问题 小结 总结 前言 MySQL 事务是比较重要且核心的一部分&#xff0c;在操作数据库…

碳排放预测模型 | Python实现基于Prophet网络的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于Prophet网络的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/owid/co2-data/blob/master/owid-co2-data.csv 使用…

读书:《指数型组织》

《指数型组织》是Salim Ismail在2015年发表的一本著作&#xff0c;它探讨了在今天这个信息时代&#xff0c;一些组织为何能够在极短的时间内取得显著的成绩。他发现这些成功的组织都有一些共享的属性&#xff0c;这些属性使得他们能够比传统组织更快、更有效地扩展业务。他把这…

LiangGaRy-学习笔记-Day21

1、LVM介绍 1.1、LVM是什么 对于生产环境下的服务器来说&#xff0c;如果存储数据的分区磁盘空间不足&#xff0c;应该如何处理&#xff1f; 添加一块硬盘–>可以满足需要再添加一块硬盘也可以满足需求&#xff1b;问题就是拷贝的速度慢&#xff1b; 这里就引入一个技术…

Kubernetes小感

从容器到容器云&#xff0c;谈谈 Kubernetes 的本质&#xff1a; 一个“容器”&#xff0c;实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。 作为一名开发者&#xff0c;我并不关心容器运行时的差异。因为&#xff0c;在整个“…

【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(核心组件说明)

零基础全方位带你学习探索Docker容器开发实战指南&#xff08;核心组件说明&#xff09; 核心组件镜像定义概念与容器的关联文件系统root文件系统 bootfs启动文件系统分层存储分层覆盖处理模式镜像的写时复制机制 容器容器进程隔离性容器进程隔离性容器存储层数据卷绑定镜像和容…

Spring6-01

Spring6启示录 OCP开闭原则 什么是开闭原则&#xff1f; 在软件开发过程中应当对扩展开放&#xff0c;对修改关闭。也就是说如果在进行功能扩展的时候&#xff0c;添加额外的类是没有问题的&#xff0c;但因为功能扩展而修改之前运行正常的程序&#xff0c;这是不被允许的。因…

Elasticsearch:二进制数据类型 - binary field

二进制&#xff08;binary&#xff09;类型接受二进制值作为 Base64 编码字符串。 该字段默认不存储且不可搜索。Base64 编码的二进制值不得嵌入换行符 \n。 这听起来像是&#xff0c;将二进制对象存储在 Elasticsearch 中的单个字段中 PUT my-index-000001 {"mappings&…