【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 {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public String save(){
        System.out.println("User save...");
        return "{'module': 'springmvc'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public 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")
    @ResponseBody
    public String save(){
        System.out.println("User save...");
        return "{'module': 'user save'}";
    }

    @RequestMapping("/user/delete")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public String save(){
        System.out.println("User save...");
        return "{'module': 'user save'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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 {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected 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")
    @ResponseBody
    public String commonParam(){
        return "{'module': 'common param'}";
    }
}

domain/User.java:

package com.demo.domain;

public class User {
    private String name;
    private int age;

    @Override
    public 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;

    @Override
    public 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")
    @ResponseBody
    public 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 {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected 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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

熔断,降级,限流

文章目录 熔断概念为什么需要熔断熔断器模型熔断策略 降级概念熔断和降级的关系熔断降级限时降级限流降级 参考文章 熔断和降级都是自我保护的一种机制&#xff0c;但二者又有所不同。 熔断 概念 “熔断”一词早期来自股票市场。熔断[Circuit Breaker]也叫自动停盘机制&#…

Gradle 简单入门

Gradle简单介绍&#xff1a; Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;也增加了基于Kotlin语言的kotlin-based DSL&#xff0c;抛弃了基于XML的各种繁琐配置。面向Java应用…

【GoLang】哪些大公司正在使用Go语言

你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 你见过哪些令你膛目结舌的代码技巧&#xff1f;前言&#xff1a;哪些大公司正在使用Go语言谷歌&#xff08;Google&#xff09;&#xff1a;脸书&#xff08;Facebook&#xff09;&#xff1a;亚马逊&#xff08;Amazon…

TikTok手工艺新潮流:小视频中的手作乐趣

随着短视频平台的兴起&#xff0c;TikTok以其独特的创意和活力&#xff0c;成为了全球用户分享生活、展示才华的热门平台之一。本文将深入探讨TikTok上涌现的手工艺潮流&#xff0c;揭示小视频中的手作乐趣如何成为一种全新的艺术表达方式。 TikTok手工艺的独特之处 TikTok提供…

实验一传统的结构化的软件工程方法、实验二面向对象的软件工程、实验三软件测试

背景&#xff1a; 实验一 传统的结构化的软件工程方法 1实验目的 了解传统的软件工程方法的基本原理&#xff0c;掌握软件生命周期的全过程依次划分为需求分析、总体设计、详细设计、编码、测试、维护等几个重要阶段。每个阶段所要完成的任务以及提交的文档。 2实验内容 …

32 在Vue3中如何同时定义多个插槽

概述 当你想要给外部预留多个位置的时候&#xff0c;具名插槽就非常有用了。 比如&#xff0c;我们定义一个卡片&#xff0c;让别人使用的时候&#xff0c;标题可以自定义&#xff0c;内容也可以自定义&#xff0c;这个时候就需要两个插槽。 基本用法 我们创建src/componen…

行业前景咋样?大厂找我用C++抓取化工产品数据并分析

最近又来活了&#xff0c;天天忙到半夜&#xff0c;但是想想收益还是再坚持坚持。是这么一回事&#xff0c;兄弟所在的化工公司最近想看看某些行业数据&#xff0c;看看市面的同类型产品销量收益等情况是否满足预期效果&#xff0c;也就找到我让我给用爬虫写一个采集并分析的报…

基于Java SSM框架实现教学质量评价评教系统项目【项目源码+论文说明】

基于java的SSM框架实现教学质量评价评教系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;教学质量评价系统当然也不能排除在外。教学质量评价系统是以实际运用为…

机器学习 | 密度聚类和层次聚类

密度聚类和层次聚类 密度聚类 背景知识 如果 S 中任两点的连线内的点都在集合 S 内&#xff0c;那么集合 S称为凸集。反之&#xff0c;为非凸集。 DBSCAN 算法介绍 与划分和层次聚类方法不同&#xff0c;DBSCAN(Density-Based Spatial Clustering of Applications with Noi…

【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

MySQL基本操作 DDL DML DQL三大操作介绍

DDL 数据(结构)定义 创建表DML 数据操作 增删改DQL 查询语句 DDL 数据(结构)定义 创建表 创建 删除数据 注释 --空格内容 创建数据库 CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]eg:CREATE DATABASE IF NOT EXISTS school CHARSET utf8如果对应school不存在,…

Python学习笔记(六):函数的多返回值、函数的多种参数使用形式、匿名函数、文件的读取操作、文件的写入 、文件的追加

目录 一、函数的多返回值 二、函数的多种参数使用形式 2.1位置参数 2.2关键字参数 2.3缺省参数 2.4不定长参数 三、匿名函数 3.1 函数作为参数传递 3.2 函数的定义 3.3 匿名函数定义语法&#xff1a; 四、文件的读取操作 4.1 open&#xff08;&#xff09;打开函数…

2023 英特尔On技术创新大会直播 |我感受到的“芯”魅力

文章目录 每日一句正能量前言AI时代&#xff0c;云与PC结合为用户带来更好体验全新处理器&#xff0c;首次引入针对人工智能加速的NPU大模型时代&#xff0c;软硬结合带来更好训练成果后记 每日一句正能量 成长是一条必走的路路上我们伤痛在所难免。 前言 在2023年的英特尔On技…

【UML】第8篇 用例图(3/3)

目录 一、用例的关系 1.1 泛化&#xff08;Generalization&#xff09;关系 1.2 包含&#xff08;include&#xff09;关系 1.3 扩展关系 二、用例表示例 不是非要把电影改成连续剧&#xff0c;给大家播&#xff0c;确实是时间和精力有限。 用例图&#xff0c;虽然简单&…

一个网卡能设置(绑定)两个或多个IP

昨天领导问我&#xff0c;一个网卡设置两个IP。我就有点发愣&#xff1a;一个网卡能设置两个IP吗&#xff1f;我倒是见过一个机器插两个网卡&#xff0c;同时支持内网和外网。一个网卡设置两个IP&#xff0c;以谁为准&#xff1f; 上网搜索了一下&#xff0c;还真可以&#xff…

MySQL——基础篇

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/?spm_id_from333.999.0.0&vd_source619f8ed6df662d99db4b3673d1d3ddcb 前言✴️ 基础篇——MySQL概述、SQL、函数、约束、多表查询、事务 进阶篇——存储引擎、索引、SQL优化、视图/存储过程/触发…

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…

vue的语法模板与数据绑定的说明

vue的两大模板语法&#xff1a; 1.插值语法 2.指定语法 插值语法&#xff1a;{{}} 功能&#xff1a;用于解析标签体的内容 写法&#xff1a;{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性 指定语法&#xff1a; 功能:用于解析标签(包括:标签属性、标…

判断数据是否为整数--函数设计与实现

#定义函数&#xff1a;is_num(s),判断输入的数据是否整数。 #(1)判断是否是数字 def is_num(s):if s.isdigit(): #isdigit()是一个字符串方法&#xff0c;用于检查字符串是否只包含数字字符。如果字符串只包含数字字符&#xff0c;则返回True&#xff1b;否则返回Falsereturn T…

订货系统本地化部署的三大优势

批发贸易行业&#xff0c;订货系统的本地化部署成为了许多企业的首选。本地化部署意味着将订货系统部署在企业自己的服务器上&#xff0c;而不是依赖于云服务提供商。这种部署方式有许多优势&#xff0c;以下是其中的四个主要优势&#xff1a; 1. 数据安全性&#xff1a;本地化…