【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中区分doGetdoPost,在这里合二为一了
在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控制器方法定义上方
作用:设置当前控制器返回值作为响应体

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

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

相关文章

JS模块化规范之ES6及UMD

JS模块化规范之ES6及总结 前言ES6模块化概念基本使用ES6实现 UMD(Universal Module Definition)总结 前言 ESM在模块之间的依赖关系是高度确定的&#xff0c;与运行状态无关&#xff0c;编译工具只需要对ESM模块做静态分析&#xff0c;就可以从代码字面中推断出哪些模块值未曾被…

ICC2:Less than minimum edge length和Concave convex edge enclosure

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 首先,要介绍一下这两种drc Less than minimum edge length对应的tf rule如下: 而Concave convex edge enclosure对应图示和tf 规则如下,可

数据管理平台Splunk Enterprise本地部署结合内网穿透实现远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

pip 常用指令 pip list 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包&#xff0c;以及它们的版本号。 pip list 命令有以下参数 -o, --outdated&#xff1a;列出所有过时的包&#xff0c;即有新版本可用的包。-u, --uptod…

【Chrome】ERR_SSL_PROTOCOL_ERROR问题

文章目录 前言一、下载二、使用步骤总结 前言 Edge升级最新版后&#xff0c;有的https访问不了&#xff0c;报如下错误 发现新版Chrome以及Chromium内核访问nginx ssl时报错&#xff0c;顺着这个思路接着查看到大佬的结论&#xff1a;服务器nginx使用的openssl版本过低&#…

智能感知时代已来,汉威科技柔性传感器迎来发展新机遇

近年来&#xff0c;消费电子、医疗健康、智能汽车、人机交互等领域的黑科技产品不断出现&#xff0c;催生了许多新功能、新场景、新市场。 TWS耳机&#xff1a;许多TWS&#xff08;真无线立体声&#xff09;耳机厂商开始摒弃传统的触摸感应模式&#xff0c;转而采用最先进的压…

ISA95 及工业互联网平台

ISA95简称S95&#xff0c;是美国仪表、系统和自动化协会&#xff08;ISA&#xff09;在95年提出来的&#xff0c;也是这个协会启动编制的第95个标准项目。它定义了企业商业和控制系统之间的集成&#xff0c;主要可以分成三个层次&#xff1a; 第0&#xff0c;1&#xff0c;2层…

亚马逊云科技-如何缩容/减小您的AWS EC2根卷大小-简明教程

一、背景 Amazon EBS提供了块级存储卷以用于 EC2 实例&#xff0c;EBS具备弹性的特点&#xff0c;可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量&#xff0c;在实际使用中&#xff0c;用户也许会存在此类场景&#xff1a; 在创建AWS EC2…

Kafka 分级存储在腾讯云的实践与演进

导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享&#xff0c;从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…

JFreeChart 生成图表,并为图表标注特殊点、添加文本标识框

一、项目场景&#xff1a; Java使用JFreeChart库生成图片&#xff0c;主要场景为将具体的数据 可视化 生成曲线图等的图表。 本篇文章主要针对为数据集生成的图表添加特殊点及其标识框。具体包括两种场景&#xff1a;x轴为 时间戳 类型和普通 数值 类型。&#xff08;y轴都为…

maven限制内存使用峰值/最大内存

前言 通过设置虚拟机的内存大小&#xff0c;达到限制maven内存使用峰值的效果 方法1&#xff1a;修改mvn脚本 找到mvn脚本在MAVEN_OPTS参数值添加-Xms、-Xmx参数&#xff1a;MAVEN_OPTS"$MAVEN_OPTS -Xms512m -Xmx512m"效果图 windows系统下修改MAVEN_OPTS参数 …

解锁高效工作!5款优秀工时管理软件推荐

工时管理&#xff0c;一直是让许多企业和团队头疼的问题。传统的纸质工时表、复杂的电子表格&#xff0c;不仅操作繁琐&#xff0c;还容易出错。幸好&#xff0c;随着科技的进步&#xff0c;我们迎来了工时管理软件的春天。今天&#xff0c;就让我们一起走进这个新时代&#xf…

iconfont拓展iview图标库

文章目录 前言1.如何下载图标&#xff1f;首先进入官网&#xff0c;找属于自己需求的图标&#xff0c;添加到购物车2.点击右上角的购物车&#xff0c;会来到此页面&#xff0c;点击下载代码3.下载完成后&#xff0c;是一个压缩包&#xff0c;文件内容如下4.在项目assets下新建一…

数据结构和算法笔记2:二分法

二分法网上有两种写法&#xff0c;一种左闭右闭&#xff0c;一种左闭右开&#xff0c;个人习惯左闭右闭的写法&#xff0c; 有序数组查找数 这是标准二分法&#xff0c;对应力扣的704. 二分查找&#xff1a; 求值为target的索引 int search(vector<int>& nums, i…

关于时区处理策略

前端会通过 App-Id 请求头附带 客户端时区 信息 前端传入的如果是 字符串&#xff0c;会自动根据 请求的客户端时区 解析为对应的 日期 如果前端传入的是时间戳&#xff0c;则无需额外解析转换 如果是 商户后台、管理后台 都统一基于 商户所在国家的时区&#xff08;总台目前…

防火墙安全策略

目录 一、防火墙种类 二、防火墙流量控制手段 1、包过滤技术&#xff08;传统&#xff09; 2、状态检测技术 &#xff08;1&#xff09;、状态检测机制 三、安全实验 1、拓扑 2、需求 3、配置思路 4、关键配置截图 5、验证 一、防火墙种类 对于防火墙来说就是针对哪…

COSP营造户外骑行新业态:2024深圳户外骑行展在深圳福田召开

随着人们生活水平的提高&#xff0c;绿色健康的生活方式备受关注&#xff0c;户外骑行作为一种绿色、健康的运动方式&#xff0c;越来越受到人们的青睐。此次展会将展示各种类型的户外骑行装备&#xff0c;包括自行车、头盔、手套、鞋类、骑行服等。深圳是中国户外骑行展会的重…

最新国内免费使用GPT4教程,GPT语音对话使用,Midjourney绘画

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GP…

油猴脚本教程案例【键盘监听】-编写 ChatGPT 快捷键优化

文章目录 1. 元数据1. name2. namespace3. version4. description5. author6. match7. grant8. icon 2. 编写函数.1 函数功能2.1.1. input - 聚焦发言框2.1.2. stop - 取消回答2.1.3. newFunction - 开启新窗口2.1.4. scroll - 回到底部 3. 监听键盘事件3.1 监听X - 开启新对话…

随机问卷调查数据的处理(uniapp)

需求&#xff1a;问卷调查 1.返回的数据中包含单选、多选、多项文本框、单文本框、图片上传 2.需要对必填的选项进行校验 3.非必填的多项文本框内容 如果不填写 不提交 表单数据格式 res{"code": 0,"msg": null,"data": [{"executeDay&…