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

04、Spring MVC

Spring MVC是Spring的Web模块,用来开发Web应用的,它最终作为B/S、C/S模式下的Server端

Web应用的核心就是处理HTTP请求并响应。

一、关于两种开发模式说明

我们使用Spring MVC有两个开发模式

  • 前后分离(数据与页面分离)
    • @ResponseBody
    • @RestController
    • 其涉及的生要机制是:序列化(对象 -> 串)、反序列化(串 -> 对象)
  • 前后不分离(页面由服务端进行渲染)
    • 转发
    • 重定向

后面我们对这些内容都会做详细的说明

二、入门案例

新建模块:springmvc-01-helloword

前提:我们使用脚手架搭建的是SpringBoot项目!

pom文件中添加如下依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

新增Controller类:HelloController

@Controller // 告诉spring这是一个控制器(用来处理请求)
public class HelloController {@ResponseBody   // 把返回值放到响应体当中@RequestMapping("/hello")public String handle() {return "Hello,SpringMVC! 你好!~~~";   // 默认返回值是跳转到一个页面}
}

此时我们运行脚手架,浏览器访问地址:http://localhost:8080/hello,可以看到浏览器页面上输出文本信息 Hello,SpringMVC!你好!~~~~

三、对请求的处理

@RequestMapping

通配符

这个注解称为路径映射注解,可以使用得某一个方法与一个路径进行绑定,以后收到一个请求时它的路径规则与之匹配时就会对应的使用这个绑定的方法进行处理。

路径规则:在路径位置是可以使用通配符的

*:匹配任意多个字符

**:匹配多层路径

?:匹配任意单个字符,有且必须有一个

关于通配符的一些注意点:

  • ? 必须要有且仅有一个字符,没有不行多了也不行!不可以匹配/
  • 如果我们请求的路与一个没有带通配符的映射匹配并且也与一个带了通配符的映射匹配则优先匹配那个不带通配符的,这个是精确匹配到的,所以精确匹配优先级高于模糊匹配
  • * 可以匹配0~N个字符,但是不可以匹配/,因为/是请求路径分割符
  • 当*与?的匹配都可以匹配上的时候优先匹配?的
  • 精确匹配的优先级:完全匹配 > ?> * > **
  • ** 通配符可以匹配多层路径,它只能放在最后,而*却是可以放到字符中间的
  • ** 它就是为了匹配多层路径的只能写在最后/**
  • 对于都是精确的请求路径映射绑定了多个方法的时候启动项目会报错,精确路径必须要全局唯一

请求限定

我们来说请求限定前先看看@RequestMapping的定义

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective({ControllerMappingReflectiveProcessor.class})
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}

这个注解中属性name,value,path都是指的同一个东西(映射的路径)

method属性

它用来指定请求的方法

请求的方法有:GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE

如果请求的路径匹配,但是请求的方法不匹配会报错405 Method Not Allowed

如下示例:我们要求test01这个方法绑定的请求路径/test01只能是DELETE或者是GET请求

@RequestMapping(value = "/test01", method = {RequestMethod.DELETE,RequestMethod.GET})
public String test01() {return "test01";
}

params属性

它用来指定请求参数

  • 写法一:params="username" 表示必须要带有username参数,具体请求时携带的值是什么不关心
  • 写法二:params="age=18" 表示必须要带上一个参数age,并且请求时携带的值是18
  • 写法三:params="gender!=1"  表示给定的参数gender值不可以为1,注意,这个时候如果请求没有gender参数也表示不为1,也是可行的
  • 写法四:params={"username=admin","age","gender!=1"} 一次可以指定多个参数规则
  • 写法五:params="!username"  表示不可以携带username这个参数

如果请求时,请求参数不匹配会返回400错误 Bad Request

如下例所示:

@RequestMapping(value = "/test02", params = {"username=admin", "age", "gender!=1"})
public String test02() {return "test02";
}

headers属性

它的写法与params的写法是一样的,只不过它匹配是针对的请求头中的内容

如果请求头不匹配则会返回404错误 Not Found

如下例所示:

@RequestMapping(value = "/test03", headers = "haha")
public String test03() {return "test03";
}

consumes属性

这个属性用来限定请求内容类型

consumes="application/json" 表示请求的内容类型为application/json

如果请求内容类型不匹配会返回415错误 Unsupported Media Type

如下例所示:

@RequestMapping(value = "test04",consumes = "application/json")
public String test04() {return "test04";
}

produces属性

这个属性用来限定响应类型

produces="text/html;charset=utf-8"  指定向浏览器响应的类型

如下例所示:

@RequestMapping(value = "/test05",produces = "text/html;charset=utf-8")
public String test05() {return "<h1>你好,张三</h1>";
}

关于HTTP

对于web模型来说就是请求与响应,在请求与响应之间数据交换都是使用的HTTP

请求

请求的结构:

  • 请求首行:包含 请求方式,请求路径,请求协议
  • 请求头:key: value(有多个key: value,每一对占一行)
  • 请求体:对于get请求来说,请求参数会携带在请求路径上,post请求的请求参数会放在请求体中

HTTP的默认端口号是:80

HTTPS的默认端口号是:443

get请求与post请求对比:

  • get请求参数附带在浏览地址上以明文展示,不安全;post请求参数放在请求体当中相对安全一点
  • 请求路径长度是有限制的,使用get请求参数过长需要使用post来请求
  • 对于类似于文件上传这种请求,数据无法携带在地址栏上,需要使用post请求
  • get请求一般用来查询服务器中的资源,而不对资源进行变更,post请求则一般是提交资源到服务器可能会导致资源的变更

请求头中有很多重要的信息,使用Spring MVC可以快速地获取到它们

请求体中携带大量的数据,特别是post请求,会把请求的参数放到请求体当中

 JSON数据格式

JSON:JavaScript Objecet Notation(JavaScript对象表示法)

它用于把结构化的数据表示为JavaScript对象的标准格式,常常用于在网站上表示和传输数据

JSON可以作为一个对象或者字符串存在

  • 作为对象用于解读JSON中的数据,作为字符串用于在网络上传输
  • JavaScript提供了一个全局可访问的JSON对象来对这两种数据进行转换

JSON是一种纯数据格式,它只包含属性,没有方法的

注:把字符串转为原生对象叫做反序列化;把原生成象转为可以通过网络传输的字符串叫做序列化

请求数据的接收

普通变量收集请求

如下所示

// 请求参数:username=zhangsan&password=123456&cellphone=12345678909&agreement=on
@RequestMapping("/handle01")
public String handle01(String username,String password,String cellphone,boolean agreement) {System.out.println("handle01()方法执行了!");System.out.println("username="+username+",password="+password+",cellphone="+cellphone+",agreement="+agreement);return "ok";
}

处理方法中的参数保持与请求提交过来的参数对应

  • 如果我们的请求参数中没有某个参数,那么处理方法中把这个参数封装为默认值
  • 如果请求参数中名称与方法的参数名能匹配上则直接封装上

注意:使用这种方式来接收请求参数的值要求方法中的参数名要与请求的参数名保持一致!!

使用@RequestParam注解

这个注解要写在方法参数上,如下所示

@RequestMapping("/handle02")
public String handle02(@RequestParam("username") String name,@RequestParam("password") String pwd,@RequestParam("cellphone") String phone,@RequestParam("agreement") boolean ok) {System.out.println("handle02()方法执行了!");System.out.println("username="+name+",password="+pwd+",cellphone="+phone+",agreement="+ok);return "ok";
}

这个时候客户端提交的请求参数至少要有@RequestParam中指定的这四个参数,当然比它多是没有问题的,如果少了就会报400错误 Bad Requet

如果其中某个参数不是必须的,也就是说客户端可能不传也可能传这个参数,这个时候可以在@RequestParam上指定一个属性required=false,表示这个请求参数可有可无,如下所示

@RequestParam(value = "agreement",required = false) boolean ok

这个时候请求参数:agreement 不是必须的,客户端可以不传

如果我们在没有传某个请求参数时,又不希望处理方法中的参数被赋值为默认值,想让我们的要求同赋值,则可以在@RequestParam中再加上一个属必 defaultValue="指定默认值",如下所示:

@RequestParam(value = "password",required = false,defaultValue = "123456") String pwd

这个时候请求参数password没有传的时候,pwd参数不会被赋默认的null,而是会赋值“123456”

注意:一旦我们指定了defaultValue这个属性后,其中required=false是可以省略不写的!!

使用POJO封装请求参数

先定义一个实体类

@Data
public class Person {private String username;private String password;private String cellphone;private boolean agreement;
}
@RequestMapping("/handle03")
public String handle03(Person person) {System.out.println("handle03()方法执行了!");System.out.println(person);return "ok";
}

如果我们目标方法上的参数是一个POJO时,SpringMVC会自动把请求参数与POJO属性进行匹配

匹配的原理:利用反射对处理方法上的pojo对象属性进行赋值

注意:要保证可以封装上的话需要请求参数的名称与pojo对象的属性名可以匹配上!!

如果请求参数中没有带某个对应属性的参数,则pojo中对应属性的值会封装为默认值。这个默认值如果我们自己要控制的话可以在pojo属性声明上直接给一个初始值就好了!

@RequestHeader获取请求头

如下所示:

@RequestMapping("/handle04")
public String handle04(@RequestHeader(value = "host",required = false,defaultValue = "localhost") String host,@RequestHeader("user-agent") String userAgent) {System.out.println("handle04()方法执行了!");System.out.println("userAgent="+userAgent);System.out.println("host="+host);return "ok";
}

获取请求头的方式与@RequestParam来获取请求参数的方式是类似的只是这个针对的是请求头的信息。

@CookieValue获取Cookie

如下所示:

@RequestMapping("/handle05")
public String handle05(@CookieValue("haha") String haha) {System.out.println("handle05()方法执行了!");System.out.println("haha="+haha);return "ok";
}

注意:Cookie在前后端分离的项目中是使用不了了的!!

POJO级联封装复杂对象

如下所示:

我们有一个复杂的POJO类Person

@Data
public class Person {private String username;private String password;private String cellphone;private boolean agreement;private Address address;private String sex;private String[] hobby;private String grade;
}@Data
class Address {private String province;private String city;private String area;
}

在处理器方法参数中使用这个类的对象来进行接收,会封装为这个POJO的对象 

@RequestMapping("/handle06")
public String handle06(Person person) {System.out.println("handle06()方法执行了!");System.out.println(person);return "ok";
}

@RequestBody封装json对象

前面我们获取请求数据的时候请求的数据都是按key=value这种格式来的

@RequestBody可以取出请求体的json数据自动转为对象(这里做了一个反序列化)

注意:

        1、json中的数据在请求体中,所以不可以使用get请求

        2、在json中不像在表单中,对于boolean值要使用"true"/"false",而不是“on”/"off"

文件文件

SpringMVC中专门使用MultipartFile专门用来封装文件上传的文件项

要对应的取请求中的哪个文件一般配合@RequestParam来指定

@RequestMapping("/handle08")
public String handle08(Person person,@RequestParam(value = "headerImg",required = false) MultipartFile headerImgFile,@RequestParam(value = "lifeImg",required = false) MultipartFile[] lifeImageFiles) throws IOException {System.out.println("handle08()方法执行了!");// 创建目标目录File targetDir = new File("E:\\Base\\ssm\\ssm-parent\\img");if (!targetDir.exists()) {targetDir.mkdirs(); // 如果目录不存在,则创建目录}if (headerImgFile != null) {// 获取原始文件名String originalFilename = headerImgFile.getOriginalFilename();// 获取文件大小long size = headerImgFile.getSize();// 获取文件流InputStream inputStream = headerImgFile.getInputStream();System.out.println("originalFilename=" + originalFilename + ",size=" + size);// 文件保存headerImgFile.transferTo(new File(targetDir, originalFilename));}if (lifeImageFiles.length > 0) {for (MultipartFile lifeImageFile : lifeImageFiles) {String originalFilename = lifeImageFile.getOriginalFilename();long size = lifeImageFile.getSize();InputStream inputStream = lifeImageFile.getInputStream();System.out.println("originalFilename=" + originalFilename + ",size=" + size);lifeImageFile.transferTo(new File(targetDir, originalFilename));}}System.out.println("=========文件保存成功========");System.out.println(person);return "ok";
}

SpringMVC上传文件是有默认的大小限制的,如是我们要改这个限制则需要在配置文件中修改

# 单个文件大小限制,默认是1MB,以下配置单件大小限制100MB
spring.servlet.multipart.max-file-size=100MB
# 所以文件大小限制,默认是10MB,以下配置为所有文件大小限制1GB
spring.servlet.multipart.max-request-size=1GB

HttpEntity封装请求原始数据

HttpEntity作为请求处理方法中的参数类型,它有一个泛型,其中泛型是什么就是请求体中是什么 。

HttpEntity可以一次性把整个原始请求拿过来

对于请求体中的json也可以自动反序列化为指定的对象,比如我们请求体中是一个josn想让它自动转为Person对象则可以使用HttpEntity<Person>

如下所示:

@RequestMapping("/handle09")
public String handle09(HttpEntity<Person> entity) {System.out.println("handle09()方法执行了!");// 拿到所有的请求头Ht

相关文章:

04、Spring MVC

Spring MVC是Spring的Web模块,用来开发Web应用的,它最终作为B/S、C/S模式下的Server端 Web应用的核心就是处理HTTP请求并响应。 一、关于两种开发模式说明 我们使用Spring MVC有两个开发模式 前后分离(数据与页面分离) @ResponseBody@RestController其涉及的生要机制是:…...

K8S 黑魔法之如何从 Pod 拿到节点的命令行

搞 K8S 运维的时候&#xff0c;偶尔会遇到一个难题&#xff0c;定位到问题出在某个节点上&#xff0c;而由于权限审批&#xff0c;错误配置等等各种原因&#xff0c;没有办法拿到节点的 SSH 权限&#xff0c;无法进入节点命令行进一步排障。 这个时候&#xff0c;就可以用这个…...

谷歌用Anthropic的Claude帮Gemini“打磨”性能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

React性能优化:构建更高效的应用

在现代前端开发中,React已经成为构建复杂、交互频繁应用的首选框架。然而,随着应用规模的扩大和功能的丰富,组件的频繁重渲染可能会成为性能瓶颈,影响用户体验。为了提升React应用的性能,开发者需要掌握一系列性能优化技巧和工具。本文将详细介绍React性能优化的各个方面,…...

Linux从0到1——线程同步和互斥【互斥量/条件变量/信号量/PC模型】

Linux从0到1——线程同步和互斥 1. Linux线程互斥1.1 问题引入1.2 互斥相关概念1.3 多执行流并发访问公共资源的数据不一致问题1.4 互斥量&#xff08;锁&#xff09;1.5 改进抢票系统1.6 锁的简单封装1.7 锁的实现原理1.8 可重入VS线程安全1.9 死锁 2. Linux线程同步2.1 理解同…...

无人机驾驶证对入伍有帮助吗?

无人机驾驶证对入伍确实有一定的帮助&#xff0c;主要体现在以下几个方面&#xff1a; 一、提升专业技能 无人机操作是一项高度专业化的技能&#xff0c;需要掌握飞行原理、航电系统、任务规划、紧急处理等多方面的知识。通过考取无人机驾驶证&#xff0c;个人可以系统地学习这…...

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f…...

MySQL 锁概述

1.锁的分类 根据不同的分类角度可将锁分为&#xff1a; 按是否共享分&#xff1a;S 锁、X 锁按粒度分&#xff1a;表级锁、行级锁、全局锁&#xff08;锁整个库&#xff09;、页锁&#xff08;锁数据页&#xff09;意向锁&#xff1a;意向 S 锁、意向 X 锁&#xff1a;都是表…...

springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic

牙科诊所管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定牙科诊所管理系统的…...

overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案

在插入pdf 配图后&#xff0c;编译出错提示信息如图&#xff0c;很可能的一个原因是pdf文件大小太大了&#xff0c;最好压缩一下&#xff0c;压缩到1MB以内。...

LabVIEW神经肌肉电刺激与记录系统

神经肌肉电刺激技术在康复医学和神经科学领域占有重要地位。基于LabVIEW开发了神经肌肉电刺激与记录系统&#xff0c;该系统具备可控电脉冲输出与高效数据采集功能&#xff0c;适用于临床和科研领域。 项目背景 神经肌肉电刺激技术用于治疗各类神经和肌肉系统疾病&#xff0c;…...

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...

Label-Studio X SAM 半自动化标注

教程&#xff1a;playground/label_anything/readme_zh.md at main open-mmlab/playground GitHub B站视频&#xff1a;Label Studio x Segment Anything Model 半自动化标注_哔哩哔哩_bilibili 需要注意&#xff1a; 1.LINUX上跑比较方便 2.中文路径、文件名闯大祸 3. 4…...

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件 前面分析哈希表的实现,以及文件打开的底层函数,还有保存到HASH表里的数据结构。 static MonoImageStorage * mono_image_storage_open (const char *fname) { char *key = NULL; key = mono_path_resolve_symlinks…...

【WebSocket】tomcat内部处理websocket的过程

websocket请求格式 浏览器请求 GET /webfin/websocket/ HTTP/1.1。 Host: localhost。 Upgrade: websocket。 Connection: Upgrade。 Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg。 Origin: http://服务器地址。 Sec-WebSocket-Version: 13。 服务器响应 HTTP/1.1 101 Swi…...

将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)

封装组件看这个&#xff0c;然后理解父子组件传值 应用场景&#xff1a; 1.使用v - model语法实现双向绑定&#xff08;传值两边都不用定义方法接数据&#xff09; 1.子组件 1. update:modelValue事件是MultiSelect组件对象自带的事件 2.:options"countries" opti…...

Linux下通用型shellcode的编写

实验目的及要求 目的&#xff1a; 通过对本实验执行过程的理解&#xff0c;认真分析总结&#xff0c;能够独立的在 Linux 下进行 shellcode 的编写。 要求&#xff1a; &#xff08;1&#xff09;%70&#xff1a;完成对 shellcode 的分析及提取 &#xff08;2&#xff09;%…...

STM32F103RCT6学习之二:GPIO开发

GPIO基础 1.简介 2.GPIO基本结构 3.种模式 GPIO基本功能 1.输出功能--LED灯闪烁 1)进行基本配置 2)编辑代码 主要在main.c中编辑。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------------------------------…...

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...

C++、Python有哪些相同和不同

C 和 Python 是两种流行的编程语言&#xff0c;设计理念和应用场景各有不同&#xff0c;但也有一些相似之处。以下是它们在语言特性、性能、语法等方面的相同点和不同点的比较&#xff1a; 相同点 支持多种编程范式&#xff1a; 面向对象编程 (OOP)&#xff1a;两者都支持类、继…...

Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports

Spring Boot 提供了强大的自动配置功能&#xff0c;通过约定优于配置的方式大大简化了应用开发。随着版本迭代&#xff0c;自动配置的实现方式也逐渐优化&#xff0c;从早期的 spring.factories 文件到最新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConf…...

HarmonyOS Next 应用元服务开发-应用接续动态配置迁移按需退出

按需退出&#xff0c;支持应用动态选择迁移成功后是否退出迁移源端应用&#xff08;默认迁移成功后退出迁移源端应用&#xff09;。如果应用不想让系统自动退出迁移源端应用&#xff0c;则可以设置不退出&#xff0c;参数定义见SUPPORT_CONTINUE_SOURCE_EXIT_KEY。 示例&#x…...

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…...

使用Python pickle模块进行序列化

使用Python pickle模块进行序列化 在Python中&#xff0c;pickle模块是一个用于实现数据序列化与反序列化的强大工具。与json模块不同的是&#xff0c;pickle支持将几乎所有的Python对象进行序列化&#xff0c;包括字典、列表、类实例&#xff0c;甚至函数。这使得它在处理复杂…...

责任链模式(ChainofResponsibilityPattern)

文章目录 1.定义2.结构3.问题描述代码实现 1.定义 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 2.结构 处理者(Handler)&#xff1a;声明了所有具体处理者的通用接口。 该接口通常…...

自定义 Element Plus 树状表格图标

在开发使用 Element Plus 的树状表格时&#xff0c;默认的展开/收起图标可能不能满足设计需求。为了更符合项目要求&#xff0c;可以通过覆盖样式的方式来自定义这些图标。以下记录了实现自定义树状表格图标的完整过程。 实现效果 有子节点且未展开时&#xff1a;显示一个加号…...

Vue2:用一个例子理解一下vue template中属性前面的冒号“:“

常用写法 table中绑定数据,我们通常这么写: ​​​​​​​<el-table :data="tableData" style="width: 100%">data() {tableData:[], } data绑定变量名可变的动态对象 但是上一篇文中,因为要生成15组相似的table,它们的格式都一样,只是数据…...

AF3 partition_tensor函数源码解读

该函数将输入张量按原子维度 (n_atoms) 分块,以局部窗口方式滑动,生成 滑动窗口张量。 在神经网络中,尤其是处理大规模序列数据(例如蛋白质原子特征)时,直接对整个序列执行操作可能会导致计算和内存效率问题。partition_tensor 函数通过对输入张量进行分块(partitions)…...

C++类与对象上

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 例如洗衣服&#xff1a; C是基于面向对象的&#xff0c;关注的是对象&#xff0c;讲一件事拆分成不同的对象&#xff0c;靠对…...

中巨伟业推出高安全高性能32位智能卡内核可编程加密芯片SMEC88SP/ST

1、产品特性  以最高安全等级的智能卡芯片内核为基础&#xff0c;具有极高的软硬件安全性  实现客户关键功能或算法代码下载&#xff0c;用户可以灵活实现自有知识产权的保护  标准 SOP8、SOT23-6 封装形式&#xff0c;器件封装小  标准 I2C 接口&#xff0c;具有接…...

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展&#xff0c;详细解释了如何利用Python进行微博爬虫&#xff0c;爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了&#xff0c;就是用户利用代码模拟Ajax请求&#xff0c;发…...

包管理工具npm、yarn、pnpm、cnpm详解

1. 包管理工具 1.1 npm # 安装 $ node 自带 npm# 基本用法 npm install package # 安装包 npm install # 安装所有依赖 npm install -g package # 全局安装 npm uninstall package # 卸载包 npm update package # 更新包 npm run script #…...

Docker和Kubernetes(K8s)区别

目录 1. Docker Docker 的核心概念&#xff1a; Docker 的功能&#xff1a; Docker 常见使用场景&#xff1a; 2. Kubernetes (K8s) Kubernetes 的核心概念&#xff1a; Kubernetes 的功能&#xff1a; Kubernetes 常见使用场景&#xff1a; 3.Docker 和 Kubernetes 的…...

龙智出席2024零跑智能汽车技术论坛,分享功能安全、需求管理、版本管理、代码扫描等DevSecOps落地实践

龙智快讯 2024年12月5日&#xff0c;由零跑和盖世汽车主办的“2024零跑智能汽车技术论坛”在杭州零跑总部圆满落幕。此次技术论坛聚焦AI语言大模型、AUTOSAR AP平台、DevOps、端到端自动驾驶等热点话题展开探讨&#xff0c;旨在推动智能汽车技术的创新与发展。 龙智作为国内领先…...

SQL进阶技巧:如何分析双重职务问题?

目录 0 背景描述 1 数据准备 2 问题分析 方法2&#xff1a;利用substr函数&#xff0c;充分利用数据特点【优秀解法】 3 小结 0 背景描述 在 CompuServe 刚成立时&#xff0c;Nigel Blumenthal 遇到一个应用程序中的困难。他需要获取公司人员所担任角色的源表&#xff0c;…...

SAQ问卷的定义,SAQ问卷是什么?

SAQ问卷&#xff0c;全称为可持续发展评估问卷&#xff08;Sustainability Assessment Questionnaire&#xff09;&#xff0c;是一种在线自评工具&#xff0c;其深远意义与广泛应用在当今商业环境中愈发凸显。它不仅是一种衡量企业在环境、社会和治理&#xff08;ESG&#xff…...

Express.js 有哪些常用的中间件?

在使用 Express.js 开发应用程序时&#xff0c;中间件&#xff08;Middleware&#xff09;是处理请求和响应的关键组件。它们可以执行各种任务&#xff0c;如解析请求体、添加HTTP头部、记录日志等。以下是一些常用的中间件&#xff1a; body-parser 用于解析传入的请求体。它…...

K8s DaemonSet的介绍

1. 什么是 DaemonSet&#xff1f; DaemonSet 是 Kubernetes 中的一种控制器&#xff0c;用于确保每个&#xff08;或某些指定的&#xff09;节点上运行一个 Pod 副本。它是为部署守护进程设计的&#xff0c;例如需要在每个节点上运行的任务或工具。 特点&#xff1a; Pod 会随…...

同步异步日志系统:设计模式

设计模式是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的⼀系列套路。它不是语法规定&#xff0c;⽽是⼀ 套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。 为什么会产生设计模式这样的东西呢&#xff1f;就像人类历史发展会产生兵法。最开…...

【GO基础学习】Gin 框架中间件的详解

文章目录 中间件详解中间件执行全局中间件路由级中间件运行流程中间件的链式执行中断流程 代码示例 gin框架总结 中间件详解 Gin 框架中间件是其核心特性之一&#xff0c;主要用于对 HTTP 请求的处理进行前置或后置的逻辑插入&#xff0c;例如日志记录、身份认证、错误处理等。…...

ubuntu停止.netcore正在运行程序的方法

在Ubuntu系统中停止正在运行的.NET Core程序&#xff0c;你可以使用以下几种方法&#xff1a; 使用kill命令&#xff1a; 如果你知道.NET Core程序的进程ID&#xff08;PID&#xff09;&#xff0c;你可以直接使用kill命令来停止它。首先&#xff0c;使用ps命令配合grep来查找.…...

图神经网络_图嵌入_Struc2Vec

0 背景 之前的node embedding方式&#xff0c;都是基于近邻关系&#xff0c;但是有些节点没有近邻&#xff0c;也有结构相似性。如图中的u、v节点。 struc2vec算法适用于捕获结构相似性。 1 相似度&#xff08;距离&#xff09;计算 1.1 公式 f k ( u , v ) f k − 1 ( u …...

LabVIEW应用在工业车间

LabVIEW作为一种图形化编程语言&#xff0c;以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中&#xff0c;LabVIEW不仅能够实现快速开发&#xff0c;还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…...

js-000000000000

1、js书写的位置 - 内部 <body> <!-- 习惯把 js 放到 /body 的后面 --> <script> console.log(这是内部 js 的书写位置) alert(内部js) </script> </body> <body><!-- 习惯把 js 放到 /body 的后面 --><script>console.log(这…...

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中&#xff0c;首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现&#xff0c;详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...

虚幻引擎是什么?

Unreal Engine&#xff0c;是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计&#xff0c;但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏&#xff0c;现在也用于电影的虚拟制片…...

分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】

背景&#xff1a; 从2008年&#xff0c;从事分布式光纤传感行业已经过了16年时间了&#xff0c;依稀记得2008年&#xff0c;看的第一遍论文就是中国计量大学张在宣老爷子的分布式光纤测温综述&#xff0c;我的经历算是行业内极少数最丰富的之一。混过学术圈&#xff1a; 发表…...

【无标题】学生信息管理系统界面

网页是vue框架&#xff0c;后端直接python写的没使用框架...

ES7+ React/Redux/GraphQL/React-Native snippets 使用指南

VS Code React Snippets 使用指南 目录 简介基础方法React 相关React Native 相关Redux 相关PropTypes 相关控制台相关React 组件相关 简介 ES7 React/Redux/GraphQL/React-Native snippets 是一个用于 VS Code 的代码片段插件&#xff0c;它提供了大量用于 React 开发的代…...

Java中三大构建工具的发展历程(Ant、Maven和Gradle)

&#x1f438; 背景 我们要写一个Java程序&#xff0c;一般的步骤是编译&#xff0c;测试&#xff0c;打包。 这个构建的过程&#xff0c;如果文件比较少&#xff0c;我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大&#xff0c;文件越来越多&#xff0c…...