RESTful

RESTful

简介

REST(Representational State Transfer):表现层资源状态转移
①资源
资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上可命名的抽象概念。因为资源是一种抽象概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,与面向对象设计类似,资源是以名词为核心来阻止的。一个资源可以由一个或多个URL来标识。URL既是资源的名称,也是资源在web上的地址。
②资源的描述
资源的描述是一段对于资源在某个特定的时刻的转台的描述,可以在客户端-服务器之间转移(交换),资源的表述含可以核对格式。如HTML/XML/JSON/纯文本等。资源的表述格式可以通过协商机制来确定,请求-响应方式的表述通常使用不同的格式。
③状态转移
状态转移说的是:在客户端-服务器之间转移(transfer)代表资源状态的表述。通过转移和操作资源的表述来间接实现操作资源的目的。

RESTful实现

具体说,就是http协议里面,四个标识操作方式的动词:GET、POST、PUT、DELETE
它们分别对应四种基本操作:GET用来获取资源、POST用来新建资源、PUT用来更新资源、DELETE用来删除资源。
REST风格提倡URL地址使用同一风格设计,从前到后各个单词是使用斜杠分开,不适用问号键值对方式形式携带请求参数。而不是将发送给服务器的数据作为URL地址的一部分,以保证整体风格的一致性。

操作传统方式REST风格
查询操作getUserById?id=1user/1---->get请求方式
新增操作saveUseruser----->post请求方式
删除操作deleteUser?id=1user/1---->delete请求
更新操作updateUseruser—>put请求

GET、POST的REST风格

示例

①创建模块完善maven目录结构
②导入依赖
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version>
</dependency>
<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>
</dependency>
③配置web.xml配置文件
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><!--设置请求的编码--><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><!--设置响应的编码--><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--注册前端控制器DispatcherServlet--><servlet><servlet-name>springMVCREST</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:SpringMVCRESTFul.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMVCREST</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
④创建并配置SpringMVCRESTFul.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/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描--><context:component-scan base-package="com.louis.controller"></context:component-scan><!--配置视图解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--用来实现页面跳转--><mvc:view-controller path="/" view-name="test_REST"></mvc:view-controller><mvc:annotation-driven></mvc:annotation-driven>
</beans>
⑤编写页面跳转成功页面success.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>Title</title>
</head>
<body>
恭喜!成功了!
</body>
</html>
⑥编写test_REST.html文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>Title</title>
</head>
<body>
<a th:href="@{/user}">查询所有用户信息</a><br/>
<a th:href="@{/user/1}">根据id查询用户信息</a><br/>
<form th:action="@{/user}" method="post">用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"><br/><input type="submit" value="添加"><br/>
</form>
</body>
</html>
⑦设置控制器UserController
@Controller
public class UserController {/*** 使用RESTFul模拟用户资源增删改查* /user GET   查询所有的用户信息* /user/1 GET   根据用户id查询用户信息* /user POST   添加用户信息* /user/1 DELETE   删除用户信息* /user PUT   修改用户信息*/@RequestMapping(value = "/user", method = RequestMethod.GET)public String getAllUser(){System.out.println("查询所有用户信息");return "success";}@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)public String getUserById(){System.out.println("根据用户ID查询用户信息");return "success";}@RequestMapping(value = "/user", method = RequestMethod.POST)public String insertUser(String username, String password){System.out.println("username = " + username +  "  password = " + password);return "success";}
}
⑧测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

PUT、DELETE的REST风格

需要注意的是,不能直接使用PUT和DELETE操作,在SpringMVC中提供了一个过滤器(HiddenHttpMethodFilter),它是一个隐藏的HTTP请求方式,想要获取PUT和DELETE请求,必须满足两个条件,条件一是请求方式必须为POST,条件二是必须传输一个参数_method,但是它不需要用户传入,是一个隐藏的参数。

web.xml配置HiddenHttpMethodFilter

<!--配置HiddenHttpMethodFilter--><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>

注意:在配置文件中有多个过滤器的时候,由<filter-mapping>的前后顺序决定,所以为了正确性,需要将设置编码的过滤武器放在首位。

PUT示例

test_REST.html
<form th:action="@{/user}" method="post"><!--条件一,请求方式必须为POST--><input type="hidden" name="_method" value="put"><!--条件二,传输请求参数_method,但对于用户没有意义,值大小写均可-->用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"><br/><input type="submit" value="修改"><br/>
</form>
UserController
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public String updateUser(String username, String password){System.out.println("修改用户信息 = " + username + "," + password);return "success";
}

在这里插入图片描述

在这里插入图片描述

DELETE请求

和(修改)PUT请求不同的是,删除(DELETE)通常是超链接。所以在实现删除操作的时候的思路是在超链接上绑定点击事件,在点击事件中需要先阻止超链接的跳转,获得当前的某一个表单,将表单的提交方式设置为post,在其中添加一个隐藏域,设置name=“_method”。

RESTful完整案例

场景:在不连接数据库的情况下使用静态数据集合实现员工信息的增删改查。

1、准备工作

环境搭建

①创建模块并完善项目结构

在这里插入图片描述

②导入依赖
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version>
</dependency>
<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>
</dependency>
③配置web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置编码过滤器--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置请求方式put和delete的hiddenHttpMethodFilter--><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><!--配置springMVC的前端控制器DispatcherServlet--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springMVC.xml</param-value></init-param><!--将前端控制器的时间提前到服务器启动时--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
④创建并配置springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--开启扫描组件--><context:component-scan base-package="com.louis"></context:component-scan><!--配值Thymeleaf视图解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean>
</beans>
⑤创建实体类User
package com.louis.bean;/*** @author XRY* @date 2023年07月01日16:33*/
public class User {private Integer id;private String username;private String email;private Integer gender;public User() {}public User(Integer id, String username, String email, Integer gender) {this.id = id;this.username = username;this.email = email;this.gender = gender;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", email='" + email + '\'' +", gender='" + gender + '\'' +'}';}
}
⑥创建UserDao
public class UserDao {private static Map<Integer, User> users = null;static{users = new HashMap<Integer, User>();users.put(1001, new User(1001, "E-AA", "aa@163.com", 1));users.put(1002, new User(1002, "E-BB", "bb@163.com", 1));users.put(1003, new User(1003, "E-CC", "cc@163.com", 0));users.put(1004, new User(1004, "E-DD", "dd@163.com", 0));users.put(1005, new User(1005, "E-EE", "ee@163.com", 1));}private static Integer initId = 1006;//新增和修改的方法public void save(User user){if(user.getId() == null){user.setId(initId++);}users.put(user.getId(), user);}//查询全部public Collection<User> getAll(){return users.values();}//通过Id查询public User get(Integer id){return users.get(id);}//通过Id删除public void delete(Integer id){users.remove(id);}
}
⑦创建UserController
package com.louis.controller;import com.louis.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** @author XRY* @date 2023年07月03日19:30*/
@Controller
public class UserController {@Autowiredprivate UserDao userDao;
}

在这里插入图片描述

2、功能模块

功能清单

功能URL地址请求方式
访问首页/GET
查询全部数据/userGET
删除/user/2DELETE
跳转到添加页面/toAddGET
执行保存操作/userPOST
跳转到更新页面/user/2GET
执行更新/userPUT
①访问首页

在templates下创建首页index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>首页</title>
</head>
<body>
<h3>首页</h3>
<a th:href="@{/user}">查看员工信息</a>
</body>
</html>

在配置文件springMVC.xml中添加<mvc:view-controller>标签

<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<mvc:annotation-driven></mvc:annotation-driven>

在这里插入图片描述

②查询数据
@Controller
public class UserController {@Autowiredprivate UserDao userDao;@RequestMapping(value = "/user", method = RequestMethod.GET)public String getAllUser(Model model){/*只需要将数据放在一个较小的域中即可*/Collection<User> userList = userDao.getAll();model.addAttribute("userList", userList);return "employee_list";}
}

创建user_list.html用来显示数据

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>Employee Info</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0" style="text-align: center"><tr><!--设置表头--><th colspan="5">Employee Info</th></tr><tr><th>id</th><th>username</th><th>email</th><th>gender</th><th>options</th></tr>
<!--通过遍历添加数据到表格中--><tr th:each="user : ${userList}"><td th:text="${user.id}"></td><td th:text="${user.username}"></td><td th:text="${user.email}"></td><td th:text="${user.gender}"></td><td><a href="">delete</a><a href="">update</a></td></tr>
</table>
</body>
</html>

在这里插入图片描述

③删除数据

不能通过超链接发送请求,需要通过超链接控制表单。
获取需要删除的id,使用vue将超链接和表单连接,需要引入vue。

在这里插入图片描述

user_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>Employee Info</title>
</head>
<body>
<table id="dataTable" border="1" cellspacing="0" cellpadding="0" style="text-align: center"><tr><!--设置表头--><th colspan="5">Employee Info</th></tr><tr><th>id</th><th>username</th><th>email</th><th>gender</th><th>options</th></tr>
<!--通过遍历添加数据到表格中--><tr th:each="user : ${userList}"><td th:text="${user.id}"></td><td th:text="${user.username}"></td><td th:text="${user.email}"></td><td th:text="${user.gender}"></td><td><!--需要根据id删除数据,但是 <a th:href="@{/user/${user.id}}">delete</a>的写法不能够被解析--><!--能够被正常解析的写法th:href="@{'/user/'+${user.id}}"或th:href="@{/user/}+${user.id}}"--><a @click="deleteUser" th:href="@{'/user/'+${user.id}}">delete</a><a href="">update</a></td></tr>
</table>
<!--添加控制删除的表单-->
<form id="deleteForm" method="post"><input type="hidden" value="delete" name="_method">
</form>
<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
<script type="text/javascript">var vue = new Vue({/*需要绑定容器,包裹需要操作的标签*/el:"#dataTable",/*需要在超链接上绑定点击事件*/methods:{deleteUser(event){/*获取当前form表单,添加deleteForm*/let deleteForm = document.getElementById("deleteForm");/*设置form表单的提交路径与超链接地址一致*/deleteForm.action = event.target.href;/*提交表单*/deleteForm.submit();/*取消标签的默认行为,阻止超链接直接跳转*/event.preventDefault();}}})
</script>
</body>
</html>

创建删除的控制器

@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
public String deleteUser(@PathVariable("id") Integer id){userDao.delete(id);/*删除之后与原来的表单就没有数据连接了*/return "redirect:/user";
}

需要注意资源未引入的情况,需要重新进行打包。

在这里插入图片描述

重新打包

在这里插入图片描述

以上是解决服务器中没有vue资源文件,同时vue需要被默认的servlet处理,在springMVC中添加开放对静资源访问标签

<!--开放对静态资源的访问,需要<mvc:annotation-driven>标签-->
<mvc:default-servlet-handler/>

测试

在这里插入图片描述

④添加功能

在表头部分的action表格中加入一个添加的超链接。

user_list.html

<tr><th>id</th><th>username</th><th>email</th><th>gender</th><th>options(<a th:href="@{/toAdd}">add</a>)</th>
</tr>

由于添加操作不需要处理其他的业务逻辑,所以可以在springMVC.xml中使用view-controller标签去实现控制器功能。

<mvc:view-controller path="/toAdd" view-name="user_add"></mvc:view-controller>

创建user_add.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>add user</title>
</head>
<body>
<form th:action="@{/user}" method="post">username:<input type="text" name="username"><br/>email:<input type="text" name="email"><br/>gender:<input type="radio" name="gender" value="1">male<input type="radio" name="gender" value="0">female<br/><input type="submit" value="add">
</form>
</body>
</html>

控制器

@RequestMapping(value = "/user", method = RequestMethod.POST)
public String addUser(User user){userDao.save(user);return "redirect:/user";
}

测试

在这里插入图片描述

在这里插入图片描述

⑤更新操作

更新操作和删除操作类似,但是需要表单显示相关内容并提交(回显)。

user_list.html

<a th:href="@{'/user/' + ${user.id}}">update</a>

控制器

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
/*需要通过id查询数据,同时还需要将查询出来的数据在域中实现共享*/
public String getUserById(@PathVariable("id") Integer id, Model model){User user = userDao.get(id);model.addAttribute("user", user);return "user_update";
}

创建user_update.html实现回显

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" xmlns:th="http://www.thymeleaf.org"><title>add user</title>
</head>
<body>
<!--修改使用PUT方式,需要保证表单提交方式为post-->
<form th:action="@{/user}" method="post"><input type="hidden" name="_method" value="put"><input type="hidden" name="id" th:value="${user.id}">username:<input type="text" name="username" th:value="${user.username}"><br/>email:<input type="text" name="email" th:value="${user.email}"><br/>gender:<input type="radio" name="gender" value="1" th:field="${user.gender}">male<input type="radio" name="gender" value="0" th:field="${user.gender}">female<br/><input type="submit" value="update">
</form>
</body>
</html>

在这里插入图片描述

创建修改的控制器

@RequestMapping(value = "/user", method = RequestMethod.PUT)
public String updateUser(User user){userDao.save(user);return "redirect:/user";
}

测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

vue3获得url上的参数值

1、引入 import { useRoute } from vue-router2、获得const route useRoute() console.log(route.query.number)

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

HTML 初

前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

conda install 和pip install有什么区别?

本篇为分享贴&#xff0c;截图部分选自知乎&#xff0c;部分选自csdn&#xff0c;文字内容是结合自己实践进行总结。 环境引用的包在哪&#xff1f; 首先&#xff0c;一条命令&#xff1a; python -m site 这条命令可以定位引用的包在哪里 &#xff0c;当然也可以自己设置默认…

Java课题笔记~ 关于错误与异常

非检查异常(unckecked exception)&#xff1a;Error 和 RuntimeException 以及他们的子类。javac在编译时&#xff0c;不会提示和发现这样的异常&#xff0c;不要求程序员必须处理这些异常。在运行阶段&#xff0c;倘若发生Error则虚拟机几乎崩溃&#xff0c;倘若发生RuntimeEx…

mysql的主从复制和读写分离

目录 一、mysql的主从复制和读写分离的相关知识 1&#xff09;什么是读写分离? 2&#xff09;为什么要读写分离呢? 3&#xff09;什么时候要读写分离? 4&#xff09;主从复制的优点 5&#xff09;主从复制与读写分离 6&#xff09;mysql支持的复制类型 STATEMENT和r…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑&#xff0c;一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意&#xff1a;针对一些老项目 还是尽量采用 3.6.3版本&#xff0c;针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

vue中vuex的五个属性和基本用法,另加js-cookie的使用

VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 1. state&#xff1a; vuex的基本数据&…

HDFS中snapshot快照机制

HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录&#xff0c;备份&#xff08;backup&#xff09;则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像&#xff0c;该镜像…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据分享】2023年我国省市县三级的上市公司数量(Excel/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;在众多公司企业中&#xff0c;上市公司堪称明珠&#xff0c;上市公司通常经济规模大、影响力强、员工多。哪个城市的上市公司更多&#xff0c;往往这个城市的经济实力越强&…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机&#xff0c;没有蓝牙驱动&#xff0c;在用logi无线鼠标时&#xff0c;把鼠标连接插入台式机后弹出的如上图所示这个提示&#xff0c;无论是点是/否&#xff0c;还是X掉上图提示&#xff0c;电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有&#xff0c;然…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…

ChatGPT访问流量下降的原因分析

​自从OpenAI的ChatGPT于11月问世以来&#xff0c;这款聪明的人工智能聊天机器人就席卷了全世界&#xff0c;人们在试用该工具的同时也好奇该技术到底将如何改变我们的工作和生活。 但近期Similarweb表示&#xff0c;自去ChatGPT上线以来&#xff0c;该网站的访问量首次出现下…

基于springboot的课程作业管理系统【附开题|ppt|万字文档(LW)和搭建文档】

主要功能 学生登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理 教师登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、…

代理模式:静态代理+JDK/CGLIB 动态代理

文章目录 1. 代理模式2. 静态代理3. 动态代理3.1. JDK 动态代理机制3.1.1. 介绍 3.1.2. JDK 动态代理类使用步骤3.1.3. 代码示例3.2. CGLIB 动态代理机制3.2.1. 介绍3.2.2. CGLIB 动态代理类使用步骤3.2.3. 代码示例 3.3. JDK 动态代理和 CGLIB 动态代理对比 4. 静态代理和动态…

mysql自增主键不连续情况分析

1.唯一键冲突 比如increnment_test中已经存在了co1为3的记录,当再插入col1为3的记录时,就会出现主键不唯一错误,但此时自增主键已经1,所以会发生主键不连续情况 DROP TABLE IF EXISTS increnment_test; CREATE TABLE increnment_test (id int(0) NOT NULL AUTO_INCREMENT,col…