当前位置: 首页 > article >正文

【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种方式)

获取cookie(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进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

12.找到字符串中所有字母异位词

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

MySQL 8.0 OCP 英文题库解析(十三)

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

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; 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协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NFT模式:数字资产确权与链游经济系统构建

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

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用

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

微信小程序云开发平台MySQL的连接方式

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

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

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

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...