获取请求数据

假设有这样一个请求:http://localhost:8080/springmvc/register?name=zhangsan&password=123&email=zhangsan@qq.com

  • 在SpringMVC中应该如何获取请求提交的数据
  • 在SpringMVC中又应该如何获取请求头信息
  • 在SpringMVC中又应该如何获取客户端提交的Cookie数据

一、准备

1.1 创建模块,添加依赖

<?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.liming</groupId><artifactId>springmvc-004</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></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>

1.2 添加web支持

在这里插入图片描述

1.3 编写web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><!--前端控制器--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--通过初始化参数来指定springmvc配置文件的路径和名字。--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--在服务器启动的时候初始化DispatcherServlet,提高第一次访问的效率--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

1.4 创建UserController

@Controller
public class UserController {@RequestMapping("/")public String toRegisterPage(){return "register";}}

1.5 编写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"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"><!--组件扫描--><context:component-scan base-package="com.liming.controller"/><!--视图解析器--><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>
</beans>

1.6 编写register.html文件

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户注册</title>
</head>
<body>
<h3>用户注册</h3>
<hr>
</body>
</html>

1.7 部署测试

在这里插入图片描述

二、使用原生的Servlet API进行获取

原生的Servlet API指的是:HttpServletRequest。在SpringMVC当中,一个Controller类中的方法参数上如果有HttpServletRequest,SpringMVC会自动将当前请求对象传递给这个参数,因此我们可以通过这个参数来获取请求提交的数据。

在 register.html 中准备一个注册的表单:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户注册</title>
</head>
<body>
<h3>用户注册</h3>
<hr>
<form th:action="@{/register}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>性别:男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0"><br>爱好:抽烟 <input type="checkbox" name="hobby" value="smoke">喝酒 <input type="checkbox" name="hobby" value="drink">烫头 <input type="checkbox" name="hobby" value="perm"><br>简介:<textarea rows="10" cols="60" name="intro"></textarea><br><input type="submit" value="注册">
</form>
</body>
</html>

接下来在控制器添加一个方法来处理这个注册的请求:

@PostMapping(value="/register")
public String register(HttpServletRequest request){// 通过当前请求对象获取提交的数据String username = request.getParameter("username");String password = request.getParameter("password");String sex = request.getParameter("sex");String[] hobbies = request.getParameterValues("hobby");String intro = request.getParameter("intro");System.out.println(username + "," + password + "," + sex + "," + Arrays.toString(hobbies) + "," + intro);return "success";
}

提供视图页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>注册成功</title>
</head>
<body>
<h1>注册成功</h1>
</body>
</html>

测试:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样通过Servlet原生的API获取到提交的数据。但是这种方式不建议使用,因为方法的参数依赖Servlet原生API,Controller的测试将不能单独测试,必须依赖WEB服务器才能测试。另外,换句话说,如果在SpringMVC中使用了原生的Servlet,你为什么还要用SpringMVC框架呢!!!!!

三、使用RequestParam注解标注

3.1 RequestParam注解的基本使用

RequestParam注解作用:将请求参数与方法上的形参映射。

@PostMapping(value = "/register")
public String register(@RequestParam(value="username")String a,@RequestParam(value="password")String b,@RequestParam(value="sex")String c,@RequestParam(value="hobby")String[] d,@RequestParam(name="intro")String e) {System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(Arrays.toString(d));System.out.println(e);return "success";
}

注意:对于@RequestParam注解来说,属性有value和name,这两个属性的作用相同,都是用来指定提交数据的name

在这里插入图片描述

启动服务器测试:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意: @RequestParam(value=“name”) 中value一定不要写错,写错就会出现以下问题:

在这里插入图片描述

测试结果:

在这里插入图片描述

3.2 RequestParam注解的required属性

在这里插入图片描述

required属性用来设置该方法参数是否为必须的。默认情况下,这个参数为 true,表示方法参数是必需的。如果请求中缺少对应的参数,则会抛出异常。可以将其设置为false,false表示不是必须的,如果请求中缺少对应的参数,则方法的参数为null。

测试,修改register方法,如下:

在这里插入图片描述

添加了一个 age 形参,没有指定 required 属性时,默认是true,表示必需的,但前端表单中没有年龄age,我们来看报错信息:参数age是必需的。没有提供这个请求参数,HTTP状态码 400

在这里插入图片描述

如果将 required 属性设置为 false。则该参数则不是必须的,如果请求参数仍然未提供时,我们来看结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过测试得知,如果一个参数被设置为不是必需的,当没有提交对应的请求参数时,形参默认值 null。当然,如果请求参数中提供了age,则age为真实提交的数据。

3.3 RequestParam注解的defaultValue属性

defaultValue属性用来设置形参的默认值,当没有提供对应的请求参数或者请求参数的值是空字符串""的时候,方法的形参会采用默认值。

在这里插入图片描述

当前端页面没有提交email的时候:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当前端页面提交的email是空字符串的时候也会走默认值,只有当前端提交的email不是空字符串的时候才会接收用户输入的参数。

四、依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字提交数据时的name相同,则 @RequestParam 可以省略。但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数-parameter,配置如下:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.12.1</version><configuration><source>21</source><target>21</target><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin></plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!

@PostMapping(value="/register")
public String register(String username, String password, String sex, String[] hobby, String intro){System.out.println(username + "," + password + "," + sex + "," + Arrays.toString(hobby) + "," + intro);return "success";
}

注意:如果形参名和提交的数据的name不一致时会接受不到数据

五、使用POJO类/JavaBean接收请求参数

以上方式大家可以看到,当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。提供以下的JavaBean:

package com.liming.pojo;import lombok.Data;import java.io.Serializable;/*** @author LiMing* @version 1.0* @description: TODO* @date 2024/4/8 16:28*/
@Data
public class User implements Serializable {private Long id;private String username;private String password;private String sex;private String[] hobby;private String intro;}

在控制器方法的形参位置上使用javabean来接收请求参数:

@PostMapping("/register")
public String register(User user){System.out.println(user);return "success";
}

执行结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

底层的实现原理:反射机制。先获取请求参数的名字,因为请求参数的名字就是JavaBean的属性名,通过这种方式给对应的属性赋值

我们来测试一下:当JavaBean的属性名和请求参数的参数名不一致时,会出现什么问题?(注意:getter和setter的方法名不修改,只修改属性名

package com.powernode.springmvc.pojo;import java.util.Arrays;/*** @author LiMing* @version 1.0* @description: TODO* @date 2024/4/8 16:28*/
public class User {private Long id;private String uname;private String upwd;private String usex;private String[] uhobby;private String uintro;public User() {}public User(Long id, String username, String password, String sex, String[] hobby, String intro) {this.id = id;this.uname = username;this.upwd = password;this.usex = sex;this.uhobby = hobby;this.uintro = intro;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return uname;}public void setUsername(String username) {this.uname = username;}public String getPassword() {return upwd;}public void setPassword(String password) {this.upwd = password;}public String getSex() {return usex;}public void setSex(String sex) {this.usex = sex;}public String[] getHobby() {return uhobby;}public void setHobby(String[] hobby) {this.uhobby = hobby;}public String getIntro() {return uintro;}public void setIntro(String intro) {this.uintro = intro;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + uname + '\'' +", password='" + upwd + '\'' +", sex='" + usex + '\'' +", hobby=" + Arrays.toString(uhobby) +", intro='" + uintro + '\'' +'}';}
}

测试结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过测试,我们得知:请求参数名可以和JavaBean的属性名不一致。

我们继续将其中一个属性的setter和getter方法名修改一下:
image.png

再次测试:
image.png
image.png
image.png

通过测试可以看到:username属性没有赋上值。可见请求参数是否可以赋值到JavaBean对应的属性上,不是取决于属性名,而是setter方法名

六、RequestHeader注解

该注解的作用是:将请求头信息映射到方法的形参上
和RequestParam注解功能相似,RequestParam注解的作用:将请求参数映射到方法的形参上。
当然,对于RequestHeader注解来说,也有三个属性:value、required、defaultValue,和RequestParam一样,这里就不再赘述了。

测试:

@PostMapping("/register")
public String register(User user, @RequestHeader(value="Referer", required = false, defaultValue = "") String referer){System.out.println(user);System.out.println(referer);return "success";
}

执行结果:

在这里插入图片描述

七、CookieValue注解

该注解的作用:将请求提交的Cookie数据映射到方法形参
同样是有三个属性:value、required、defaultValue

前端页面中编写发送cookie的代码:

<script type="text/javascript">function sendCookie(){document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";document.location = "/springmvc/register";}
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>

后端UserController代码:

    @GetMapping("/register")public String register(User user,@RequestHeader(value="Referer", required = false, defaultValue = "")String referer,@CookieValue(value="id", required = false, defaultValue = "2222222222")String id){System.out.println(user);System.out.println(referer);System.out.println(id);return "success";}

测试结果:

在这里插入图片描述

八、请求的中文乱码问题

8.1 get请求乱码

get请求数据在URI后面提交,这个乱码问题怎么解决呢?解决办法是找到 CATALINA_HOME/config/server.xml文件,找到其中配置端口号的标签,在该标签中添加 URIEncoding="UTF-8"。但是对于高版本的Tomcat服务器来说,是不需要设置的,例如Tomcat10,Tomcat9,有如下的默认配置,在默认情况下URIEncoding使用的就是UTF-8的编码方式。

image.png

但对于低版本的Tomcat服务器,例如:Tomcat8。URIEncoding的默认配置是ISO-8859-1,因此在Tomcat8中需要手动配置server.xml文件:

image.png

配置如下:

在这里插入图片描述

在这里插入图片描述

接下来,我们测试一下,在默认情况下,Tomcat10是否已经解决了get请求乱码问题:

<form th:action="@{/register}" method="get">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>性别:男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0"><br>爱好:抽烟 <input type="checkbox" name="hobby" value="smoke">喝酒 <input type="checkbox" name="hobby" value="drink">烫头 <input type="checkbox" name="hobby" value="perm"><br>简介:<textarea rows="10" cols="60" name="intro"></textarea><br><input type="submit" value="注册">
</form>

注意,以上表单已经修改为get请求了。

@GetMapping("/register")
public String register(User user){System.out.println(user);return "success";
}

测试结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.2 post请求乱码

post请求是解决请求体的中文乱码问题。解决办法大家都知道:

request.setCharacterEncoding("UTF-8");

同样,对于高版本的Tomcat10服务器来说,针对请求体中的字符编码也是配置好的,默认也是采用了UTF-8,中文乱码问题也解决了,在这个文件中配置的:apache-tomcat-10.1.19\conf\web.xml

配置内容如下:

在这里插入图片描述

通过以上配置可以看到,Tomcat10对请求和响应都设置了默认的字符编码方式为UTF-8
注意:Tomcat9以及之前的版本,以上的配置是没有的

我们来测试一下,针对Tomcat10来说,SpringMVC会不会有乱码问题:

<form th:action="@{/register}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>性别:男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0"><br>爱好:抽烟 <input type="checkbox" name="hobby" value="smoke">喝酒 <input type="checkbox" name="hobby" value="drink">烫头 <input type="checkbox" name="hobby" value="perm"><br>简介:<textarea rows="10" cols="60" name="intro"></textarea><br><input type="submit" value="注册">
</form>

注意:以上表单已经修改为post请求

@PostMapping("/register")
public String register(User user, HttpServletRequest request) throws UnsupportedEncodingException {System.out.println(user);return "success";
}

测试结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过测试可以看到在Tomcat10当中,默认SpringMVC,发送POST请求,是不会出现乱码问题的。

如果不是Tomcat10,则会出现乱码问题,我们来模拟一下乱码的产生,将apache-tomcat-10.1.19\conf\web.xml文件中的UTF-8配置修改为ISO-8859-1

image.png
一定要重启Tomcat10,新的配置才能生效,来测试一下是否存在乱码:

image.png

  • 在SpringMVC中如何解决请求体的中文乱码问题呢?当然,还是使用request.setCharacterEncoding("UTF-8")
  • 使用它有一个前提条件,要想解决请求体乱码问题,以上代码必须在 request.getParameter("username")执行之前执行才有效。
  • 也就是说以上代码如果放在Controller的相关方法中执行是无效的,因为Controller的方法在执行之前 DispatcherServlet已经调用了 request.getParameter("username")方法。因此在Controller方法中使用request.setCharacterEncoding("UTF-8")无效

我们来测试一下:

<form th:action="@{/register}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>性别:男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0"><br>爱好:抽烟 <input type="checkbox" name="hobby" value="smoke">喝酒 <input type="checkbox" name="hobby" value="drink">烫头 <input type="checkbox" name="hobby" value="perm"><br>简介:<textarea rows="10" cols="60" name="intro"></textarea><br><input type="submit" value="注册">
</form>

注意:以上表单已经修改为post请求

@PostMapping("/register")
public String register(User user, HttpServletRequest request) throws UnsupportedEncodingException {request.setCharacterEncoding("UTF-8");System.out.println(user);return "success";
}

测试结果:

image.png
image.png
通过测试可以看到:在Controller当中调用request.setCharacterEncoding("UTF-8")是无法解决POST乱码问题的。

那怎么办呢?怎么样才能在DispatcherServlet之前执行request.setCharacterEncoding("UTF-8")呢?没错,我相信大家想到了:过滤器Filter。过滤器Filter可以在Servlet执行之前执行。有同学又说了:监听器不行吗?不行。因为我们需要对每一次请求解决乱码,而监听器只在服务器启动阶段执行一次。因此这里解决每一次请求的乱码问题,应该使用过滤器Filter。并且,告诉大家一个好消息,SpringMVC已经将这个字符编码的过滤器提前写好了,我们直接配置好即可:CharacterEncodingFilter,我们一起看一下它的源码:

在这里插入图片描述

最核心的方法是:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String encoding = getEncoding();if (encoding != null) {if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}if (isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);
}

分析以上核心方法得知该过滤器对请求和响应都设置了字符编码方式。

  • 强行使用请求字符编码方式为true时,或者请求对象的字符编码方式为null时,设置请求的字符编码方式。
  • 强行使用响应字符编码方式为true时,设置响应的字符编码方式。

根据以上代码,可以得出以下配置信息,在web.xml文件中对过滤器进行如下配置:

<!--字符编码过滤器-->
<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>forceRequestEncoding</param-name><param-value>true</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>

我们再来测试,重启Tomcat10,看看乱码是否能够解决?
image.png

注意:针对于我们当前的Tomcat10的配置来说,它有默认的字符集ISO-8859-1,因此以下在web.xml文件中的配置是不能缺少的:

<init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value>
</init-param>

如果缺少它,仍然是会存在乱码问题的。

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

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

相关文章

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中&#xff0c;进程管理是至关重要的一个环节。其中&#xff0c;前后台任务和守护进程是进程管理中不可忽视的两…

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…

刷题之Leetcode707题(超级详细)

707.设计链表 力扣题目链接(opens new window)https://leetcode.cn/problems/design-linked-list/ 题意&#xff1a; 在链表类中实现这些功能&#xff1a; get(index)&#xff1a;获取链表中第 index 个节点的值。如果索引无效&#xff0c;则返回-1。addAtHead(val)&#x…

Day37代码随想录(1刷) 动态规划

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n …

外包干了17天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境&#xff1a; 我和同学的两台笔记本电脑。 使用我的手机开热点&#xff0c;两台电脑连接热点。 我的&#xff1a; IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

Day04-SHELL自动化编程-循环与颜色函数库

Day04-SHELL自动化编程-循环与颜色函数库 11. 必知必会核心命令11.1 命令概述11.7 案例11.8 小结 12 Shell编程-循环12.1 循环概述12.2 for循环1&#xff09;最常用的for循环格式2&#xff09;c语言格式for循环3&#xff09;for循环格式及应用场景4&#xff09;案例 12.3 while…

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 灰狼优化算法 此处略。 2.…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践&#xff1a;去哪儿旅游数据爬取指南 在这个博客中&#xff0c;我们将探索如何使用 Python 来进行网络数据抓取&#xff0c;并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取&#xff0c;从而获取旅游…

软件详细设计说明书(套用案例)

2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统功能模块详细设计 3.1个人办公…

一键下载 M3U8 并转换为 MP4升级版

之前的下载 M3U8程序&#xff0c;有很多问题&#xff0c; 为此做了一些升级&#xff0c;分享给大家。 增加了存在播放列表的情况处理播放列表路径和ts路径错误问题多线程问题对于电视剧多文件下载的处理 这里从网上找了一部的链接&#xff0c;可以参考这个网站https://www.zu…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

全光谱台灯哪个牌子好,2024全光谱护眼台灯推荐

近年来&#xff0c;全光谱台灯悄然跻身于家庭必备品之列&#xff0c;赢得了众多消费者的好评。它们以减轻眼睛疲劳的功效而受到推崇&#xff0c;尽管也有声音质疑其实际效用&#xff0c;认为所谓的益处不过是一种心理安慰。面对这些相互矛盾的观点&#xff0c;许多消费者感到困…

Java数据结构二叉树

概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 从上图可以看出&#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#x…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…