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

SpringMVC——第7章:HttpMessageConverter

一、HttpMessageConverter

HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为:HTTP消息转换器。该接口下提供了很多实现类,不同的实现类有不同的转换方式。

image.png

1.什么是HTTP消息

HTTP消息其实就是HTTP协议。HTTP协议包括请求协议和响应协议。

以下是一份HTTP POST请求协议:

以下是一份HTTP GET请求协议:

以下是一份HTTP响应协议:

2.转换器转换的是什么

转换的是HTTP协议Java程序中的对象之间的互相转换。请看下图:

上图是我们之前经常写的代码。请求体中的数据是如何转换成user对象的,底层实际上使用了HttpMessageConverter接口的其中一个实现类FormHttpMessageConverter。 通过上图可以看出FormHttpMessageConverter是负责将请求协议转换为Java对象的。

再看下图:

上图的代码也是之前我们经常写的,Controller返回值看做逻辑视图名称,视图解析器将其转换成物理视图名称,生成视图对象,StringHttpMessageConverter负责将视图对象中的HTML字符串写入到HTTP协议的响应体中。最终完成响应。

通过上图可以看出StringHttpMessageConverter是负责将Java对象转换为响应协议的。


通过以上内容的学习,大家应该能够了解到HttpMessageConverter接口是用来做什么的了:

无标题.png

如上图所示:HttpMessageConverter接口的可以将请求协议转换成Java对象,也可以把Java对象转换为响应协议。

HttpMessageConverter是接口,SpringMVC帮我们提供了非常多而丰富的实现类。每个实现类都有自己不同的转换风格。

对于我们程序员来说,Spring MVC已经帮助我们写好了,我们只需要在不同的业务场景下,选择合适的HTTP消息转换器即可。

怎么选择呢?当然是通过SpringMVC为我们提供的注解,我们通过使用不同的注解来启用不同的消息转换器。

在HTTP消息转换器这一小节,我们重点要掌握的是两个注解两个类:

  • @ResponseBody

  • @RequestBody

  • ResponseEntity

  • RequestEntity

二、Spring MVC中的AJAX请求

SpringMVC+Vue3+Thymeleaf+Axios发送一个简单的AJAX请求。

引入Vue和Axios的js文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--组件扫描--><context:component-scan base-package="org.example1.controller"/><!--视图解析器--><bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver"><property name="characterEncoding" value="UTF-8"/><property name="order" value="1"/><property name="templateEngine"><bean class="org.thymeleaf.spring6.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/thymeleaf/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML"/><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--开启注解驱动--><mvc:annotation-driven/><!--视图控制器--><mvc:view-controller path="/" view-name="index"/><!--静态资源处理,开启默认的Servlet--><mvc:default-servlet-handler/>
</beans>

重点是静态资源处理、开启注解驱动、视图控制器映射等相关配置。


Vue3+Thymeleaf+Axios发送AJAX请求:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title><!--引入vue--><script th:src="@{/static/js/vue3.4.21.js}"></script><!--引入axios--><script th:src="@{/static/js/axios.min.js}"></script>
</head>
<body>
<h1>使用Vue3 + axios + Thymeleaf + SpringMVC发送AJAX请求</h1>
<hr><div id="app"><button @click="getMessage">获取消息</button><h1>{{message}}</h1>
</div><script th:inline="javascript">Vue.createApp({data(){return {message : '这里消息将被刷新'}},methods : {// 异步方法(ajax请求多数情况下都是异步请求)async getMessage(){// 发送ajax请求let response = await axios.get([[@{/}]] + 'ajax')// 将返回的数据交给messagethis.message = response.data}}}).mount("#app")</script>
</body>
</html>

重点来了,Controller怎么写呢,之前我们都是传统的请求,Controller返回一个**逻辑视图名**,然后交给**视图解析器**解析。最后跳转页面。而AJAX请求是不需要跳转页面的,因为AJAX是页面局部刷新,以前我们在Servlet中使用**response.getWriter().print("message")**的方式响应。在Spring MVC中怎么办呢?当然,我们在Spring MVC中也可以使用Servlet原生API来完成这个功能,代码如下:

启动服务器测试:http://localhost:8080/springmvc/


难道我们以后AJAX请求都要使用原生Servlet API吗?

  • 不需要,我们可以使用SpringMVC中提供的HttpMessageConverter消息转换器。

我们要向前端响应一个字符串"hello",这个"hello"就是响应协议中的响应体。

我们可以使用 @ResponseBody 注解来启用对应的消息转换器。而这种消息转换器只负责将Controller返回的信息以响应体的形式写入响应协议。

三、@ResponseBody

1.StringHttpMessageConverter

上面的AJAX案例,Controller的代码可以修改为:

测试:


最核心需要理解的位置是:return "hello ajax, my name is Spring MVC!";

这里的"hello ajax, my name is Spring MVC!"不是逻辑视图名了,而是作为响应体的内容进行响应。直接输出到浏览器客户端。 以上程序中使用的消息转换器是:StringHttpMessageConverter,为什么会启用这个消息转换器呢?因为你添加@ResponseBody这个注解。

通常AJAX请求需要服务器给返回一段JSON格式的字符串,可以返回JSON格式的字符串吗?当然可以,代码如下:

测试:


这是完全可以的,此时底层使用的消息转换器还是:StringHttpMessageConverter

那如果在程序中是一个POJO对象,怎么将POJO对象以JSON格式的字符串响应给浏览器呢?两种方式:

  • 第一种方式:自己写代码将POJO对象转换成JSON格式的字符串,用上面的方式直接return即可。

  • 第二种方式:启用MappingJackson2HttpMessageConverter消息转换器。

2.MappingJackson2HttpMessageConverter

启用MappingJackson2HttpMessageConverter消息转换器的步骤如下:

第一步:引入jackson依赖,可以将java对象转换为json格式字符串

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version>
</dependency>

第二步:开启注解驱动 这一步非常关键,开启注解驱动后,在HandlerAdapter中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter

<mvc:annotation-driven/>

第三步:准备一个POJO

package org.example1.bean;public class User {private Long id;private String name;private String password;@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User() {}public User(Long id, String name, String password) {this.id = id;this.name = name;this.password = password;}
}

第四步:控制器方法使用 @ResponseBody 注解标注(非常重要),控制器方法返回这个POJO对象

测试:

以上代码底层启用的就是 MappingJackson2HttpMessageConverter 消息转换器。

他的功能很强大,可以将POJO对象转换成JSON格式的字符串,响应给前端。

其实这个消息转换器MappingJackson2HttpMessageConverter本质上只是比StringHttpMessageConverter多了一个json字符串的转换,其他的还是一样。

四、@RestController

因为我们现代的开发方式都是基于AJAX方式的,因此 @ResponseBody 注解非常重要,很常用。

为了方便,Spring MVC中提供了一个注解 @RestController。这一个注解代表了:@Controller + @ResponseBody。

@RestController 标注在类上即可。被它标注的Controller中所有的方法上都会自动标注 @ResponseBody

@RestController
public class AJAXController {@GetMapping("/ajax")//@ResponseBodypublic User ajax() {User user = new User(111222L, "lisi", "123");return user;}
}

五、@RequestBody


其核心作用如下:

  1. 读取请求体数据并解析绑定
    利用系统默认的 HttpMessageConverter 解析请求体(如 HTTP 请求的 body 部分),将数据转换后绑定到控制器方法的参数上。例如,前端发送包含 JSON 数据的请求体,@RequestBody 可将其解析并映射到对应的 Java 对象,方便后续业务逻辑处理。

  2. 处理非默认编码格式
    常用于处理 content-type 非 application/x-www-form-urlencoded 的内容,如 application/jsonapplication/xml 等。最典型的是解析 JSON 数据,将其自动转换为 Java 对象(需确保项目引入 JSON 处理依赖,如 Jackson)。例如:

@PostMapping("/user")  
public String createUser(@RequestBody User user) {  // 处理用户对象  return "success";  
}  

此时,前端发送的 JSON 数据(如 {"name":"张三","age":20})会被解析并赋值给 User 对象的对应属性。


1.FormHttpMessageConverter

这个注解的作用是直接将请求体传递给Java程序,在Java程序中可以直接使用一个String类型的变量接收这个请求体的内容。

在没有使用这个注解的时候:

@RequestMapping("/save")
public String save(User user){// 执行保存的业务逻辑userDao.save(user);// 保存成功跳转到成功页面return "success";
}

当请求体提交的数据是:

username=zhangsan&password=1234&email=zhangsan@powernode.com

那么Spring MVC会自动使用 FormHttpMessageConverter消息转换器,将请求体转换成user对象。


当使用这个注解的时候:这个注解只能出现在方法的参数上。

@RequestMapping("/save")
public String save(@RequestBody String requestBodyStr){System.out.println("请求体:" + requestBodyStr);return "success";
}

Spring MVC仍然会使用 FormHttpMessageConverter消息转换器,将请求体直接以字符串形式传递给 requestBodyStr 变量。 测试输出结果:

2.MappingJackson2HttpMessageConverter

另外,如果在请求体中提交的是一个JSON格式的字符串,这个JSON字符串传递给Spring MVC之后,能不能将JSON字符串转换成POJO对象呢?答案是可以的。 此时必须使用@RequestBody 注解来完成 。并且底层使用的消息转换器是:MappingJackson2HttpMessageConverter。实现步骤如下:

  • 第一步:引入jackson依赖

  • 第二步:开启注解驱动

  • 第三步:创建POJO类,将POJO类作为控制器方法的参数,并使用 @RequestBody 注解标注该参数

  • 第四步:在请求体中提交json格式的数据

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title><!--引入vue--><script th:src="@{/static/js/vue3.4.21.js}"></script><!--引入axios--><script th:src="@{/static/js/axios.min.js}"></script>
</head>
<body>
<h1>使用Vue3 + axios + Thymeleaf + SpringMVC发送AJAX请求</h1>
<hr>
<form th:action="@{/save}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="保存">
</form><hr><div id="app"><button @click="getMessage">获取消息</button><h1>{{message}}</h1>
</div><script th:inline="javascript">// 发送ajax post请求,并且在请求体当中提交json数据let jsonObj = {"name" : "zhangsan", "password" : "1234"}Vue.createApp({data(){return {message : ''}},methods : {async getMessage(){let response = await axios.post([[@{/}]] + 'save2', JSON.stringify(jsonObj), {headers : {"Content-Type" : "application/json"}})// 将返回的数据交给messagethis.message = response.data}}}).mount("#app")</script>
</body>
</html>

测试结果:


六、RequestEntity

RequestEntity不是一个注解,是一个普通的类。这个类的实例封装了整个请求协议:包括请求行、请求头、请求体所有信息。 出现在控制器方法的参数上:

测试结果:

在实际的开发中,如果你需要获取更详细的请求协议中的信息。可以使用RequestEntity

七、ResponseEntity

ResponseEntity不是注解,是一个类。用该类的实例可以封装响应协议,包括:状态行、响应头、响应体。

也就是说:如果你想定制属于自己的响应协议,可以使用该类。

假如我要完成这样一个需求:前端提交一个id,后端根据id进行查询,如果返回null,请在前端显示404错误。如果返回不是null,则输出返回的user。

service

超链接

测试

相关文章:

SpringMVC——第7章:HttpMessageConverter

一、HttpMessageConverter HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 1.什么是HTTP消息 HTTP消息其实就是HTTP协议。HTTP协议包括请求协议和响应协议。…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.4 异构数据源整合(CSV/JSON/Excel数据导入)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL异构数据源整合&#xff1a;CSV/JSON/Excel数据导入全攻略4.4 异构数据源整合&#xff1a;多格式数据导入实战4.4.1 CSV数据导入&#xff1a;高效批量处理4.4.1.1…...

在macOS上安装windows系统

使用Boot Camp 1. 准备工作&#xff1a;确认Mac满足Boot Camp系统要求&#xff0c;准备好Windows安装光盘或ISO映像文件&#xff0c;以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理&#xff1a;在“应用程序”文件夹的“实用工具”中找到“Boot…...

最长回文子串(动规 + 中心拓展)

目录 [BM73 最长回文子串](https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId295&tags&title&difficulty0&judgeStatus0&rp0&sourceUrl/exam/oj?questionJobId10&subTabNameonline_coding_page)1. 动态规划(1)状态表示:…...

学习海康VisionMaster之亮度测量

一&#xff1a;进一步学习了 今天学习下VisionMaster中的亮度测量&#xff1a;这个和前面学习的都不一样了&#xff0c;这个是测量ROI区域内的平均亮度等 1&#xff1a;什么是亮度测量&#xff1f; 我们工业上用的相机里面有一个感光芯片&#xff08;CCD/CMOS&#xff09;&…...

LeetCode 238:除自身以外数组的乘积(Java实现)

文章目录 **题目描述**解决思路1. 两次遍历法&#xff08;左右乘积法&#xff09;2. 核心思想 Java代码实现复杂度分析示例说明步骤分解 注意事项总结 题目描述 给定一个整数数组 nums&#xff0c;返回一个数组 answer&#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外…...

LintCode第23题-判断数字与字母字符 第145题-大小写转换 第283题-三数之中的最大值

思路: 直接使用包装类的方法来判断 比如: isLetter(char c)判断是否是字母&#xff08;包括大小写、非英语字母也行&#xff09; isDigit(char c)判断是否是数字&#xff08;0~9&#xff09; isLetterOrDigit(char c)是否是字母或数字&#xff08;等价于 isLetter isLower…...

Visual Studio 项目转Qt项目

1. 先确保qmake 和 minGW &#xff08;g&#xff09; 路径都在系统变量内&#xff1b;或者通过WinR -> cmd 来检测&#xff0c; 如果能够 显示qmake 的信息 &#xff0c; g 的信息 &#xff0c; 就说明设置环境变量成功。 2. 打开项目文件夹&#xff0c;在这里打开cmd, 换…...

判断字符是否唯一 --- 位运算

目录 一&#xff1a;题目 二&#xff1a;算法与原理 三&#xff1a;代码分析 一&#xff1a;题目 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法与原理 三&#xff1a;代码分析 class Solution { publ…...

react路由使用方法

react路由常用方法 一、router安装与基础路由二、路由跳转三、路由参数四、路由嵌套无论是小程序端、web端还是移动端前端开发都需要使用到路由组件,学会了路由之后便可以灵活开发各种交互页面。可以说路由在前端开发中占有非常重要的位置。在React中,路由使用方式和Vue比较相…...

Wannier90文件与参数

Wannier90源码https://github.com/wannier-developers/wannier90/releases/tag/v3.1.0 用法 Wannier90 可以以两种模式运行&#xff1a; 后处理模式 Post-processing mode&#xff1a;从文件中读取第一性原理代码计算得到的重叠和投影。我们预计这是使用 wannier90 最常见的…...

学习黑客Nmap 原理

练气期第一重 — 神识探查术&#xff08;Nmap 原理&#xff09; 场景设定 诸位道友&#xff08;学生&#xff09;刚踏入信息安全修真界&#xff0c;手中只有一柄“网路灵剑”&#xff08;本地终端&#xff09;。想要探知远处服务器的灵脉&#xff08;端口&#xff09;、功法&am…...

VBA信息获取与处理专题五:VBA利用CDO发送电子邮件

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

Git 第一讲---基础篇 git基础概念与操作

前言&#xff1a; Git&#xff0c;作为目前全球最流行的分布式版本控制系统&#xff0c;以其高效、灵活和强大的分支管理能力&#xff0c;成为开发者手中不可或缺的工具。从个人开源项目到企业级应用&#xff0c;Git的身影无处不在。然而&#xff0c;对初学者而言&#xff0c;…...

心衰生物标志物NT-ProBNP和BNP

B型利钠肽&#xff08;BNP&#xff09;和N末端B型利钠肽原&#xff08;NT-proBNP&#xff09;都属于利尿钠肽&#xff08;NP&#xff09;家族。当发生心衰时&#xff0c;NT-ProBNP和BNP的浓度会升高&#xff0c;它们是心衰&#xff08;HF&#xff09;和心功能障碍诊疗中应用最广…...

Winform(11.案例讲解1)

今天写两个案例,用于更好的理解控件的使用 在写之前先写一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.案例讲解 { internal class Student { public string …...

卡尔曼滤波详解

1. 卡尔曼滤波能解决什么问题&#xff1f; 卡尔曼滤波用于解决含噪声的动态系统状态估计问题&#xff0c;例如&#xff1a; 通过GPS和IMU数据估计车辆位置 通过电压电流测量估计电池电量(SOC) 雷达追踪飞行器轨迹 它的核心优势是&#xff1a; 递归计算&#xff1a;只需前一…...

数据类型:String

String目录 SetGetMsetMgetIncrIncrbySubstrGetrangeSetrange String是字符串类型&#xff0c; redis给我们提供了String类型的value&#xff0c; 但是内部的实现一共有三种&#xff1a; int、embstr、raw&#xff1b; 三种的不同之处在于当value长度较小的时候使用embstr和int…...

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…...

Hive安装与配置教程

Hive安装与配置教程 1. 环境准备 1.1 系统要求 Java 8或更高版本Hadoop 2.x或更高版本MySQL或其他关系型数据库&#xff08;用于存储元数据&#xff09; 1.2 安装依赖 # 安装Java sudo apt update sudo apt install openjdk-8-jdk# 安装MySQL sudo apt install mysql-serv…...

C++负载均衡远程调用学习之获取主机信息功能

目录 01Lars-lbAgentV0.2-赋值均衡数据结构关系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb数据结构的定义 03Lars-lbAgentV0.2-proto协议的定义 04 Lars-lbAgentV0.2-route_lb与UDP server的关联 05 -Lars-lbAgentV0.2-route_lb与UDP server的关联 06Lars…...

C++ 适配器模式详解

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间能够协同工作。 概念解析 适配器模式的核心思想是&#xff1a; 接口转换&#xff1a;将一个类的接口转换成客户希望的另一个接口 兼容性&#xff1a;使原本由于接…...

2025.5.5总结

今日感悟&#xff1a;这假期就这样结束了&#xff0c;玩了一次滑板&#xff0c;打扫了一次租房&#xff0c;出去逛了一次街&#xff0c;看完了一本书&#xff0c;追了一部剧。既没有家人&#xff0c;也没有能一同畅饮的同学&#xff0c;更没有对象&#xff0c;显得确实有些孤独…...

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…...

kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程

一 从 LiveData 迁移到 Kotlin Flow 完整教程 LiveData 长期以来是 Android 架构组件中状态管理的核心&#xff0c;但随着 Kotlin Flow 的成熟&#xff0c;Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节&#xff0c;完成平滑迁移。 一、为什…...

PostgreSQL 的 pg_ls_waldir 函数

PostgreSQL 的 pg_ls_waldir 函数 pg_ls_waldir 是 PostgreSQL 中用于列出预写式日志(WAL)目录内容的重要函数&#xff0c;特别适用于 WAL 文件管理和数据库恢复场景。 一、函数基本说明 语法 pg_ls_waldir() RETURNS SETOF text功能 返回 WAL 目录中所有文件的名称集合在…...

形式化数学——Lean求值表达式

作为学习 Lean 的程序员&#xff0c;最重要的是理解求值的工作原理。求值是求得表达式的值的过程&#xff0c;就 像算术那样。例如&#xff0c;15 - 6 的值为 9&#xff0c;2 (3 1) 的值为 8。要得到后一个表达式的值&#xff0c;首先将 3 1 替换为 4&#xff0c;得到 2 4&…...

杰理-AC696音箱linein无法插入检测

杰理-AC696音箱linein无法插入检测 阻值选用1k&#xff0c;原公版原理图上68k,导致内部上拉电压一直不能掉下来&#xff0c;软件一直无法检测到。...

zst-2001 历年真题 程序设计语言

程序设计语言1 b 程序设计语言2 c 程序设计语言3 a 程序设计语言4 b中解释语言可以用高级语言编写 c优化 d反了 a 程序设计语言5 c 程序设计语言6 重复就是循环 b 程序设计语言7 a 程序设计语言8 c就是malloc&#xff0c;动态扩展数组&#xff0c;和类型没什…...

VirtualBox调整虚拟机内存和CPU

当我们配置的虚拟机内存或CPU不足以支撑开发需要时&#xff0c;需要及时调整内存和CPU大小。调整前如果虚拟机在运行&#xff0c;需要先关机。 下面的步骤是居于VirtualBox 6.1版本&#xff0c;不同版本的操作界面会有些许差异。 1.选中要调整的虚拟机&#xff0c;点击设置 2…...

SpringMVC框架详解与实践指南

文章目录 一、三层架构与MVC模型1. 三层架构2. MVC模型 二、SpringMVC入门案例1. 环境搭建2. 核心配置3. 编写Controller 三、执行流程与组件分析四、RequestMapping注解五、请求参数绑定1. 基本类型与对象绑定2. 嵌套对象与集合绑定 六、中文乱码解决方案(前端传到后端)1. Str…...

C语言 ——— 函数

目录 函数是什么 库函数 学习使用 strcpy 库函数 自定义函数 写一个函数能找出两个整数中的最大值 写一个函数交换两个整型变量的内容 牛刀小试 写一个函数判断一个整数是否是素数 写一个函数判断某一年是否是闰年 写一个函数&#xff0c;实现一个整型有序数组的二分…...

洛谷 P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version)

这道题可不入门。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定 n n n&#xff0c;求有多少组 ( x , y , z ) (x,y,z) (x,y,z) 满足&#xff1a; x − y z n ! x-\dfrac{y}{z}n! x−zy​n! x − y z n ! n \dfrac{x-y…...

Java基础学完,继续深耕(0505)Linux 常用命令

昨天休息了一天&#xff0c;没有写csdn 昨天和今天把Linux大概学了一下。总结一下常用命令&#xff0c;总结的不全。 Linux目录结构 / 是所有目录的顶点 目录结构像一颗倒挂的树 注意&#xff1a;/itheima 是绝对路径&#xff0c;是指根目录 / 下的itheima目录 itheima…...

详解 FFMPEG 交叉编译 `FLAGS` 和 `INCLUDES` 的作用

FLAGS 和 INCLUDES这两行是 Android NDK 编译时的编译器选项&#xff0c;用于控制代码生成、优化、调试、安全性和头文件搜索路径。下面逐项详解&#xff1a; 1. FLAGS 详解&#xff08;编译器选项&#xff09; FLAGS 定义了传递给 C/C 编译器&#xff08;如 clang 或 gcc&…...

DGI数据治理框架的最佳实践

以下是针对DGI数据治理框架的最佳实践推荐&#xff0c;结合其核心理念与实际应用场景&#xff0c;帮助组织高效落地数据治理&#xff0c;释放数据价值。 一、组织架构与角色分工 最佳实践1&#xff1a;建立清晰的数据治理委员会 • 实践要点&#xff1a; • 由高层领导&#…...

C++类与对象深度解析:从基础到应用

目录&#xff1a; 1. 类的基本概念与定义1.1 类的定义与访问限定符1.2 实例化与对象内存布局1.3 this指针 2.类的默认成员函数2.1 构造函数与析构函数详解构造函数析构函数 2.2 拷贝构造函数2.3 赋值运算符重载运算符重载 3. 初始化列表4.类型转换5. 静态成员6.友元和内部类6.1…...

JGQ611Ⅱ数据采集电除雾器实验装置

JGQ611Ⅱ数据采集电除雾器实验装置 一.实验目的 1.掌握电除雾器的结构特征与工作原理。 2.测定风压、风速、电压、电流板间距等因素对酸雾去除效率的影响。 3.测定电除雾器的工作效率。 二.技术指标 1.电场电压&#xff1a;0&#xff5e;20KV&#xff08;可调&#xff09;。 2.…...

如何判断cgroup的版本?

在 Linux 系统中&#xff0c;判断当前使用的 cgroup 版本&#xff08;v1 还是 v2&#xff09;可以通过以下几种方法&#xff1a; 方法一&#xff1a;查看挂载点&#xff08;最直接&#xff09; mount | grep cgroup输出分析 cgroups v1&#xff1a;存在多个以 cgroup 开头的…...

基于 Spark 和 Hadoop 的空气质量数据分析与预测系统

基于 Spark 和 Hadoop 的空气质量数据分析与预测系统 文章目录 基于 Spark 和 Hadoop 的空气质量数据分析与预测系统引言项目目标技术栈数据来源系统核心功能1. 用户认证与管理2. 数据总览3. 空气质量分析4. 词云图5. AQI 预测 项目结构预览关键代码分享1. Flask 主文件&#x…...

qt csv文件写操作

实例1&#xff1a; QStringList header; header << "1" << "2"; QStringList footer; footer << "Here is a footer"; QStringList strList; strList << "one" << "two" <&l…...

Java 反射

反射 反射的概述 获取class对象的三种方式 代码实现 package myreflect1;public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//1.第一种方式//全类名&#xff1a;包名类名//最为常用Class clazz1 Class.forName("…...

Spring-使用Java的方式配置Spring

目录 前言 一、使用Java配置Spring 前言 使用纯Java的配置方式&#xff0c;在SpringBoot中随处可见&#xff0c;是必须要学习的 一、使用Java配置Spring 配置Spring有多种方式&#xff0c;我们现在要完全不使用Spring的xml配置了&#xff0c;全权交给Java来做&#xff01; J…...

cudaMalloc函数说明

cudaMalloc函数说明 cudaError_t cudaMalloc(void** devPtr, size_t size);参数说明 devPtr (输出参数): 类型为 void**&#xff0c;即指向指针的指针。函数执行成功后&#xff0c;*devPtr 将被赋值为 GPU 内存的起始地址。例如&#xff1a;若分配一个 float 数组&#xff0c;需…...

路由协议(静态路由、RIP、OSPF、BGP)

目录 静态路由 RIP OSP BGP 总结 静态路由 定义&#xff1a;由网络管理员手动配置的路由。它不会自动更新&#xff0c;除非管理员手动修改。 特点&#xff1a; 简单&#xff1a;配置简单&#xff0c;适合小型网络。安全&#xff1a;不会与其他路由器交换路由信息&#x…...

基于 HTML5 的贪吃蛇小游戏实现

一、引言 在 Web 开发的世界中&#xff0c;利用 HTML、CSS 和 JavaScript 构建有趣的互动游戏是一项充满乐趣和挑战的任务。本文将详细介绍一个基于 HTML5 的贪吃蛇小游戏的实现过程&#xff0c;通过对代码的解析&#xff0c;带你了解如何打造一个经典的贪吃蛇游戏&#xff0c…...

学习Linux的第二天

如何在Linux环境下做开发 Linux的一些基操 Tips&#xff1a;平常最表层的是命令行模式&#xff0c;最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…...

rollout 是什么:机器学习(强化学习)领域

rollout 是什么:机器学习(强化学习)领域 指从特定初始状态开始,按照某个策略或模型进行一系列动作和状态转移,直到达到终止状态或预定时间步数 。比如: 迷宫任务:强化学习代理在迷宫中,从起始点出发,按某策略(如随机选方向走)进行移动,直到找到出口或达到最大移动…...

MATLAB人工大猩猩部队GTO优化CNN-LSTM多变量时间序列预测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0 引言 1 数据准备 2 CNN-LSTM模型搭建 3 GTO超参数优化 3.1 GTO函数极值寻优 3.2 GTO优化CNN-LSTM超参数 3.3 主程序 4 结语 0 引言…...

android-ndk开发(3): 连接设备到开发机

android-ndk开发(3): 连接设备到开发机 2025/05/05 1. 术语解释 用来写代码的电脑&#xff0c; 我叫做开发机。 我打心底认为 Windows, Linux, macOS 都是 PC&#xff0c; 但是有些人不这么认为&#xff0c; 那就还是叫开发机。 android 手机能运行 app&#xff08;众所周知…...