当前位置: 首页 > news >正文

【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控制器方法定义上方
作用:设置当前控制器返回值作为响应体

相关文章:

【SpringMVC】SpringMVC的请求与响应

文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…...

Spring Boot3通过GraalVM生成exe执行文件

一、安装GraalVM 1、官网&#xff1a;https://www.graalvm.org/downloads/ 2、配置环境变量 2.1、环境变量必须使用JAVA_HOME&#xff0c;否则会出现问题 2.2、在系统变量配置Path,%JAVA_HOME%\bin&#xff0c;注意必须放在顶部第一位 2.3、配置jdk的环境变量&#xff0c;在P…...

【Amazon 实验②】使用缓存策略及源请求策略,用于控制边缘缓存的行为及回源行为

文章目录 1. 了解缓存策略和源请求策略1.1 使用缓存键和缓存策略 实验&#xff1a;使用CloudFront缓存策略和缓存键控制缓存行为 接上一篇文章【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发&#xff0c;我们现在了解和配置如何使用缓存策略及源请求策略&#xff0c;…...

达梦数据对比工具的部署与使用

1、拷贝达梦软件bin目录到Oracle服务器&#xff08;root用户&#xff09; 压缩Linux rh6 x86版本的达梦数据库bin目录&#xff0c;例如压缩文件为dmbin.tar.gz&#xff0c;将文件拷贝到Oracle服务器指定目录并解压&#xff08;如&#xff1a;/home/oracle/dmbin&#xff09;&a…...

TLC2543(12位A/D转换器)实现将输入的模拟电压显示到数码管上

代码&#xff1a; #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&#xff08;Node Package Manager&#xff09;的使用技巧&#xff1a; 1. **获取帮助**&#xff1a; - 使用 npm help 或者 npm <command> --help 可以获取关于特定命令的帮助信息。 2. **命令自动完成**&#xff1a; - 在 Bash、Zsh 等 shell 中&…...

MySQL 5.6的新特性

MySQL 5.6是一个主要的版本发布&#xff0c;它在性能、可伸缩性、可靠性和可用性方面引入了多项重要改进和新特性。它在2013年发布&#xff0c;相比于它的前身MySQL 5.5&#xff0c;MySQL 5.6带来了以下关键升级&#xff1a; 优化的InnoDB存储引擎&#xff1a;MySQL 5.6中的Inn…...

大模型重构云计算:AI原生或将改变格局

摘要&#xff1a;随着AI技术的快速发展&#xff0c;大模型正逐渐改变云计算的格局。本文将深入探讨大模型如何重构云计算&#xff0c;并分析其对云计算的影响。 一、开篇引言 近年来&#xff0c;人工智能技术的飞速发展&#xff0c;特别是大模型的崛起&#xff0c;正在对云计算…...

一文讲清什么是TypeScript装饰器以及如何使用TypeScript装饰器

TypeScript 装饰器是什么&#xff1f; 装饰器&#xff08;Decorator&#xff09;是TypeScript提供的一个高级语法&#xff0c;它类似于一种特殊类型的声明&#xff0c;可以附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上。装饰器主要以函数的形式出…...

恶意软件样本行为分析——Process Monitor和Wireshark

1.1 实验名称 恶意软件样本行为分析 1.2 实验目的 1) 熟悉 Process Monitor 的使用 2) 熟悉抓包工具 Wireshark 的使用 3) VMware 的熟悉和使用 4) 灰鸽子木马的行为分析 1.3 实验步骤及内容 第一阶段&#xff1a;熟悉 Process Monitor 的使用 利用 Process …...

【XR806开发板试用】通过http请求从心知天气网获取天气预报信息

1. 开发环境搭建 本次评测开发环境搭建在windows11的WSL2的Ubuntu20.04中&#xff0c;关于windows安装WSL2可以参考文章: Windows下安装Linux(Ubuntu20.04)子系统&#xff08;WSL&#xff09; (1) 在WSL的Ubuntu20.04下安装必要的工具的. 安装git: sudo apt-get install git …...

NPM介绍与使用

什么是NPM&#xff1f; NPM&#xff08;Node Package Manager&#xff09;是一个强大的包管理工具&#xff0c;专门用于Node.js应用程序的依赖管理。它允许开发者轻松地分享、安装、更新和管理项目中使用的库、工具和框架。 NPM的安装 在使用NPM之前&#xff0c;请确保你的机…...

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 中&#xff0c;有一个特殊的方法 nextTick&#xff0c;它在 DOM 更新后执行一段代码&#xff0c;起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法&#xff0c;并实现一个简易版的 nextTick&#xff0c;加深对它的理解。 一. 什么是 nextTic…...

oracle表空间对象迁移到其他表空间

oracle数据库的磁盘空间满了&#xff0c;除了简单粗暴的增加磁盘空间外&#xff0c;还可以缩小表空间的datafile&#xff0c;因为正常业务运行中&#xff0c;表数据的删除和增加&#xff0c;会造成表空间里面里面有很多空的地方。方案有很多种&#xff0c;我这里简单介绍一下&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&#xff0c;英寸之类的 相对尺寸如px之类的是由显示器的屏幕分辨率来决定的 如windows用户分辨率一般是96像素点每英…...

阿里面试官:面试了一个能力相当不错的候选人,但背调时,他前同事和领导都说他人品很差,纠结该不该要他?...

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 在职场中&#xff0c;背调是个躲不开的事情。不管是各行各业背调可能都存在&#xff0c;只是形式不同而已。而且现在大环境不好&#xff0c;可能对个人的要求还更高一些。 背调的主…...

如何设计树形结构

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 前置知识&#xff1a;前…...

限量25台,川崎亮相Ninja ZX-10RR冬季限量款

最近川崎发布了自家ZX-10RR的超级限量版&#xff0c;官方称之为冬季测试版&#xff0c;之前也有一些车型推出过冬季测试版&#xff0c;通常是在年底推出&#xff0c;因为这个时候北半球都是非常寒冷的冬天。 不过这台ZX-10RR冬季测试版&#xff0c;并不仅仅只是限量那么简单&am…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...