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;…

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接收数据 解析…

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 集成高可用性解决方案。 说…

科普文: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;专栏&#…

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端系统设计风格简洁与高效的完美融合

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、应用示例 三、队列解锁函…

js之模糊搜索

多的不说 少的不唠 直接上代码

警翼警用记录仪视频格式化后恢复方法

警翼是国内较大的一家警用记录仪厂商&#xff0c;此品牌我们恢复过很多&#xff0c;此次遇到的是一个典型的误格式化的情况&#xff0c;我们来看看误格式化后如何恢复。 故障存储: 32G卡/fat32 故障现象: 客户提供的信息是在交接设备后没有及时备份而做出了初始化设备的操…

养老院管理系统-计算机毕业设计源码00010

养老院管理系统的设计与实现 摘要 本文介绍了一种基于Spring Boot框架的养老院管理系统的设计与实现。该系统旨在帮助养老院管理者更有效地管理机构内的各项事务&#xff0c;并提供更好的服务于老年人。系统的设计考虑了养老院管理的特殊需求&#xff0c;包括系统用户、老人信息…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位&#xff0c;对于信息学奥赛已经不陌生了&#xff0c;部分同学也已经开始踏入信息学的旅程&#xff0c;但前路茫茫&#xff0c;让我们一起看看已经取得成就的同学的经历吧。 今天要介绍的这位同学&#xff0c;是来自深圳中学的高二某班的欧阳达晟同学&#x…

简洁纯文字类的Typecho主题wenso

主题介绍 文章说说类博客网站源码&#xff0c;页面清新简洁。适合文章说说美文博客网站建站使用&#xff0c;响应式手机版本。 本来是dedecms的模板&#xff0c;也比较简单&#xff0c;适合用来搭建一个文学类的&#xff0c;纯文字的网站&#xff0c;简单的改成了typecho&…