Spring MVC 中使用 RESTFul 编程风格

1. Spring MVC 中使用 RESTFul 编程风格

文章目录

  • 1. Spring MVC 中使用 RESTFul 编程风格
  • 2. RESTFul 编程风格
    • 2.1 RESTFul 是什么
    • 2.2 RESTFul风格与传统方式对比
  • 3. Spring MVC 中使用 RESTFul 编程风格(增删改查)的使用
    • 3.1 准备工作
    • 3.2 RESTFul 风格的 “查询” 所有(RESTFul 规范 需要发送 GET请求)
    • 3.3 RESTFul 风格的 根据 “id 查询”( RESTFul 规范 需要发送 GET请求)
    • 3.4 RESTFul 风格的 “增加数据” (RESTFul 规范 需要发送 POST 请求)
    • 3.5 RESTFul 风格的 “修改数据” (RESTFul 规范 需要发送 PUT 请求)
    • 3.6 RESTFul 风格的 “删除数据” 数据(RESTFul 规范 需要发送 DELETE 请求)
  • 4. 补充: HiddenHttpMethodFilter 过滤器源码说明
  • 5. 总结:
  • 6. 最后:


2. RESTFul 编程风格

2.1 RESTFul 是什么

RESTFul 是 web 服务器接口 的一种设计风格。

RESTFul 定义了一组约束条件和规范,可以让 web服务器接口 更加简洁,易于理解,易于扩展,安全可靠。

RESTFUl 对一个 web 服务器接口 都规定了哪些东西 ?

  1. 对请求的 URL 格式有约束和规范
  2. 对 HTTP 的请求方式有约束和规范
  3. 对请求和响应的数据格式有约束和规范
  4. 对 HTTP 状态码有约束和规范
  5. 等…

REST 对请求方式的约束是这样的:

  1. 查询必须发送 GET 请求
  2. 新增必须发送 POST 请求
  3. 修改必须发送 PUT 请求
  4. 删除必须发送 DELETE 请求

REST对 URL 的约束时这样的:

  1. 传统的 URL : get 请求,/springmvc/getUserById?id=1
  2. REST风格的 URL:get 请求,/springmvc/user/1
  3. 传统的URL :get 请求,/springmvc/deleteUserById?id=1
  4. REST风格的URL:delete 请求,/springmvc/user/1

RESTFul 对 URL 的约束和规范的核心时:通过采用不同的请求方式 + URL 来确定 web 服务中的资源。

RESTFul 的英文全称时:Representational State Transfer(表述性状态转移),简称 REST。

表述性(Representational) 是:URL + 请求方式。

状态(State) 是 :服务器端的数据。

转移(Transfer) 是:变化。

表述性转移是指:通过 URL + 请求方式来控制服务器端数据的变化。

2.2 RESTFul风格与传统方式对比

统的 URL 与 RESTful URL 的区别是传统的 URL 是基于方法名进行资源访问和操作,而 RESTful URL 是基于资源的结构和状态进行操作的。下面是一张表格,展示两者之间的具体区别:

传统的 URLRESTful URL
GET /getUserById?id=1GET /user/1
GET /getAllUserGET /user
POST /addUserPOST /user
POST /modifyUserPUT /user
GET /deleteUserById?id=1DELETE /user/1

从上表中我们可以看出,传统的 URL是基于动作的,而 RESTful URL 是基于资源和状态的,因此 RESTful URL 更加清晰和易于理解,这也是 REST 架构风格被广泛使用的主要原因之一。

3. Spring MVC 中使用 RESTFul 编程风格(增删改查)的使用

3.1 准备工作

导入相关依赖 jar 包。

在这里插入图片描述

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rainbowsea</groupId><artifactId>springmvc-007</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!--springmvc依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.1.4</version></dependency><!--logback依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.3</version></dependency><!--servlet依赖--><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency><!--thymeleaf和spring6整合的依赖--><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring6</artifactId><version>3.1.2.RELEASE</version></dependency></dependencies></project>

相关包 / 目录的创建,配置。

在这里插入图片描述

springmvc.xml 配置文件的配置;

在这里插入图片描述

<?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/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--    组件扫描--><context:component-scan base-package="com.rainbowsea.springmvc.controller"></context:component-scan><!--    视图解析器--><bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver"><!--作用于视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集--><property name="characterEncoding" value="UTF-8"/><!--如果配置多个视图解析器,它来决定优先使用哪个视图解析器,它的值越小优先级越高--><property name="order" value="1"/><!--当 ThymeleafViewResolver 渲染模板时,会使用该模板引擎来解析、编译和渲染模板--><property name="templateEngine"><bean class="org.thymeleaf.spring6.SpringTemplateEngine"><!--用于指定 Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、模板资源名称、文件编码等信息,加载模板并对其进行解析--><property name="templateResolver"><bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver"><!--设置模板文件的位置(前缀)--><property name="prefix" value="/WEB-INF/templates/"/><!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html--><property name="suffix" value=".html"/><!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等--><property name="templateMode" value="HTML"/><!--用于模板文件在读取和解析过程中采用的编码字符集--><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--    开启注解驱动--><mvc:annotation-driven></mvc:annotation-driven><!--    视图控制器, 这个配置可以只写 对应 index的视图,不写对应的Controller,简化配置 --><mvc:view-controller path="/" view-name="index"></mvc:view-controller></beans>

3.2 RESTFul 风格的 “查询” 所有(RESTFul 规范 需要发送 GET请求)

RESTFul 规范中规定,如果要查询数据,需要发送 GET 请求。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>测试 RESTFul 编程风格</h1>
<hr>
<!--RESTFul 编程风格,查看用列表-->
<a th:href="@{/user}">查看用户列表</a> <br>
</body>
</html>

控制器 Controller:

在这里插入图片描述

import com.rainbowsea.springmvc.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller  // 交给 Spring IOC 容器进行管理
public class UserController {@RequestMapping(value = "/user", method = RequestMethod.GET)public String getAll() {System.out.println("正在查询所有用户信息...");return "ok";}}

ok 的页面视图:

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>OK页面</title>
</head>
<body><h1>OK !</h1></body>
</html>

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 RESTFul 风格的 根据 “id 查询”( RESTFul 规范 需要发送 GET请求)

RESTFul 规范中规定,如果要查询数据,需要发送GET请求。

首页index.html

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>测试 RESTFul 编程风格</h1>
<hr>
<!--RESTFul 编程风格,查看用列表-->
<a th:href="@{/user}">查看用户列表</a> <br><!--RESTFul 风格的,根据 id 查询用户信息-->
<a th:href="@{/user/1}">查询id=1的这个用户信息</a><br></body>
</html>

控制器 Controller:

在这里插入图片描述


import com.rainbowsea.springmvc.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller  // 交给 Spring IOC 容器进行管理
public class UserController {//@RequestMapping(value = "/user/{占位符}",method = RequestMethod.GET)@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)public String getById(@PathVariable(value = "id") String id) {System.out.println("正在根据用户 id 查询用户信息...用户 id 是" + id);return "ok";}}

启动服务器测试:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4 RESTFul 风格的 “增加数据” (RESTFul 规范 需要发送 POST 请求)

RESTFul规范中规定,如果要进行保存操作,需要发送POST请求。

这里我们添加一个 User Bean 类,用于作为对象进行存储。

在这里插入图片描述

package com.rainbowsea.springmvc.bean;public class User {private String username;private String password;private Integer age;public User() {}public User(String username, String password, Integer age) {this.username = username;this.password = password;this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +'}';}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

页面编写:

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>测试 RESTFul 编程风格</h1>
<hr>
<!--RESTFul 编程风格,查看用列表-->
<a th:href="@{/user}">查看用户列表</a> <br><!--RESTFul 风格的,根据 id 查询用户信息-->
<a th:href="@{/user/1}">查询id=1的这个用户信息</a><br><!--RESTFul 风格的,新增用户信息,新增必须发送POST请求,需要使用 form 表单-->
<form th:action="@{/user}" method="post">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="保存"></form>
<hr></body>
</html>

控制器 Controller:

在这里插入图片描述

启动服务器测试:

在这里插入图片描述

在这里插入图片描述

3.5 RESTFul 风格的 “修改数据” (RESTFul 规范 需要发送 PUT 请求)

RESTFul规范中规定,如果要进行保存操作,需要发送PUT请求。
如何发送PUT请求?

第一步:首先你必须是一个POST请求。
第二步:在发送POST请求的时候,提交这样的数据:_method=PUT ,使用隐藏域进行配置

在这里插入图片描述

第三步:在web.xml文件配置SpringMVC提供的过滤器:HiddenHttpMethodFilter

注意:

  <!--    隐藏域--><input type="hidden" name="_method" value="put">
隐藏域的 name 必须只能是 “_method”, value是 put(大小写忽略)

第一步:首先你必须是一个POST请求。

第二步:在发送POST请求的时候,提交这样的数据:_method=PUT

在这里插入图片描述

<h2>修改</h2>
<!-- RESTFul 风格的,修改用户信息,修改必须发送 put 请求,要发送 put 请求,首先必须是一个 Post 请求-->
<form th:action="@{/user}" method="post"><!--    隐藏域--><input type="hidden" name="_method" value="put">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="修改"></form>

在这里插入图片描述

第三步:在web.xml文件配置SpringMVC提供的过滤器:HiddenHttpMethodFilter

注意:该过滤器一定要在字符编码过滤器后面配置,不然,先设置的话,可能会出现获取到的请求数据是乱码

在这里插入图片描述

    <!--    添加一个过滤器,这个过滤器是springmvc提前写好的,直接用就行了,这个过滤器可以帮助你将请求POST转换成PUT请求/DELETE请求-->
<!--    同时注意: --><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name>
<!--        表示任意的 请求--><url-pattern>/*</url-pattern></filter-mapping>

页面编写:

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>测试 RESTFul 编程风格</h1>
<hr>
<!--RESTFul 编程风格,查看用列表-->
<a th:href="@{/user}">查看用户列表</a> <br><!--RESTFul 风格的,根据 id 查询用户信息-->
<a th:href="@{/user/1}">查询id=1的这个用户信息</a><br><!--RESTFul 风格的,新增用户信息,新增必须发送POST请求,需要使用 form 表单-->
<form th:action="@{/user}" method="post">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="保存"></form>
<hr><h2>修改</h2>
<!-- RESTFul 风格的,修改用户信息,修改必须发送 put 请求,要发送 put 请求,首先必须是一个 Post 请求-->
<form th:action="@{/user}" method="post"><!--    隐藏域--><input type="hidden" name="_method" value="put">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="修改"></form></body>
</html>

控制器 Controller:

在这里插入图片描述

启动服务器测试:

在这里插入图片描述

在这里插入图片描述

3.6 RESTFul 风格的 “删除数据” 数据(RESTFul 规范 需要发送 DELETE 请求)

RESTFul规范中规定,如果要进行 删除 操作,需要发送DELETE 请求。
如何发送 DELETE 请求?,和 发送 PUT 请求的三步是一样的,只需要将 value 的值改为 delete 即可

第一步:首先你必须是一个POST请求。
第二步:在发送POST请求的时候,提交这样的数据:_method=PUT ,使用隐藏域进行配置

在这里插入图片描述

第三步:在web.xml文件配置SpringMVC提供的过滤器:HiddenHttpMethodFilter

注意:

  <!--    隐藏域--><input type="hidden" name="_method" value="delete">
隐藏域的 name 必须只能是 “_method”, value是 delete (大小写忽略)

页面编写:

在这里插入图片描述

<hr>
<h2>删除用户</h2><!--RESTful风格的,删除用户西悉尼-->
<!--删除必须发送 DELETE 请求,和 PUT 请求实现方式相同-->
<!--发送 DELETE 请求的前提是POST请求,并且需要通过隐藏域提交,_method="delete"-->
<a th:href="@{user/120}" onclick="del(event)">删除用户id = 120 的用户信息</a>
<form id="delForm" method="post"><input type="hidden" name="_method" value="delete">
</form><script>function del(event) {// 获取表单let delForm = document.getElementById("delForm");// 给 form 的 action 赋值delForm.action = event.target.href;// 发送POST 请求提交表单delForm.submit();// 非常重要,你需要阻止超链接的默认行为event.preventDefault();}
</script>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>测试 RESTFul 编程风格</h1>
<hr>
<!--RESTFul 编程风格,查看用列表-->
<a th:href="@{/user}">查看用户列表</a> <br><!--RESTFul 风格的,根据 id 查询用户信息-->
<a th:href="@{/user/1}">查询id=1的这个用户信息</a><br><!--RESTFul 风格的,新增用户信息,新增必须发送POST请求,需要使用 form 表单-->
<form th:action="@{/user}" method="post">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="保存"></form>
<hr><h2>修改</h2>
<!-- RESTFul 风格的,修改用户信息,修改必须发送 put 请求,要发送 put 请求,首先必须是一个 Post 请求-->
<form th:action="@{/user}" method="post"><!--    隐藏域--><input type="hidden" name="_method" value="put">用户名: <input type="text" name="username"><br>密码:<input type="password" name="password"><br>年龄: <input type="text" name="age"><br><input type="submit" value="修改"></form><hr>
<h2>删除用户</h2><!--RESTful风格的,删除用户西悉尼-->
<!--删除必须发送 DELETE 请求,和 PUT 请求实现方式相同-->
<!--发送 DELETE 请求的前提是POST请求,并且需要通过隐藏域提交,_method="delete"-->
<a th:href="@{user/120}" onclick="del(event)">删除用户id = 120 的用户信息</a>
<form id="delForm" method="post"><input type="hidden" name="_method" value="delete">
</form><script>function del(event) {// 获取表单let delForm = document.getElementById("delForm");// 给 form 的 action 赋值delForm.action = event.target.href;// 发送POST 请求提交表单delForm.submit();// 非常重要,你需要阻止超链接的默认行为event.preventDefault();}
</script>
</body>
</html>

控制器 Controller:

在这里插入图片描述

package com.rainbowsea.springmvc.controller;import com.rainbowsea.springmvc.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller  // 交给 Spring IOC 容器进行管理
public class UserController {//@RequestMapping(value = "/user/{占位符}",method = RequestMethod.GET)@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)public String getById(@PathVariable(value = "id") String id) {System.out.println("正在根据用户 id 查询用户信息...用户 id 是" + id);return "ok";}@RequestMapping(value = "/user", method = RequestMethod.GET)public String getAll() {System.out.println("正在查询所有用户信息...");return "ok";}@RequestMapping(value = "/user", method = RequestMethod.POST)public String save(User user) {System.out.println("正在保存用户信息");System.out.println(user);return "ok";}@RequestMapping(value = "/user", method = RequestMethod.PUT)public String modify(User user) {System.out.println("正在修改用户信息" + user);return "ok";}@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)public String del(@PathVariable(value = "id") String id) {System.out.println("正删除用户 : " + id);return "ok";}}

启动服务器测试:

在这里插入图片描述

在这里插入图片描述

4. 补充: HiddenHttpMethodFilter 过滤器源码说明

HiddenHttpMethodFilter是Spring MVC框架提供的,专门用于RESTFul编程风格。
实现原理可以通过源码查看:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过源码可以看到,if语句中,首先判断是否为POST请求,如果是POST请求,调用request.getParameter(this.methodParam)。可以看到this.methodParam_method,这样就要求我们在提交请求方式的时候必须采用这个格式:_method=put。获取到请求方式之后,调用了toUpperCase转换成大写了。因此前端页面中小写的put或者大写的PUT都是可以的。if语句中嵌套的if语句说的是,只有请求方式是 PUT,DELETE,PATCH的时候会创建HttpMethodRequestWrapper对象。而HttpMethodRequestWrapper对象的构造方法是这样的:

在这里插入图片描述

这样method就从POST变成了:PUT/DELETE/PATCH

重点注意事项:CharacterEncodingFilter和HiddenHttpMethodFilter的顺序

细心的同学应该注意到了,在HiddenHttpMethodFilter源码中有这样一行代码:

在这里插入图片描述
)

大家是否还记得,字符编码过滤器执行之前不能调用 request.getParameter方法,如果提前调用了,乱码问题就无法解决了。因为request.setCharacterEncoding()方法的执行必须在所有request.getParameter()方法之前执行。因此这两个过滤器就有先后顺序的要求,在web.xml文件中,应该先配置CharacterEncodingFilter,然后再配置HiddenHttpMethodFilter。

5. 总结:

  1. RESTFul风格与传统方式对比区别

  2. RESTFul 风格的 “查询” 所有(RESTFul 规范 需要发送 GET请求)

  3. RESTFul 风格的 根据 “id 查询”( RESTFul 规范 需要发送 GET请求)

  4. RESTFul 风格的 “增加数据” (RESTFul 规范 需要发送 POST 请求)

  5. RESTFul 风格的 “修改数据” (RESTFul 规范 需要发送 PUT 请求)

    如何发送PUT请求?

    第一步:首先你必须是一个POST请求。
    第二步:在发送POST请求的时候,提交这样的数据:_method=PUT ,使用隐藏域进行配置

    在这里插入图片描述

第三步:在web.xml文件配置SpringMVC提供的过滤器:HiddenHttpMethodFilter**

注意:

  <!--    隐藏域--><input type="hidden" name="_method" value="put">
隐藏域的 name 必须只能是 “_method”, value是 put(大小写忽略)
  1. RESTFul 风格的 “删除数据” 数据(RESTFul 规范 需要发送 DELETE 请求);如何发送 DELETE 请求?,和 发送 PUT 请求的三步是一样的,只需要将 value 的值改为 delete 即可

  2. HiddenHttpMethodFilter 该过滤器一定要在字符编码过滤器后面配置,不然,先设置的话,可能会出现获取到的请求数据是乱码。

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

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

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

相关文章

git使用遇到的问题记录

文章目录 1. 记录以下问题*error: RPC failed; HTTP 307 curl 22 The requested URL returned error: 307* 1. 记录以下问题 error: RPC failed; HTTP 307 curl 22 The requested URL returned error: 307 第一种&#xff1a;clone的仓库地址或者账户密码发生改变&#xff1b;…

CentOS 7镜像列表服务下线,还想继续使用该怎么办?

目录 问题和解决方法 mirrorlist.centos.org 作用 vault.centos.org 作用 CentOS 7的生命周期已经在2024年6月30日终止&#xff08;End of Life&#xff0c;EOL&#xff09;&#xff0c;官方将不再对该版本进行问题修复、功能更新以及其他形式的维护支持。这意味着使用 Cent…

Websocket通信实战项目(js)(图片互传应用)(下)客户端H5+css+js实现

Rqtz : 个人主页 ​ 共享IT之美&#xff0c;共创机器未来 Sharing the Beauty of IT and Creating the Future of Machines Together 目录 起始 客户端GUI Javascripts连接websocket 使用localStorage保存用户输入的IP Websocket连接成功 Websocket接收数据 解析…

VC++配置Opencv库

VSOpenCVVC超详细的配置教程-CSDN博客 按照以上连接配置&#xff0c;基本上会成功 如果在cv::imshow()时报错&#xff0c;大概率是因为读取的图像为空&#xff0c;先检查图像是否为空 if(img.empty()){cout<<"图像为空"<<endl; } 如果图像为空&#…

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster&#xff0c;它结合了 MySQL 技术&#xff0c;使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…

leetcode 162 寻找峰值

直观解法1&#xff1a;遍历 算法复杂度O(n) int findPeakElement(vector<int>& nums) {int size nums.size();//一个元素&#xff0c;直接返回0if(size 1) return 0;//两个元素&#xff0c;返回最大的idxif(size 2) {if(nums[0] > nums[1]) return 0;else re…

科普文:Linux服务器性能调优之CPU调度策略和可调参数

概叙 进程 进程是操作系统虚拟出来的概念&#xff0c;用来组织计算机中的任务。计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用…

网络编程:UDP编程笔记

1.字节序的概念和转换 小端格式: 低位字节数据存储在低地址 大端格式: 高位字节数据存储在低地址 在主机上时为小端存储,在网络上时为大端,所以接收到数据时,要转为小端口 如下图: #include <arpa/inet.h> 发送者调用的函数: uint32_t htonl(uint32_t hostlong); //转…

【信息学奥赛】CSP-J/S初赛06 算法基础及时间/空间复杂度等问题

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

软件测试面试题:中间件MQ(消息队列)的优缺点

优点&#xff1a; 解耦性&#xff1a;比如在一个电商平台中&#xff0c;用户下单后&#xff0c;订单系统需要通知库存系统进行扣减。如果直接调用&#xff0c;两个系统就高度耦合。使用MQ&#xff0c;订单系统只需发送一个消息到队列&#xff0c;库存系统订阅这个消息进行处理&…

AI与学术的交响:ChatGPT辅助下的实验设计新篇章

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究中&#xff0c;实验设计是确保研究质量和结果可信度的关键环节。这篇文章我们将为大家介绍如何利用ChatGPT辅助完成学术论文的实验设计&#xff0c;通过提供灵感、优化实验步…

VUE Pinia状态持久化

效果 实现方法 插件&#xff1a;pinia-plugin-persistedstate 链接地址 具体操作 安装 npm i pinia-plugin-persistedstate 添加到 pinia 实例上 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia cre…

K8s 集群(kubeadm) CA 证书过期解决方案

Author&#xff1a;Arsen Date&#xff1a;2024/07/04 目录 一、现象描述二、解决方案三、集群验证 一、现象描述 之前有篇文章《K8s Token 过期解决方案&#xff08;Kubeadm&#xff09;》提到了默认生成的 Token 有效期只有 24 小时&#xff0c;过期后 Token 将不可用&#…

B端系统设计风格简洁与高效的完美融合

B端系统设计风格简洁与高效的完美融合

网工内推 | 厂商驻场云运维,最高13k,Base北京

01 华三&#xff08;外包弧聚&#xff09; &#x1f537;招聘岗位&#xff1a;中级桌面云虚拟化驻场工程师 &#x1f537;岗位职责&#xff1a; 1、要熟悉H3C CAS,H3C-worksapce云桌面平台、超融合原理、部署、运维&#xff1b; 2、了解虚拟化平台vmware。 &#x1f537;任职…

CIDEr(Consensus-based Image Description Evaluation)的计算

CIDEr&#xff08;Consensus-based Image Description Evaluation&#xff09; 论文原文 CIDEr: Consensus-based Image Description Evaluation CIDEr&#xff08;Consensus-based Image Description Evaluation&#xff09;是一种用于自动评估图像描述&#xff08;image ca…

基于java语言+ Vue+ElementUI+ MySQL8.0.36数字化产科管理平台源码,妇幼信息化整体解决方案

基于java语言 VueElementUI MySQL8.0.36数字化产科管理平台源码&#xff0c;妇幼信息化整体解决方案 数字化产科管理平台是为医院产科量身定制的信息管理系统。它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。该系统由门诊系统、住院系统、数据统计模块三部分组…

web零碎知识

&nbsp 在html文件中 连续的空格会被认为是一个空格 所以我们需要使用&nbsp来代表空格 &#x3000 把这个当成tab键来使用 我们可以引入js文件&#xff0c;就可以减少html文件的长度。 首先创建一个js文件夹&#xff0c;然后在js文件夹中创建一个&#xff0c;后缀…

数据库表导出到excel:前置知识4 业务和效果

清单配置页面(就是配置那些用户可以下载那些表内容,清单下载实际就是指数据库表下载,清单就是对应的表) 比如:导出一个atom_base_info表数据(数据多) atom_base_info的数据结构 下面这个配置审核状态一类不问&#xff0c;直接到清单下载页面 发起自己想下载的清单(先异步把数…

FreeRTOS之队列上锁和解锁(详解)

这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识&#xff0c;在此分享给大家&#xff0c;希望我的分享能给你带来不一样的收获&#xff01; 目录 一、简介 二、队列上锁函数prvLockQueue&#xff08;&#xff09; 1、函数初探 2、应用示例 三、队列解锁函…