【Java_EE】Spring MVC
目录
Spring Web MVC
编辑注解
@RestController
@RequestMapping
@RequestParam
@RequestParam
@RequestBody
@PathVariable
@RequestPart
参数传递
注意事项
编辑参数重命名
@RequestParam
编辑编辑传递集合
@RequestParam
传递JSON数据
编辑@RequestBody
编辑获取URL中的参数
@PathVariable
编辑上传文件
@RequestPart
Cookie和Session
Cookie和Session的区别
Cookie和Session的关系
设置session(2种方式)
获取session(3种方式)
获取header(2种方式)
返回响应
响应静态页面
响应html代码片段
响应JSON对象
设置Connect-Type
小结练习:
登录练习和留言练习
API的实现
进行前后端交互
Spring Web MVC
Spring Web MVC:是基于Servlet API构建的原始web框架,实现了mvc设计模式的思想,通常被称为spring mvc
Servlet:是一套Java Web开发的规范(技术标准),是一种实现动态页面的技术
MVC的定义:Model Controller View
注解
@RestController
这是一个类注解,加了这个注解,spring才会对该类进行扫描。@RestController = @Controller(返回视图) + @ResponseBody(返回数据),所以最后返回的就是数据
@RequestMapping
URL路由映射,是用来注册接口的路由映射的
访问路径=类路径+方法路径,路径不能重复
可以修饰类,也可以修饰方法
支持GET请求,也支持POST请求
@RequestParam
@RequestParam进行参数重命名时,参数就变成了必传参数(required默认为true),将required改为false就为非必传了(方法参数)
@RequestParam
传递集合参数和传递数组类似,只是集合需要使用@RequestParam绑定参数关系。默认情况下,请求中参数名相同的多个值,封装到数组;要封装到集合,则需要使用@RequestParam绑定参数关系(集合)
@RequestBody
@RequestBody 作用在请求正文的数据绑定,请求参数必须秀在请求正文中(json)
@PathVariable
@PathVariable 路径变量,作用在请求URL路径上的数据绑定,默认传递参数写在URL上,SpringMVC就可以获取到(url)
@RequestPart
@RequestPart 可用于文件重命名(文件)
参数传递
接收参数。对于包装类型,如果不传对应参数,Spring接收到的数据则是null;对于基本类型,如果不传对应参数,会报500错误
注意事项
使用基本类型接收参数时,参数必须传(除了boolean类型),否则会报500错误,类型不匹配时会报400错误
参数重命名
@RequestParam
@RequestParam进行参数重命名时,参数就变成了必传参数(required默认为true),将required改为false就为非必传了

传递集合
@RequestParam
传递集合参数和传递数组类似,只是集合需要使用@RequestParam绑定参数关系。默认情况下,请求中参数名相同的多个值,封装到数组;要封装到集合,则需要使用@RequestParam绑定参数关系
传递JSON数据
JSON:是一种轻量级的数据交互格式,JSON本质是字符串,主要负责在不同的语言中数据传递和交换
JSON字符串和Java对象互转:可以通过jackson、fastjson1、fastjson2、gson...在Spring MVC框架中集成了JSON转换工具jackson
jackson工具:使用ObjectMapper对象提供的两个方法,JSON和Java对象可以互转
writeValueAsString():把对象转为JSON字符串
readValue():把JSON字符串转为对象(需要有无参构造方法)
@RequestBody
@RequestBody 作用在请求正文的数据绑定,请求参数必须在请求正文中
获取URL中的参数
@PathVariable
@PathVariable 路径变量,作用在请求URL路径上的数据绑定,默认传递参数写在URL上,SpringMVC就可以获取到
上传文件
@RequestPart
@RequestPart 可用于文件重命名
Cookie和Session
Cookie和Session的区别
Cookie是保存在客户端的用户信息的一种机制,Session是保存在服务器端的用户信息一种机制,sessionId是两者之间的桥梁。
cookie是不安全的,可以伪造cookie;session是安全的。
session默认是保存在内存中,如果重启服务器session数据就会丢失。
Cookie和Session的关系
设置session(2种方式)
// 设置Session
@RequestMapping("/setSession1")public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("name", "value1");session.setAttribute("age", 200);return "设置session成功 key1:value1 key2:200";}// 设置Session@RequestMapping("/setSession2")public String setSession2(HttpServletRequest request, String value3, Integer value4) {HttpSession session = request.getSession();session.setAttribute("name", value3);session.setAttribute("age", value4);return "设置session成功! name:" + value3 + " age:" + value4;}// 设置Session@RequestMapping("/setSession3")public String setSession3(HttpSession session, String name, Integer age) {session.setAttribute("name", name);session.setAttribute("age", age);return "设置session成功! name:" + name + " age:" + age;}
设置完一条Session就会自动生成一个Cookie
获取cookie(2种方式)
1:通过接口HttpServletRequest
2:通过注解@CookieValue
@RequestMapping("/getCookie1")public String getCookie1(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if(cookies == null) {System.out.println("没有Cookie");return "没有Cookie";}for (Cookie cookie : cookies) {System.out.println("getCookie-》" + cookie.getName() + ":" + cookie.getValue());}return "获取Cookie成功";}
@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("key3") String value) {return "获取Cookie成功! key:" + value;}
获取session(3种方式)
1:通过接口HttpServletRequest
2:通过接口HttpSession
3:通过注解SessionAttribute
此处获取需要进行对象转换,将Object对象转换成替他类型(String、Integer)
// 获取Session@RequestMapping("/getSession1")public String getSession1(HttpServletRequest request) {HttpSession session = request.getSession();String name = (String)session.getAttribute("name");Integer age = (Integer)session.getAttribute("age");return "获取session成功 key1:" + name + " key2:" + age;}// 获取Session@RequestMapping("/getSession2")public String getSession2(HttpSession session) {String name = (String)session.getAttribute("name");Integer age = (Integer)session.getAttribute("age");return "获取session成功 key1:" + name + " key2:" + age;}// 获取Session@RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name, @SessionAttribute("age") Integer age) {return "获取session成功 key1:" + name + " key2:" + age;}
获取header(2种方式)
// 获取header@RequestMapping("/getHeader1")public String getHeader1(HttpServletRequest request) {String connection = request.getHeader("Connection");return "获取header成功! header:" + connection;}// 获取header@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("Connection") String connection) {return "获取header成功! header:" + connection;}
返回响应
响应静态页面
@RestController = @Controller(返回视图) + @ResponseBody(返回数据),所以最后返回的就是数据
@ResponseBody 作用在类上,该类上的所有方法返回都是数据;作用在方法上返回的都是数据
@RequestMapping("/data")public String response() {return "index.html"; // 这是一个相对路径,就找不到这个页面}@RequestMapping("/static_page_data")public String responseStaticPage() {return "/index.html"; // 但是此处被是被为了字符串,原因是加了@RestController// @RestController = @Controller(返回视图) + @ResponseBody(返回数据),所以返回的是字符串,而不是视图,所以会找不到这个页面// 在类上使用@Controller注解,就会返回视图,就可以找到这个页面了}
响应html代码片段
// 响应html代码片段@RequestMapping("/responseHtml")@ResponseBody// 不加@ResponseBody就找不到这个字符串// 因为@Controller返回的是视图// @RestController(返回数据) = @Controller(返回视图) + @ResponseBody(返回数据)public String responseHtml() {return "<h1>Hello World</h1>";}
响应JSON对象
// 响应JSON对象@RequestMapping("/json")@ResponseBodypublic Person responseJSON() {Person person = new Person();person.setName("张三");person.setAge(20);person.setGender("男");return person;}
设置Connect-Type
// 设置connect-type@ResponseBody@RequestMapping("/connect_type")public void setConnectType1(HttpServletResponse response) throws IOException {response.setContentType("text/plain"); // text/plain,返回的是纯文本response.getOutputStream().write("<h1>Hello World</h1>".getBytes(StandardCharsets.UTF_8));}// 设置connect-type@ResponseBody@RequestMapping(value = "/setConnectType" , produces = "text/plain") public String setConnectType2 (HttpServletResponse response) throws IOException {// response.getOutputStream().write("<h1>Hello World</h1>".getBytes(StandardCharsets.UTF_8));return "<h1>hello word</h1>";}
小结练习:
登录练习和留言练习
API的实现
@RestController
@RequestMapping("/test")
public class TestController {@PostMapping("/login")public Boolean login(@RequestBody User user, HttpSession session) {System.out.println("参数到达后端:user " + user.toString());/*** 校验参数* TODO 校验密码是否正确*/if(!StringUtils.hasLength(user.getUserName()) || !StringUtils.hasLength(user.getPassword())) {System.out.println("用户名或密码不规范");return false;}if("admin".equals(user.getUserName()) && "admin".equals(user.getPassword())) {// 存储用户session.setAttribute("userName", user.getUserName());session.setAttribute("password", user.getPassword());return true;}return false;}@GetMapping("/loginUser")public String loginUser(HttpServletRequest request) {System.out.println("登录用户的获取!");HttpSession session = request.getSession(false);// 判断Session是否有数据if(session != null) {String userName = (String)session.getAttribute("userName");return "登录用户:" + userName;}return "没用用户登录";}List<Message> messages = new ArrayList<>();@PostMapping("publishMessage")public Boolean publishMessage(@RequestBody Message message) {System.out.println("留言参数到达后端 message:" + message);/*** 校验参数* 存储数据*/if(!StringUtils.hasLength(message.getContent())|| !StringUtils.hasLength(message.getReceiver())|| !StringUtils.hasLength(message.getContent())) {System.out.println("请正确填写留言板!");return false;}messages.add(message); // 存储数据return true;}@GetMapping("/messageList")public List<Message> messageList() {System.out.println("所有留言展现!");return messages;}
}
进行前后端交互
<body><div class="container"><h1 style="color: #333;">留言板</h1><p class="grey">输入后点击提交, 会将信息显示下方空白处</p><div class="row"><span>谁:</span> <input type="text" name="" id="from"></div><div class="row"><span>对谁:</span> <input type="text" name="" id="to"></div><div class="row"><span>说什么:</span> <input type="text" name="" id="say"></div><input type="button" value="提交" id="submit" onclick="submit()"><!-- <div>A 对 B 说: hello</div> --></div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({url:"/test/messageList",type:"get",success:function (messages) {// 遍历结果数组,将每个留言显示在页面上for(let message of messages) {var msg = message.commenter + " 对 " + message.receiver + " 说: " + message.content;var messageElement = $("<div>" + msg + "</div>");$(".container").append(messageElement);}}});function submit() {// 获取数据var commenter = $('#from').val();var receiver = $('#to').val();var content = $('#say').val();// 调用后端接口$.ajax({url:"/test/publishMessage",type:"post",contentType:"application/json",data:JSON.stringify({commenter:commenter,receiver:receiver,content:content}),success:function (result) {if(result) {// 在留言板上显示留言var message = commenter + " 对 " + receiver + " 说: " + content;var messageElement = $("<div>" + message + "</div>");$(".container").append(messageElement);// 清空输入框的值$('#from').val("");$('#to').val("");$('#say').val("");} else {alert("留言失败!")}}});}</script>
</body>
相关文章:

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...