【SpringMVC】SpringMVC的请求与响应
文章目录
- 0. Tomcat环境的配置
- 1. PostMan工具介绍
- 创建WorkSpace
- 建立新的请求
 
- 2. 请求映射路径
- 案例结构与代码
- 案例结构
- 案例代码
 
- 案例存在问题
- 解决方案
- 方法
- 方法升级版——配置请求路径前缀
- 注解总结
 
 
- 3. Get请求与Post请求
- 案例结构与案例代码
- 案例结构
- 案例代码
 
- Get请求
- Post请求
- 接收中文时的乱码问题
- Post请求,通过过滤器解决
- Get请求,通过配置解决
 
 
- 4. 五种类型参数传递
- 第一种:具有不同名称的普通参数
- 第二种:实体类(POJO参数)
- 第三种:嵌套POJO参数
- 第四种:数组参数
- 第五种:集合参数
 
- 5. JSON数据
- 导入json相关坐标
- 开启SpringMVC将JSON数据转换成对象的功能
- PostMan中发JSON的位置
- 第一种:JSON数组
- 第二种:JSON对象(POJO)
- 第三种:JSON数组(POJO)
- 关于@RequestBody
- @RequestBody和@ResponseParam的区别
 
- 6. 日期型参数传递
- 参数传递方法
- 类型转换器
 
- 7. 响应
- 响应页面
- 响应数据
- 页面数据
- 文本数据
- JSON数据
- List数据:JSON集合对象
 
- @ResponseBody注解介绍
 
0. Tomcat环境的配置
这里重新推荐下载安装Tomcat进行配置的方法:
 第一步:安装Tomcat,可以不用看里面安装JDK的部分,毕竟都学到SpringMVC了,JDK肯定也安装了:Tomcat安装和配置,超详细(附JDK安装及配置环境变量)
 第二步:在IDEA里面配置Tomcat运行环境:SpringMVC——配置tomcat
 第三步:修改一下下面两个位置,使得我们通过/就可以访问,否则如果这个链接后面带了一堆乱七八糟的东西,我们访问localhost/会报404的错误:
 
 注意,启动端口设置成了80,localhost等价于localhost:80
 
1. PostMan工具介绍

 PostMan的作用就是模仿浏览器发出一些请求,比如Get请求、Post请求,如果在Post请求我们还需要自己写一个表单去提交,ajax请求的时候还需要些json,通过PostMan就可以解决以下这些问题
创建WorkSpace

 创建了WorkSpace后我们也可以随时切换不同的WorkSpace:
 
建立新的请求

 输入请求地址,得到响应内容:
 
 点击preview的话就可以看到网页预览的结果,比如我们请求一下百度:
 
 其他的话就是点击右上角的save可以将请求保存到左侧,方便后续测试使用
2. 请求映射路径
案例结构与代码
案例结构

案例代码
config/SpringMvcConfig.java
package com.demo.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.demo.controller")
public class SpringMvcConfig {
}
config/ServletContainerInitConfig.java
package com.demo.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
controller/BookController.java
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BookController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("book save ...");return "{'module': 'book save'}";}
}
controller/UserController.java
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("User save...");return "{'module': 'springmvc'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("User delete...");return "{'module': 'springmvc'}";}
}
案例存在问题
运行项目,会发现报错:
 
因为在BookController和UserController下有相同的路径,就会导致报错
 团队多人开发,每个人设置不同的请求路径,应该怎么解决?
解决方案
方法
各个Controller用不同的路径
 在UserController.java中带上/user前缀:
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {@RequestMapping("/user/save")@ResponseBodypublic String save(){System.out.println("User save...");return "{'module': 'user save'}";}@RequestMapping("/user/delete")@ResponseBodypublic String delete(){System.out.println("User delete...");return "{'module': 'user delete'}";}
}
在BookController.java中带上/book前缀:
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class BookController {@RequestMapping("/book/save")@ResponseBodypublic String save(){System.out.println("book save ...");return "{'module': 'book save'}";}
}
再次启动,问题解决,测试一下/user/save和/book/save:
 
 
方法升级版——配置请求路径前缀
在Controller上定义请求模块的前缀,在每一个Controller上加上对应的前缀,如下
 在UserController.java模块顶部加上/user前缀:
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("User save...");return "{'module': 'user save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("User delete...");return "{'module': 'user delete'}";}
}
在BookController.java模块顶部加上/book前缀:
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/book")
public class BookController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("book save ...");return "{'module': 'book save'}";}
}
重新启动并测试,发现仍然可用:
 
 
注解总结
注解:@RequestMapping
 类型:方法注解、类注解
 位置:Spring控制器方法定义上方
 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
3. Get请求与Post请求
两种请求的传参方式是不一样的,在这里理解在Get请求和Post请求中如何传参
案例结构与案例代码
案例结构

案例代码
config/ServletContainerInitConfig.java
package com.demo.config;import org.apache.ibatis.jdbc.Null;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
config/SpringMvcConfig.java
package com.demo.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.demo.controller")
public class SpringMvcConfig {
}
controller/UserController.java
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(){return "{'module': 'common param'}";}
}
domain/User.java:
package com.demo.domain;public class User {private String name;private int age;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
domain/Address.java:
package com.demo.domain;public class Address {private String province;private String city;@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}
启动一下,看看是否能够跑通:
 
Get请求
一般Get请求是通过在链接后面接上?,然后再写具体的参数名称和内容,例如:localhost/commonParam?name=aaa
 接收参数的方法就是在方法上加上对应的形参:
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name){System.out.println("接收到的参数name==>" + name);return "{'module': 'common param'}";}
}
此时除了可以看到返回的结果,还可以在控制台看到打印的参数:
 
 如果是多个参数,就修改上面代码的方法处,用多个参数进行接收即可:
 public String commonParam(String name, int age)
 再测试,结果如下:
 
 PS: PostMan小技巧:如果不需要这个参数,就把前面的勾去掉,若彻底不再需要这个参数,在参数那一栏上的最右侧会有一个小垃圾桶,点击去除
Post请求
无论是Get请求还是Post请求,对于后台请求的代码来说没有变化,这里和Servlet不一样,Servlet中区分doGet和doPost,在这里合二为一了
 在Postman中,我们如下测试,注意,在Post请求中不是在Param中写参数,而是在Body中写参数,Body下的x-www-form-urlencoded位置加上参数:
 
接收中文时的乱码问题
Post请求,通过过滤器解决
假如我们在Post请求中给name参数的是中文,在运行时候会发现接收到的参数乱码:
  为了解决这个问题,我们就需要在
为了解决这个问题,我们就需要在ServletContainerInitConfig中设置一个过滤器:
package com.demo.config;import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
此时就可以解决中文乱码的问题:
 
Get请求,通过配置解决
如果是Get请求,如上配置后出来的还会是乱码(看弹幕有人说Tomcat8及以上设置了过滤器后Get请求出来的会是中文而不是乱码,如果使用本篇文章第0点中的方式来配置Tomcat,确实不会出现乱码的问题)
 但是之前我是使用在pom.xml中通过配置来进行启动服务的配置,那时候我是参考了这一篇博客来设置GET请求不乱码:SpringMVC 中如何解决POST和GET请求中文乱码问题?(面试题)
 修改pom.xml中的build配置如下,加上了uriEncoding的配置:
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path><uriEncoding>UTF-8</uriEncoding></configuration></plugin></plugins>
</build>
再次执行GET请求,结果如下:
 
 注意:只设置下面这种而不写过滤器,是不能保证Post请求不乱码的
 大概查了一下网上的资料,我认为一个请求不能满足两种需求的原因是:因为Post请求会把数据放到正文中传递,然后过滤器是针对于这个正文来设定的,然后我们配置的build是针对于得到的链接来进行设定的
4. 五种类型参数传递
第一种:具有不同名称的普通参数
在controller/UserController.java中加上一个方法:
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(String username, int age){System.out.println("接收到的参数name==>" + username);System.out.println("接收到的参数age==>" + age);return "{'module': 'common param different name'}";
}
使用不同名称的参数,则username就无法接收到:
 
 如果想要使方法能够接收不同名称的参数,就使用注解:@RequestParam,如下:
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String username, int age){System.out.println("接收到的参数name==>" + username);System.out.println("接收到的参数age==>" + age);return "{'module': 'common param different name'}";
}
再进行测试,结果如下:
 
第二种:实体类(POJO参数)
在controller/UserController.java中加上一个方法:
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){System.out.println("接收带的参数user==>" + user);return "{'module': 'pojo param'}";
}
在测试的时候带上name和age属性,框架可以帮我们自动封装到实体类中:
 
第三种:嵌套POJO参数
在controller/UserController.java中加上一个方法:
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){System.out.println("pojo嵌套pojo参数传递 user ==> " + user);return "{'module': 'pojo contain pojo param'}";
}
在domain/User.java中加上一个Address属性,加上getter和setter方法,更新toString()方法:
package com.demo.domain;public class User {private String name;private int age;Address address;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
传参的时候,只需要通过属性名.属性来加上就可以了:
 
第四种:数组参数
在controller/UserController.java中加上一个方法:
@RequestMapping("/arrayParam")
@ResponseBody
public String stringParam(String[] likes){System.out.println("数组参数传递 likes ==> " + Arrays.toString(likes));return "{'module': 'array param'}";
}
数组只需要使用同一个参数接收就可以了,如下:
 
第五种:集合参数
在controller/UserController.java中加上一个方法:
@RequestMapping("/listParam")
@ResponseBody
public String listParam(List<String> likes){System.out.println("集合参数传递 likes ==> " + likes);return "{'module': 'list param'}";
}
如果使用像第四种那样的方式来进行传参,会报错java.lang.NoSuchMethodException: java.util.List.<init>(),显示没有这样的init方法
 这是因为List<String>被当成pojo参数处理了。因为List<String>被视作了一个引用类型对象,而框架对于引用类型对象的处理是:先通过构造方法构造一个对象,然后通过set方法将属性set到这个对象里面去,所以这里会报错。
 为了避免这个问题,我们需要修改这个方法中的参数,简单地加一下@RequestParam,让框架将其作为一个参数进行处理,而不是作为一个引用对象:
public String listParam(@RequestParam List<String> likes)
再运行,得到结果如下:
 
5. JSON数据
导入json相关坐标
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>
开启SpringMVC将JSON数据转换成对象的功能
在controller/SpringMvcConfig.java中加上一个注解@EnableWebMvc
 当然,这个注解能够实现的不止这个功能,该注解整合了多个功能,不止解析JSON这一个功能
package com.demo.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.demo.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
PostMan中发JSON的位置

第一种:JSON数组
在controller/UserController.java中加上一个方法:
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(List<String> likes){System.out.println("list common(json)参数传递 list ==> " + likes);return "{'module': list common for json param}";
}
对于被封装起来的JSON,我们在这里换一个注解:@RequestBody即可:public String listParamForJson(@RequestBody List<String> likes),测试如下:
 
第二种:JSON对象(POJO)
在controller/UserController.java中加上一个方法,同理,为了解析JSON,需要加上@RequestBody:
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> " + user);return "{'module': pojo for json param}";
}
结果如下:
 
 因为没有给address的信息,所以address=null,进一步改进一下:
 
第三种:JSON数组(POJO)
在controller/UserController.java中加上一个方法,类似的:
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 user ==> " + list);return "{'module': list pojo for json param}";
}

关于@RequestBody
类型:这个参数是一个形参注解
 位置:定义位置在SpringMVC控制器方法形参定义前面
 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
@RequestBody和@ResponseParam的区别
-  区别 
 @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
 @RequestBody用于接收json数据【application/json】
-  应用 
 后期开发中,发送json格式数据为主,@RequestBody应用较广
 如果发送非json格式数据,选用@RequestParam接收请求参数
6. 日期型参数传递
参数传递方法
在controller/UserController.java中加上一个方法:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){System.out.println("参数传递 date ==> " + date);return "{'module': data param}";
}
测试一下,使用2088/08/08这种斜杠式是可以被解析的
 
 在参数里面加上date1,打开上图的date1数据再测试,会报错无法解析这种格式:
 
 这里应该使用注解@DateTimeFormat注解来指定格式:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date, @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1){System.out.println("参数传递 date ==> " + date);System.out.println("参数传递 date1 ==> " + date1);return "{'module': data param}";
}
测试如下:
 
如果需要加上时间,就使用格式:@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss)"即可:
 
类型转换器
Converter接口(其实我没找到这个)
public interface Converter<S, T>{@NullableT convert(S var1);
}
请求参数年龄数据(String→Integer)
 日期格式转换(String→Date)
7. 响应
响应页面
在controller/UserController.java中加上一个方法:
@RequestMapping("/toJumpPage")
public String toJumpPage(){System.out.println("跳转页面");return "index.jsp";
}
则会自动跳转到如下的页面:
 
响应数据
页面数据
在controller/UserController.java中加上一个方法:
@RequestMapping(path="/toJumpPage")
public String toJumpPage(){System.out.println("跳转页面");return "index.jsp";
}
webapp/index.jsp中的内容:
<html>
<body>
<h2>Hello Spring MVC!</h2>
</body>
</html>
在浏览器中输入localhost/toJumpPage
 得到以下结果:
 
 这说明Controller中写方法,会自动帮我们找返回的这个String所对应的页面。
文本数据
在controller/UserController.java中加上一个方法,如果不用@ResponseBody,则方法会尝试去找一个叫做/response text的页面:
@RequestMapping("/toText")
@ResponseBody
public String toText(){System.out.println("返回纯文本数据");return "response text";
}

JSON数据
默认返回的是一个String,我们想让框架帮我们把User转换成JSON传递过去,其实就是需要修改响应的内容,响应的不再是页面,而需要我们自定义,则需要加上@ResponseBody注解
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){System.out.println("返回json对象数据");User user = new User();user.setName("啊啊啊");user.setAge(15);return user;
}

List数据:JSON集合对象
@RequestMapping("/toJsonPOJOList")
@ResponseBody
public List<User> toJsonList(){System.out.println("返回JSON集合数据");User user1 = new User();user1.setName("aaa");user1.setAge(33);User user2 = new User();user2.setName("bbb");user2.setAge(22);List<User> userList = new ArrayList<>();userList.add(user1);userList.add(user2);return userList;
}

@ResponseBody注解介绍
这是一个方法注解,位置位于SpringMVC控制器方法定义上方
 作用:设置当前控制器返回值作为响应体
相关文章:
 
【SpringMVC】SpringMVC的请求与响应
文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…...
 
Spring Boot3通过GraalVM生成exe执行文件
一、安装GraalVM 1、官网:https://www.graalvm.org/downloads/ 2、配置环境变量 2.1、环境变量必须使用JAVA_HOME,否则会出现问题 2.2、在系统变量配置Path,%JAVA_HOME%\bin,注意必须放在顶部第一位 2.3、配置jdk的环境变量,在P…...
 
【Amazon 实验②】使用缓存策略及源请求策略,用于控制边缘缓存的行为及回源行为
文章目录 1. 了解缓存策略和源请求策略1.1 使用缓存键和缓存策略 实验:使用CloudFront缓存策略和缓存键控制缓存行为 接上一篇文章【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发,我们现在了解和配置如何使用缓存策略及源请求策略,…...
达梦数据对比工具的部署与使用
1、拷贝达梦软件bin目录到Oracle服务器(root用户) 压缩Linux rh6 x86版本的达梦数据库bin目录,例如压缩文件为dmbin.tar.gz,将文件拷贝到Oracle服务器指定目录并解压(如:/home/oracle/dmbin)&a…...
 
TLC2543(12位A/D转换器)实现将输入的模拟电压显示到数码管上
代码: #include <reg51.h> #define uchar unsigned char #define uint unsigned int// 数码管0-9 unsigned char seg[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; sbit SDO P1^0; sbit SDI P1^1; sbit CS P1^2; sbit CLK P1^3; s…...
npm的使用技巧
以下是一些NPM(Node Package Manager)的使用技巧: 1. **获取帮助**: - 使用 npm help 或者 npm <command> --help 可以获取关于特定命令的帮助信息。 2. **命令自动完成**: - 在 Bash、Zsh 等 shell 中&…...
MySQL 5.6的新特性
MySQL 5.6是一个主要的版本发布,它在性能、可伸缩性、可靠性和可用性方面引入了多项重要改进和新特性。它在2013年发布,相比于它的前身MySQL 5.5,MySQL 5.6带来了以下关键升级: 优化的InnoDB存储引擎:MySQL 5.6中的Inn…...
大模型重构云计算:AI原生或将改变格局
摘要:随着AI技术的快速发展,大模型正逐渐改变云计算的格局。本文将深入探讨大模型如何重构云计算,并分析其对云计算的影响。 一、开篇引言 近年来,人工智能技术的飞速发展,特别是大模型的崛起,正在对云计算…...
一文讲清什么是TypeScript装饰器以及如何使用TypeScript装饰器
TypeScript 装饰器是什么? 装饰器(Decorator)是TypeScript提供的一个高级语法,它类似于一种特殊类型的声明,可以附加到类声明,方法,访问符,属性或参数上。装饰器主要以函数的形式出…...
 
恶意软件样本行为分析——Process Monitor和Wireshark
1.1 实验名称 恶意软件样本行为分析 1.2 实验目的 1) 熟悉 Process Monitor 的使用 2) 熟悉抓包工具 Wireshark 的使用 3) VMware 的熟悉和使用 4) 灰鸽子木马的行为分析 1.3 实验步骤及内容 第一阶段:熟悉 Process Monitor 的使用 利用 Process …...
 
【XR806开发板试用】通过http请求从心知天气网获取天气预报信息
1. 开发环境搭建 本次评测开发环境搭建在windows11的WSL2的Ubuntu20.04中,关于windows安装WSL2可以参考文章: Windows下安装Linux(Ubuntu20.04)子系统(WSL) (1) 在WSL的Ubuntu20.04下安装必要的工具的. 安装git: sudo apt-get install git …...
NPM介绍与使用
什么是NPM? NPM(Node Package Manager)是一个强大的包管理工具,专门用于Node.js应用程序的依赖管理。它允许开发者轻松地分享、安装、更新和管理项目中使用的库、工具和框架。 NPM的安装 在使用NPM之前,请确保你的机…...
servlet +thymeleaf渲染引擎
servlet thymeleaf渲染引擎 一、maven坐标 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version> <!-- 使用适当的Thymeleaf版本 --> </dependency> &…...
10分钟了解nextTick,并实现简易版本的nextTick
在 Vue.js 中,有一个特殊的方法 nextTick,它在 DOM 更新后执行一段代码,起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法,并实现一个简易版的 nextTick,加深对它的理解。 一. 什么是 nextTic…...
oracle表空间对象迁移到其他表空间
oracle数据库的磁盘空间满了,除了简单粗暴的增加磁盘空间外,还可以缩小表空间的datafile,因为正常业务运行中,表数据的删除和增加,会造成表空间里面里面有很多空的地方。方案有很多种,我这里简单介绍一下&a…...
<stdlib.h>头文件: C 语言常用标准库函数详解
文章目录 引言1. <stdlib.h> 概览1.1 头文件包含 2. 内存管理函数2.1 malloc 函数2.2 calloc 函数2.3 realloc 函数2.4 free 函数 3. 随机数生成函数3.1 rand 函数3.2 srand 函数 4. 字符串转换函数4.1 atoi 函数4.2 atof 函数4.3 itoa 函数4.4 ltoa 函数4.5 ultoa函数 5…...
 
Qt前端技术:3.QSS字体样式
small-caps就是让这个文本中的小写字母用大写的形式写出来并且在用大写的形式表达出来后他本身的大小会变小 有绝对尺寸和相对尺寸的区别 绝对尺寸一般是cm,英寸之类的 相对尺寸如px之类的是由显示器的屏幕分辨率来决定的 如windows用户分辨率一般是96像素点每英…...
 
阿里面试官:面试了一个能力相当不错的候选人,但背调时,他前同事和领导都说他人品很差,纠结该不该要他?...
* 你好,我是前端队长,在职场,玩副业,文末有福利! 在职场中,背调是个躲不开的事情。不管是各行各业背调可能都存在,只是形式不同而已。而且现在大环境不好,可能对个人的要求还更高一些。 背调的主…...
 
如何设计树形结构
作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 前置知识:前…...
 
限量25台,川崎亮相Ninja ZX-10RR冬季限量款
最近川崎发布了自家ZX-10RR的超级限量版,官方称之为冬季测试版,之前也有一些车型推出过冬季测试版,通常是在年底推出,因为这个时候北半球都是非常寒冷的冬天。 不过这台ZX-10RR冬季测试版,并不仅仅只是限量那么简单&am…...
 
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
 
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
 
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
 
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
 
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
 
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
 
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
