SpringMVC回顾总结笔记

news2025/1/18 17:14:39

MVC是一种思想而SpringMVC是具体的实现(Ioc和DI的关系)

在创建项目的时候勾选的SpringWeb框架就是SpringMVC框架
在这里插入图片描述

与浏览器建立连接

默认返回的是一个 view 视图。需要添加@ResponseBody说明返回的是json数据。@RestController是@Controller+@ResponseBody的组合注解

package app.controller;

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

@Controller
@RequestMapping("/web")
public class WebController {
    // 返回数据
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello world.";
    }

    // 返回页面
    @GetMapping("/index")
    public String index() {
        return "/index.html";
    }
}

返回数据
在这里插入图片描述
返回页面
在这里插入图片描述

获取参数

参数请求类型

  1. URL传参
  2. Ajax传参
  3. Form表单传参

获取单个参数

get1:可以通过内置的servlet获取,也可以直接给定一个和前端对应的参数获取

// 1.获取单个参数
@GetMapping("/get1")
public HashMap<String, String> getParameter1(HttpServletRequest req, HttpServletResponse rep, String name) {
    return new HashMap<String, String>() {
        {
            put("req_name", req.getParameter("name"));
            put("name", name);
        }
    };
}

Postman测试get1接口
在这里插入图片描述

Fiddler抓包结果

获取对象

User对象

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
}

get2接口

// 2.获取对象
@GetMapping("/get2")
public HashMap<String, User> getParameter2(User user) {
    return new HashMap<String, User>() {{
        put("user", user);
    }};
}

Postman测试get2接口
在这里插入图片描述
Fiddler抓包
在这里插入图片描述

获取表单参数

get3接口

// 3.Form表单+Ajax
@RequestMapping("/get3")
public HashMap<String, User> getParameter3(User user) {
    return new HashMap<String, User>() {{
        put("user", user);
    }};
}

Form表单
input标签中name属性值和后端对象字段名需要一致

<form method="get" action="/get4">
    <div>
        <h1>Form表单</h1>
        <span>用户:</span><input type="text" name="name">
        <br/>
        <span>年龄:</span><input type="number" name="age">
        <br/>
        <span>性别:</span><input type="text" name="sex">
        <br/>
        <input type="submit" value="注册">
    </div>
</form>

表单提交数据之后会自动跳转到该接口,F12查看URL时证明表单提交的数据依旧是和之前一样进行URL拼接的方式发送数据
在这里插入图片描述
前端Form表单从get改为post请求,发现表单提交的数据get3接口可以正常获取
在这里插入图片描述

获取Ajax参数

一般Ajax发起HTTP请求的时候会为了节省数据大小,采取JSON的格式传输

get3接口

// 3.Form表单+Ajax
@RequestMapping("/get3")
public HashMap<String, User> getParameter3(User user) {
    return new HashMap<String, User>() {{
        put("user", user);
    }};
}

get请求+不指定json格式+data数据不封装为json

这里就按照要求,规定JSON格式就转为JSON格式数据没要求就不做编排。按照规范编写代码,减少后续不必要的测试步骤
Ajax代码

<div>
    <h1>Ajax</h1>
    <span>用户:</span><input type="text" name="name" id="name">
    <br/>
    <span>年龄:</span><input type="number" name="age" id="age">
    <br/>
    <span>性别:</span><input type="text" name="sex" id="sex">
    <br/>
    <input type="button" value="注册" id="sub-btn">
    <br/>
    <input id="data" hidden="hidden" style="width: auto">
</div>
<script src="../js/jquery-3.7.1.min.js"></script>

<script>
    <!--请求后端接口-->
    document.getElementById("sub-btn").addEventListener("click", function () {
        $.ajax({
            url: "/get3",
            type: "get",
            //contentType: "application/json",
            data: {
                "name": document.getElementById("name").value,
                "age": document.getElementById("age").value,
                "sex": document.getElementById("sex").value
            },
            success: function (data) {
                // 后端是HashMap这种JSON数据格式的话就需要转换为字符串或者取值【这里直接取之】
                let result = document.getElementById("data");
                result.value = `name:${data.user.name}、age:${data.user.age}、sex:${data.user.sex}`;
                result.hidden = false;
            },
            error: function (xhr, status, error) {
                console.log(error);
            }
        });
    });
</script>

分析:get请求会把发送的数据以键值的形式拼接在url后,即使设定了参数类型为JSON格式,但是依旧会遵循Ajax中的data数据这种key-value格式,SpringMVC会自动根据URL的参数和对象的属性进行匹配,因此可以形成映射关系

【不建议这么写,因为已经设定了json格式,但是data数据并没有完全封装成一个json对象,这里是为了测试效果】

在这里插入图片描述

get请求+指定json格式+data数据封装为json

Ajax代码

<div>
    <h1>Ajax</h1>
    <span>用户:</span><input type="text" name="name" id="name">
    <br/>
    <span>年龄:</span><input type="number" name="age" id="age">
    <br/>
    <span>性别:</span><input type="text" name="sex" id="sex">
    <br/>
    <input type="button" value="注册" id="sub-btn">
    <br/>
    <input id="data" hidden="hidden" style="width: auto">
</div>

<script>
    <!--请求后端接口-->
    document.getElementById("sub-btn").addEventListener("click", function () {
        $.ajax({
            url: "/get3",
            type: "get",
            contentType: "application/json",
            data: JSON.stringify({
                "name": document.getElementById("name").value,
                "age": document.getElementById("age").value,
                "sex": document.getElementById("sex").value
            }),
            success: function (data) {
                // 如果后端是HashMap这种JSON数据格式的话就需要转换为字符串
                console.log(data);
                let result = document.getElementById("data");
                result.value = `name:${data.user.name}、age:${data.user.age}、sex:${data.user.sex}`;
                result.hidden = false;
            },
            error: function (xhr, status, error) {
                console.log(error);
            }
        });
    });
</script>

在这里插入图片描述

分析:接口报错400,当封装data数据格式为JSON之后,URL中的参数和后端接口get3中的参数由于无法映射成User对象,就会报错

post请求+不指定json格式+data数据不封装为json

Ajax代码

<div>
    <h1>Ajax</h1>
    <span>用户:</span><input type="text" name="name" id="name">
    <br/>
    <span>年龄:</span><input type="number" name="age" id="age">
    <br/>
    <span>性别:</span><input type="text" name="sex" id="sex">
    <br/>
    <input type="button" value="注册" id="sub-btn">
    <br/>
    <input id="data" hidden="hidden" style="width: auto">
</div>
<script src="../js/jquery-3.7.1.min.js"></script>

<script>
    <!--请求后端接口-->
    document.getElementById("sub-btn").addEventListener("click", function () {
        $.ajax({
            url: "/get3",
            type: "post",
            //contentType: "application/json",
            data: {
                "name": document.getElementById("name").value,
                "age": document.getElementById("age").value,
                "sex": document.getElementById("sex").value
            },
            success: function (data) {
                // 后端是HashMap这种JSON数据格式的话就需要转换为字符串或者取值【这里直接取之】
                let result = document.getElementById("data");
                result.value = `name:${data.user.name}、age:${data.user.age}、sex:${data.user.sex}`;
                result.hidden = false;
            },
            error: function (xhr, status, error) {
                console.log(error);
            }
        });
    });
</script>

在这里插入图片描述
分析:Ajax的post请求其实和表单的post请求类似,所以依旧可以获取到数据

post请求+指定json格式+data数据封装为json

Ajax代码

<div>
    <h1>Ajax</h1>
    <span>用户:</span><input type="text" name="name" id="name">
    <br/>
    <span>年龄:</span><input type="number" name="age" id="age">
    <br/>
    <span>性别:</span><input type="text" name="sex" id="sex">
    <br/>
    <input type="button" value="注册" id="sub-btn">
    <br/>
    <input id="data" hidden="hidden" style="width: auto">
</div>

<script>
    <!--请求后端接口-->
    document.getElementById("sub-btn").addEventListener("click", function () {
        $.ajax({
            url: "/get3",
            type: "post",
            contentType: "application/json",
            data: JSON.stringify({
                "name": document.getElementById("name").value,
                "age": document.getElementById("age").value,
                "sex": document.getElementById("sex").value
            }),
            success: function (data) {
                // 如果后端是HashMap这种JSON数据格式的话就需要转换为字符串
                console.log(data);
                let result = document.getElementById("data");
                result.value = `name:${data.user.name}、age:${data.user.age}、sex:${data.user.sex}`;
                result.hidden = false;
            },
            error: function (xhr, status, error) {
                console.log(error);
            }
        });
    });
</script>

在这里插入图片描述

分析:原因和之前get请求+指定json格式+data数据封装为json类似,转为JSON对象之后无法和get3接口中User对象进行匹配,只不过是不会报错的原因是此时post请求不用解析URL中的参数和后端接口去匹配,而是将body中的数据去匹配,此时body中的数据有JSON对象,但是无法和get3接口中的User对象进行映射,需要添加一个@RequestBody注解才能实现JSON对象和后端接口参数中的User对象进行映射

获取JSON对象@RequestBody

get5接口在对象参数前加一个@RequestBody注解
@RequestBody:将前端数据映射为一个Java对象

// 4.JSON对象+Postman测试
@RequestMapping("/get4")
public String getParameter4(@RequestBody User user) {
    return new HashMap<String, User>() {{
            put("user", user);
        }};
}

前端Ajax,url更改为get4,请求方式为post

<div>
    <h1>Ajax</h1>
    <span>用户:</span><input type="text" name="name" id="name">
    <br/>
    <span>年龄:</span><input type="number" name="age" id="age">
    <br/>
    <span>性别:</span><input type="text" name="sex" id="sex">
    <br/>
    <input type="button" value="注册" id="sub-btn">
    <br/>
    <input id="data" hidden="hidden" style="width: auto">
</div>
<script src="../js/jquery-3.7.1.min.js"></script>

<script>
    <!--请求后端接口-->
    document.getElementById("sub-btn").addEventListener("click", function () {
        $.ajax({
            url: "/get4",
            type: "post",
            contentType: "application/json",
            data: JSON.stringify({
                "name": document.getElementById("name").value,
                "age": document.getElementById("age").value,
                "sex": document.getElementById("sex").value
            }),
            success: function (data) {
                // 后端是HashMap这种JSON数据格式的话就需要转换为字符串或者取值【这里直接取之】
                let result = document.getElementById("data");
                result.value = `name:${data.user.name}、age:${data.user.age}、sex:${data.user.sex}`;
                result.hidden = false;
            },
            error: function (xhr, status, error) {
                console.log(error);
            }
        });
    });
</script>

获取文件@RequestPart

// 5.获取文件
@PostMapping("/get5")
public String getParameter5(String name, @RequestPart("myfile") MultipartFile upLoadFile) throws IOException {
    // 获取文件名
    String fileName = upLoadFile.getOriginalFilename();
    System.out.println(fileName);
    if (fileName != null) {
        String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + "/";
        File file = new File(filePath + fileName);
        upLoadFile.transferTo(file);
        return "【" + file.getName() + "】上传成功";
    }
    return "上传失败";
}

Postman测接口的时候需要文件名和后端@RequestPart对应
在这里插入图片描述

获取Cookie/Session/Header

因为HTTP无状态,浏览器默认会把当前网站所有Cookie发送给后端

/***
 * 6.获取 Cookie、Session 和 Header
 * 6.1 Cookie
 * 		Servlet方式获取: 获取全部Cookie
 * 		注解方式获取: 获取1个Cookie
 */
@GetMapping("/get6")
public HashMap<String, String> getParameter6(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    // true: 没有session就创建一个session,false: 没有session就返回null
    HttpSession session = request.getSession(true);
    session.setAttribute("session_dir_jdk", System.getProperty("user.dir"));
    session.setAttribute("session_dir_spring", ClassUtils.getDefaultClassLoader().getResource("app").getPath());
    String userAgent = request.getHeader("User-Agent");
    return new HashMap<String, String>() {{
        put("cookies", Arrays.toString(cookies));
        put("session_dir_jdk", session.getAttribute("session_dir_jdk").toString());
        put("session_dir_spring", session.getAttribute("session_dir_spring").toString());
        put("userAgent", userAgent);
    }};
}

@GetMapping("/get7")
public HashMap<String, String> getParameter7(@CookieValue("JSESSIONID") String cookie_JSESSIONID,
                                             @SessionAttribute(value = "session_dir_jdk", required = true) String session_dir_jdk,
                                             @SessionAttribute(value = "session_dir_spring", required = true) String session_dir_spring,
                                             @RequestHeader("User-Agent") String userAgent) {
    return new HashMap<String, String>() {{
        put("cookie_JSESSIONID", cookie_JSESSIONID);
        put("session_dir_jdk", session_dir_jdk);
        put("session_dir_spring", session_dir_spring);
        put("userAgent", userAgent);
    }};
}

在浏览器手动设置Cookie
在这里插入图片描述

后端参数重命名@RequestParam

如果前后端参数未统一管理,则此时后端可以使用@RequestParam重命名前后端参数值
前端

<div>
    <input type="button" value="点击获取当前时间" id="getCurrentTIme">
    <br>
    <input type="datetime-local" hidden="hidden" id="showCurrentTime">
</div>

<script>
    // 后端参数重命名
    document.getElementById("getCurrentTIme").addEventListener("click", function () {
        let nowTimeStamp = new Date();
        let year = nowTimeStamp.getFullYear();
        let month = String(nowTimeStamp.getMonth() + 1).padStart(2, "0");
        let day = String(nowTimeStamp.getDate()).padStart(2, "0");
        let hour = String(nowTimeStamp.getHours()).padStart(2, "0");
        let min = String(nowTimeStamp.getMinutes()).padStart(2, "0");
        let sec = String(nowTimeStamp.getSeconds()).padStart(2, "0");
        let time = year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec;
        jQuery.ajax({
            url: "/get8",
            method: "GET",
            contentType: "text/plain",
            data: {"time": time},
            success(data) {
                let showCurrentTime = document.getElementById("showCurrentTime");
                showCurrentTime.hidden = false;
                showCurrentTime.value = data;
            },
            error(xhr, status, error) {
                window.alert("error:" + error);
            }
        });
    });
</script>

后端

@GetMapping("/get8")
public String getParameter8(@RequestParam("time", required = false) String createTime) {
    return createTime;
}

此时后端字段需要一个createTime但是前端却传的是time字段,那么此时后端会无法接收到参数,作为后端程序员可以通过参数重命名接收前端参数

获取URL中参数@PathVariable

前端
127.0.0.1:8080/get9/张三/23/M
在这里插入图片描述

后端

// 获取URL中的参数
@GetMapping("/get9/{name}/{age}/{sex}")
public HashMap<String, String> getParameter9(@PathVariable String name,
                                             @PathVariable String age,
                                             @PathVariable String sex) {
    return new HashMap<String, String>() {{
        put("name", name);
        put("age", age);
        put("sex", sex);
    }};
}

请求转发与请求重定向

一般都是前端处理好,但这一块属于面试常问的问题。因此做一个小小的梳理

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

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

相关文章

【Java EE初阶十四】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…

Leetcode刷题笔记题解(C++):120. 三角形最小路径和

思路&#xff1a;动态规划&#xff0c;去生成一个对应的当前节点的最小路径值&#xff0c;对应的关系如下所示 dp[0][0] triangle[0][0] dp[i][0] triangle[i][0]dp[i-1][0] dp[i][i] triangle[i][i]dp[i-1][i] dp[i][j] triangle[i][j]min(dp[i-1][j-1],dp[i-1][j]) …

扫描电子显微镜(SEM)样品制备要求与方法解析

扫描电子显微镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种强大的分析工具&#xff0c;广泛应用于材料科学、生物学、医学、半导体材料和化学化工等领域。SEM能够提供高分辨率的表面形貌图像&#xff0c;因此样品制备成为获取准确、清晰图…

在 MyBatis 中,可以使用相同的 SQL 映射语句进行批量删除和单个删除。

目录 前端代码&#xff1a; 后端代码&#xff1a; controller service层接口 service接口的实现 mapper层接口 xml sql 效果&#xff1a;&#xff08;点击操作列的删除&#xff0c;可删除一行数据。勾选多个多选框再点击批量删除&#xff0c;可删除多个&#xff09; …

Postman路径修改

默认安装好Postman之后&#xff0c;默认路径在&#xff1a;C:\Users\用户名\AppData\Local\Postman。 修改路径只需要将整个文件夹拷贝到需要移动的位置即可&#xff0c;然后重新创建一个快捷方式。再删除原来路径的文件夹。

访问学者感谢信|人文社科工作者赴北欧访学

编者按&#xff1a;这位访问学者从委托我们申请到获得邀请函只用了一个月时间。为了表达感激之情&#xff0c;其当时就写了这封感谢信&#xff0c;但依据我们的惯例&#xff0c;一般是待申请者出国&#xff0c;一切安排妥当后再发成功案例。所以时至今日&#xff0c;才将该申请…

2942. 查找包含给定字符的单词【简单】

2942. 查找包含给定字符的单词【简单】 题目描述&#xff1a; 给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。 请你返回一个 下标数组 &#xff0c;表示下标在数组中对应的单词包含字符 x 。 注意&#xff1a;返回的数组可以是 任意 顺序 示例 1&#xff1a; 输…

海外大带宽服务器连接失败:原因与解决策略

​随着全球互联网的发展&#xff0c;越来越多的企业和个人选择使用海外大带宽服务器来满足数据传输和业务需求。然而&#xff0c;在实际使用中&#xff0c;有时会出现服务器连接失败的问题。本文将为您分析原因并提供相应的解决策略。 一、海外大带宽服务器连接失败的原因 网络…

Firefox火狐浏览器/Google谷歌浏览器安装免费好用的翻译插件,亲测好用舒服了(附上安装包)

文章目录 1. 为什么选择它&#xff1f;2. 下载安装并体验插件2.1 下载安装包2.2 安装插件2.3 翻译体验 1. 为什么选择它&#xff1f; 最近维基百科项目&#xff0c;由于是国外的网站全是英文&#xff0c;我英语又不好&#xff0c;试了好几个英文翻译插件都没法使用&#xff0c…

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…

小程序全局变量管理-mobx引入与使用

背景&#xff1a; 对于全局变量操作&#xff0c;如果不规范使用很容易产生意想不到的问题&#xff0c;使用mobx对全局变量进行管理&#xff0c;能够规范代码操作&#xff0c;使程序变得简单高效。 代码使用&#xff1a; 1&#xff09;定义全局变量 import { action, observ…

[力扣 Hot100]Day29 删除链表的倒数第 N 个结点

题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 出处 思路 两个指针间隔n&#xff0c;一趟遍历解决。 代码 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* phead;ListNode* …

使用Docker Compose搭建Redis哨兵架构

搭建Redis哨兵(sentinel) 之前我们通过深入理解REDIS哨兵原理了解了Redis哨兵(sentinel)的原理&#xff0c;今天我们手动部署一个哨兵架构。要在Docker中搭建Redis哨兵(sentinel)架构&#xff0c;需要Redis的主从实例以及哨兵实例。之前我们已经使用Docker Compose搭建Redis主…

MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

文章目录 一、索引概述二、索引结构三、结构 - B-Tree四、结构 - BTree五、结构 - Hash六、索引分类七、索引语法1.案例代码 八、SQL性能分析1.查看SQl执行频率2.慢查询日志3.PROFILES详情4.EXPLAIN执行计划 九、 索引使用规则十、SQL 提示十一、覆盖索引十二、前缀索引十三、单…

Qt的基本操作

文章目录 1. Qt Hello World 程序1.1 通过图形化界面的方式1.2 通过代码的方式实现 2. Qt 的编码问题3. 使用输入框实现hello world4. 使用按钮实现hello world5. Qt 编程注意事项6. 查询文档的方式7. 认识Qt坐标系 1. Qt Hello World 程序 1.1 通过图形化界面的方式 我们先讲…

抖音关键词搜索爬虫,抖音API数据接口,抖音商品详情数据采集

抖音商品API接口抖音关键词搜索抖音直播间小黄车抖店商品数据采集 除了微博&#xff0c;小红书&#xff0c;抖音也是一个巨大的流量池。 除了评论&#xff0c;其实关键词搜索视频是更为常见的一个需求&#xff0c;于是上周末抽空开发了下&#xff0c;完成了 mvp。

鸿蒙新手入门-环境准备问题解析

Node.js版本与API配套关系 由于SDK的部分工具依赖Node.js运行时&#xff0c;推荐使用配套API版本的Node.js&#xff0c;保证工程的兼容性。 匹配关系见下表&#xff1a; API LevelNode.js支持范围API Level≤914.x&#xff08;≥14.19.1&#xff09;、16.xAPI Level>914.…

Graph + LLM图数据库技术如何助力行业大语言模型应用落地

随着 AI 人工智能技术的迅猛发展和自然语言处理领域的研究日益深入&#xff0c;如何构建强大的大语言模型对于企业来说愈发重要&#xff0c;尤其是在特定行业领域中。 图数据库作为处理复杂数据结构的有力工具&#xff0c;为企业构建行业大语言模型提供了强大的支持。本文将探…

AI 文生图提示词分类(合集 · 第一季)

一、时间和季节 Time and Season 1、时间描述 Time Description 比如&#xff0c;日出、黄昏、夜晚、清晨 / Sunrise, Sunset, Night, Early Morning 2、季节变化 Seasonal Changes 比如&#xff0c;春天、夏天、秋天、冬天 / Spring, Summer, Autumn, Winter 二、场景描述 Sce…

无人机技术,无人机动力系统知识,电机、电调、桨叶技术详解

无人机动力系统中的电机、电调和桨叶技术都是非常重要的部分&#xff0c;以下是对这些技术的详解&#xff1a; 无人机电机 在无人机动力系统中&#xff0c;电机是将电能转化为机械能的关键部件。其主要作用是产生旋转力矩&#xff0c;驱动螺旋桨的旋转&#xff0c;从而实现无…