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

2023.11.20 关于 Spring MVC 详解

目录

MVC

工作流程

Spring MVC 

掌握三个功能

创建 Spring MVC 项目 

推荐安装插件 EditStarters

基础注解

 @RequestMapping

指定 GET 和 POST 方法类型

@ResponseBody

获取参数 

传递 单个 或 多个参数

参数重命名 @RequestParam

接收 JSON 对象 @RequestBody

获取 URL 中参数 @PathVariable

上传文件 @RequestPart

获取 Cookie 数据

 使用 @CookieValue 注解方式

获取 Header 数据

使用注解 @RequestHeader 方式

读取 Session 数据

 使用 @SessionAttribute 注解方式

返回静态页面

返回 JSON 对象


MVC

  • MVC 是一种 软件设计模式
  • 将应用代码组织成三个互相交织的部分:模型、视图、控制器

模型(Model)

  • 业务流程 或 状态的处理以及业务规则的制定者
  • 与数据库交互的逻辑

视图(View)

  • 视图代码用户交互界面
  • 对于Web应用来说,可以大致概括为 HTML 页面
  • 视图是用户接口和交互

控制器(Controller)

  • 控制器可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求
  • 是视图和数据库之间的中介

工作流程

  1. 客户端向服务器发起 HTTP 请求
  2. 控制器(Controller)接收 HTTP 请求并向 模型(Model)请求信息
  3. 模型(Model)对象 在数据库中进行相应数据的存取,完成后将响应信息返回给 控制器(Controller)
  4. 控制器(Controller)收到响应信息后,又将其交给 视图(View)渲染结果,展示给用户,即通过 视图(View)将 HTTP 响应传递给用户

Spring MVC 

  • MVC 是一种思想,Spring MVC 是对 MVC 思想的实现
  • Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架
  • 常说的 SSM 项目就等于 Spring Boot + Spring MVC + MyBatis

掌握三个功能

连接功能

  • 将用户(浏览器)和 Java 程序连接起来
  • 即可以访问一个能够调用 Spring 程序的地址

获取参数功能

  • 用户访问时会带一些参数,如 query string
  • 在程序中能够获得该参数

输出数据功能

  • 根据请求计算响应,将响应结果返回给用户

创建 Spring MVC 项目 

 建议点击下方链接 详细了解创建过程

Spring Boot 的创建及使用


  • 创建 Spring MVC 项目的关键为 添加 Spring Web 依赖
  • 该依赖包含了 MVC


推荐安装插件 EditStarters

  • 该插件可以方便地设置 Spring Boot 项目的依赖

安装步骤

注意:

  • 安装完该插件后最好重启 IDEA

使用方法

  • 在 pom.xml 页面中,按快捷键 Alt + Insert,点击 Edit Starters

  • 选择需要添加依赖


实现连接功能

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller //让 Spring 项目启动时,将这个注解下的类加载到容器中
@ResponseBody //使其返回的响应是数据,而非页面
@RequestMapping("/test") //注册路由
public class TestController {@RequestMapping("/hi") //注册路由public String sayHi() {return "hi Spring MVC!";}
}

运行结果:

  • 在浏览器的 URL 输入框中 输入相对应的 URL

基础注解

 @RequestMapping

  • 可以用来修饰 类 或 方法
  • 用来将 HTTP 请求路径映射到对应的处理方法上

实例理解

//此处的 路由设置可以是 一级路由 也可以是 N级路由
@RequestMapping("/test/index")
  • 该写法注解 支持 GET 和 POST 两种请求类型
  • 当然我们也可以 通过设置method 或 使用其他注解 来指定接收 GET 或 POST 请求

指定 GET 和 POST 方法类型

  • GET 请求的三种写法
// 写法一
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法二
@GetMapping("/index")
  • POST 请求的两种写法
// 写法一
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法二
@PostMapping("/index")

@ResponseBody

  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端
  • @ResponseBody 可以用来修饰方法 或 类,修饰类表示类中所有的方法都遵循上条规定,而不是返回 静态页面

阅读下面文章之前 建议点击下方链接了解 Postman 的使用

Postman 的使用

根据链接文章目录寻找对应 Postman 内容


获取参数 

  • Spring MVC 中可以直接通过方法中的参数来传参
  • 注意以下两点

参数名称匹配

  • 在 Spring MVC 中,当有多个参数进行参数匹配时,是按照参数的名称进行匹配的,而不是参数的位置
  • 这意味着,无论你在方法中如何排列参数,只要参数的名称与前端传递的参数名称相匹配,就可以正确的获取到参数值

包装类类型参数

  • 在Spring MVC 中,建议方法的参数使用包装类类型,而非基础类类型
  • 如果方法的参数为基础类型(int、double 等),当前端忘记传递参数时,程序会报 500 错误
  • 因为基础类型不能为 null
  • 而如果参数类型为包装类类型(Integer、Double等),即使前端忘记传递参数,参数值也只会为 null,不会引发报错

传递 单个 或 多个参数

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/message")public void getUserMessage(String name,String age) {System.out.println("name" + name);System.out.println("age" + age);}
}
  • 上述代码中的方法参数与 URL 中 query string 的 key 值相对应

测试结果

  • 此处我们使用 Postman 来构造 HTTP 请求 来访问 getUserMessage 方法

  • 点击 send 发送构造好的 HTTP 请求,随后观察控制台的打印


参数重命名 @RequestParam

  • @RequestParam 注解有三个属性

value

  • 请求参数名(必须配置)
  • 如果想重命名参数,可以在 value 属性中指定新的参数名

required

  • 默认为 true,即 请求中必须包含该参数,如果未包含将直接抛出异常
  • 设置为 false ,表示该参数为 非必传参数

defaultValue

  • 表示参数的默认值
  • 如果设置了 defaultValue,则无论是否配置了 required,required 都将被自动设置为 false

实例理解

  • 当前端传递的参数 key 为 t1
  • 此时后端便可以用 @RequestParam 注解 来重命名后端的参数名为 startTime
  • 即用 startTime 来接收前端传来的 参数名为 t1 的值
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/time")public void getTime(@RequestParam(value = "t1", required = false) String startTime,@RequestParam(value = "t2", required = true, defaultValue = "2023.12.30") String endTime) {System.out.println("起始时间:" + startTime);System.out.println("结束时间:" + endTime);}
}
  • 该段代码将 t1 重命名为 startTime,将 t2 重命名为 endTime
  • 此时 startTime 被设置为 非必传参数
  • endTime 的 required 被设置为 true ,表示前端发送的请求中必须包含 t2 字段
  • 但是 endTime 又被设置了 defaultValue,表示其默认值为 "2023.12.30" 
  • 所以即使 endTime 的 required 被设置为了 true,但是又因为 defaultValue 的设置,从而导致 endTime 的 required 又被自动设置为了 false

验证结果:

  • 运行结果正如我们所期望的一样
  • 虽然请求中未包含 t2 字段,但并未抛出异常,正常接收到了 请求中的参数值

接收 JSON 对象 @RequestBody

实例理解

  • 此时前端想发送的请求如下图所示

  • 首先我们先创建一个 User 实例类,与请求的 JSON 相对应
import lombok.Data;
import org.springframework.stereotype.Component;@Component
@Data
public class User {private int id;private String name;private int age;
}
  • 然后我们再使用 @RequestBody 来接收 JSON 对象,并打印出来
import com.example.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/message")public void getUserMessage(@RequestBody User user) {System.out.println(user.toString());}
}

运行结果:


获取 URL 中参数 @PathVariable

实例理解

  • 此时前端想发送的请求如下图所示

  • 我们使用 @POSTMapping 注解来接收 URL 中的参数值
import com.example.demo.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@PostMapping("/urlValue/{name}/{age}")public String getUrlValue(@PathVariable(value = "name") String name,@PathVariable(value = "age",required = false) String age) {return "name:" + name + ", age:" + age;}
}

注意:

  • 此处的参数 name 为必传参数,age 为非必传参数

运行结果:

  • 一般来说清晰、有意义的URL结构可以提高你的网站在搜索引擎中的排名
  • 使用路径变量(如 "/user/{id}") ,而不是查询字符串(如 "/user?id=123")可以使URL 看起来更加整洁和易于理解,这有可能帮助提高 SEO 效果
  • SEO 全称为 Serch Engine Optimization,译为 搜索引擎优化
  • SEO 是一种利用引擎的规则提高网站在有关搜索引擎内的自然排名
  • 目的是让其在行业占据领先地位,获得品牌效益

上传文件 @RequestPart

实例理解

  • 此时前端通过 from 表单将文件传给后端
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@Controller
@ResponseBody
@RequestMapping("/file")
public class FileController {@RequestMapping("/up-file")public String upFile(@RequestPart("myfile")MultipartFile file) throws IOException {String path = "E://photo.jpg";
//        将传来的文件存放到对应的目录下file.transferTo(new File(path));return "文件保存到 " + path;}
}
  • 通过 Postman 来构造 from 表单来给后端传输文件

注意:

  • 仅使用上述方式来实现 文件的上传和保存,会存在一个问题即 后面上传的图片会覆盖前面上传的图片
  • 因为 我们所设置的文件保存路径 path 是不变的

解决方法

  • UUID 全称为通用唯一标识码,即每个人都可以创建不与其他人冲突的 UUID,具有唯一性
  • 从而我们可以 引入 UUID 来作为上传文件的文件名
  • 因此保证了每一个上传的文件都会拥有一个唯一的保存路径 path
import org.springframework.stereotype.Controller;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Controller
@ResponseBody
@RequestMapping("/file")
public class FileController {@RequestMapping("/only-file")public String upFile(@RequestPart("myfile")MultipartFile file) throws IOException {
//        获取上传文件的原始文件名,并从中提取出文件的后缀名String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//        生产一个文件路径,该路径位于 static 目录下,并且文件名是一个随机的 UUID 加上文件的后缀名String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + "/" + UUID.randomUUID() + fileName;file.transferTo(new File(filePath));return filePath + "upload success!";}
}
  • 同样 通过 Postman 来构造 from 表单来给后端传输文件

  • 同时我们也可以在 URL 中输入对应的文件名来访问所上传的文件

获取 Cookie 数据

  •  Spring MVC 基于 Servlet 实现
  • 所以获取 Cooike 数据也是通过 HttpServletRequest 的 getCookie 方法

传统方式

实例理解

  • 此处通过打印日志信息,来方便结果的观察
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;@Controller
@ResponseBody
@RequestMapping("/cookie")
@Slf4j
public class CookieController {@RequestMapping("/get-cookie")public String getCookie(HttpServletRequest request) {Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {log.error("key:" + cookie.getName() + ",value" + cookie.getValue());}return "get Cookie Success!";}
}
  • 在浏览器中自定义测试 cookie 

  • 在浏览器的 URL 地址框中输入相对应地址

  • 在控制台中观察 Spring MVC 拿到的 cookie 信息


 使用 @CookieValue 注解方式

实例理解

  • 通过使用 @Cookievalue 注解来直接获取 cookie 所对应 name 为 "xiaolin" 的 value 值
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
@RequestMapping("/easy-cookie")
public class EasyCookieController {@RequestMapping("/easy-get")public String easyGetCookie(@CookieValue("xiaolin") String value) {return "cookie: " + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址

获取 Header 数据

  •  Spring MVC 基于 Servlet 实现
  • 所以获取 Header 数据也是通过 HttpServletRequest 的 getHeader 方法

传统方式

实例理解

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;@Controller
@ResponseBody
@RequestMapping("/header")
public class HeaderController {@RequestMapping("/old-header")public String getHeader(HttpServletRequest request) {String UserAgent = request.getHeader("User-Agent");return "old get header success! User-Agent = " + UserAgent;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取到 " User-Agent " 的值


使用注解 @RequestHeader 方式

实例理解

  • 通过使用 @RequestHeader 注解来直接获取 header 中 " User-Agent " 的值
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
@RequestMapping("/header")
public class HeaderController {@RequestMapping("/get-header")public String getHeader(@RequestHeader("User-Agent")String ua) {return "get header success! User-Agent = " + ua;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取 " User-Agent " 的值

读取 Session 数据

  •  Spring MVC 基于 Servlet 实现
  • 所以读取 Session 数据也是通过 HttpServletRequest 的 getSession 方法

  • 首先为了能够读取到 Session 数据,我们得先自己设置 session 对象的属性
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
@ResponseBody
@RequestMapping("session")
public class SessionController {@RequestMapping("set-session")public String setSession(HttpServletRequest request) {HttpSession session = request.getSession(true);session.setAttribute("MasterMao","hello");return "set Session Success";}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来通过该请求调用到 setSession 方法


传统方式

实例理解

  • 此处使用 getSession 来读取 Session 数据
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
@ResponseBody
@RequestMapping("session")
public class SessionController {@RequestMapping("read-session")public String readSession(HttpServletRequest request) {HttpSession session = request.getSession(false);String value = (String) session.getAttribute("MasterMao");if (value == null) {return "session error!";}return "get Session Success! value = " + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取到 Session 数据


 使用 @SessionAttribute 注解方式

实例理解

  • 通过使用 @SessionAttribute 注解来直接获取 session 属性名为 "MasterMao" 所对应的属性
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;@Controller
@RequestMapping("easy-session")
@ResponseBody
public class EasySessionController {@RequestMapping("easy-read")public String easyReadSession(@SessionAttribute(value = "MasterMao", required = false) String value) {return "easy read session success! value =" + value;}
}
  • 在浏览器的 URL 地址框中输入相对应地址,来读取到 Session 数据

返回静态页面

  • Spring MVC 默认情况下返回的是 View 视图(xxx.html)
  • 而上文中我们通过添加 @ResponseBody 注解,修改成了 后端返回给前端的是数据,而非页面
  • 此时我们不加 @ResponseBody 注解,就让后端返回一个静态页面给前端

实例理解

  • 首先我们需在对应目录下创建一个前端页面,如下图所示

  • 然后编写 index.html 页面内容
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>测试页面</title>
</head>
<body><h3>Hello Spring MVC!</h3>
</body>
</html>
  • 后端编写如下代码,返回 index.html 页面给前端
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/html")
public class IndexController {@RequestMapping("/index")public String respIndex() {
//        编写业务逻辑代码return "/index.html";}
}
  • 启动程序,在浏览器中输入对应的 URL 地址

注意:

  • 当程序启动后,浏览器可直接直接访问 static 目录下的前端页面

  • 一个 URL 地址为 localhost:8080/html/index
  • 该地址表示向程序中发送请求,根据 URL 的路径对应到程序中相应的控制器方法上
  • 此处对应的控制器方法为 respIndex 方法,然后执行该方法中业务逻辑,处理该请求
  • 又由于 Spring MVC 默认情况下返回的是页面,此处我们也未添加 @ResponseBody 注解
  • 即 respIndex 方法返回的字符串,被 Spring MVC 转变为相对应的页面,返回给了前端
  • 另一个 URL 地址为 localhost:8080/index.html
  • 该 URL 地址直接指向静态 HTML 文件
  • 即服务器将直接返回 index.html 文件的内容,不经过任何控制器方法

返回 JSON 对象

  • 在 SpringMVC 中返回 HashMap 对象,实际上就是返回 JSON 对象给前端

实例理解

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;@Controller
@RequestMapping("/json")
@ResponseBody
public class JsonController {@RequestMapping("/get-json")public HashMap<String,Integer> respJson() {HashMap<String,Integer> map = new HashMap<>();map.put("xiaolin", 1);map.put("maolin", 2);map.put("xiaomei", 3);return map;}
}

运行结果:

相关文章:

2023.11.20 关于 Spring MVC 详解

目录 MVC 工作流程 Spring MVC 掌握三个功能 创建 Spring MVC 项目 推荐安装插件 EditStarters 基础注解 RequestMapping 指定 GET 和 POST 方法类型 ResponseBody 获取参数 传递 单个 或 多个参数 参数重命名 RequestParam 接收 JSON 对象 RequestBody 获取 …...

救命~终于找到一款好看又舒适的家居服了

暖乎乎的软糯家居服 简直不要太好看太舒服了 双层舒棉绒舒适又暖和 防风收口设计&#xff0c;时尚与实用性兼具 经典版型不挑人穿 居家外出都可哦&#xff01;&#xff01;...

C#每天复习一个重要小知识day5:枚举与switch是天生一对

因为枚举一般用来表示条件和类型等等&#xff0c;所以它一般用条件分支来表现。所以枚举与switch是天生一对&#xff0c;因为很方便。&#xff08;用if语句也可&#xff0c;但是没switch方便&#xff09; 简单的举例&#xff1a; namespace 精细练习 {enum E_Player {Main,Ot…...

idea修改行号颜色

前言 i当idea用了深色主题后&#xff0c;发现行号根本看不清&#xff0c;或者很模糊 例如下面这样 修改行号颜色 在IntelliJ IDEA中&#xff0c;你可以根据自己的喜好和需求定制行号的颜色。下面是修改行号颜色的步骤&#xff1a; 打开 IntelliJ IDEA。 转到 “File”&…...

U-boot(四):start_armboot

本文主要探讨210的uboot启动的第二阶段&#xff0c;主要函数为start_armboot。 uboot 一阶段初始化SoC内部部件(看门狗、时钟等),初始化DDR,重定位 二阶段初始化其余硬件(iNand、网卡芯片)以及命令、环境变量等 启动打印硬件信息,进入bootdelay,读秒完后执行bootc…...

.Net面试题4

1.请解释一下泛型&#xff08;Generics&#xff09;在C#中的作用。 泛型是一种将数据类型参数化的机制&#xff0c;使得代码可以在编译时具有更强的类型安全性和灵活性。C#中的泛型可以用于类、接口、方法等的定义和实例化。泛型允许在编写代码时使用具有不同实参的类型&#x…...

python 列表插入数据的 四种方法 append insert extend 切片赋值

append insert 插入单个数据 append 加到末尾&#xff0c;insert 加到指定位置 extend、切片方式插入多个数据 extend 加到末尾&#xff0c;切片加到指定位置 my_list [1, 2, 3] my_list.append(4) print(my_list) # 输出: [1, 2, 3, 4]my_list [1, 2, 3] my_list.insert(…...

C++中std::string的=,+,+=使用过程中的问题

1. 调用构造函数时的运算符不支持int&#xff0c;char类型的操作数 string str1 a; //error 这是一个构造函数。C中string是一个类&#xff0c;内部封装了char *来管理这个字符串。 string的构造函数&#xff1a; string() // 创建一个空的字符串string(const char * s)…...

ruoyi-plus使用Statistic统计组件升级element-plus

原本使用的就是gitee上lionli的ruoyi-plus版本的代码。但是在使用过程中作首页数据看板时想使用elementui的Statistic统计组件。结果在浏览器控制台报错找不到组件el-statistic 于是查看elementui的历史版本&#xff0c;发现是在新版中才有这个组件&#xff0c;旧版本是没这个组…...

Python基础入门例程72-NP72 生成字典(字典)

最近的博文: Python基础入门例程71-NP71 喜欢的颜色(字典)-CSDN博客 Python基础入门例程70-NP70 首都(字典)-CSDN博客 Python基础入门例程69-NP69 姓名与学号(字典)-CSDN博客 目录 最近的博文: 描述...

flink的java.lang.IllegalStateException: Buffer pool is destroyed 异常

背景 最近flink的在线应用出现错误java.lang.IllegalStateException: Buffer pool is destroyed&#xff0c;本文记录下这个错误的原因 错误原因 详细的日志堆栈如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…...

物联网AI MicroPython学习之语法 实时时钟RTC

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; RTC 介绍 模块功能: 实时时钟RTC驱动模块 接口说明 RTC - 构建RTC对象 函数原型&#xff1a;RTC()参数说明&#xff1a; 无 返回值&#xff1a; 构建的RTC对象。 datetime - RTC时钟操作 函数原型&a…...

GEE:kNN(k-最近邻)分类教程(样本制作、特征添加、训练、精度、最优参数、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行kNN(k-最近邻)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征等),运行kNN(k-最近…...

【GitHub】保姆级使用教程

一、如何流畅访问GitHub 1、网易uu加速器 输入网址&#xff0c;无脑下载网易加速器&#xff1b;https://uu.163.com/ 下载安装完毕后&#xff0c;创建账号进行登录 登录后&#xff0c;在右上角搜索框中搜索“学术资源”&#xff0c;并点击&#xff1b; 稍等一会儿就会跳…...

【图表,饼图】【消费者选择餐厅关注因素】

...

Kotlin基础——Lambda和函数式编程

Lambda 使用 { } 定义Lamba&#xff0c;调用run运行 run { println(1) }更常用的为 { 参数 -> 操作 }&#xff0c;还可以存储到变量中&#xff0c;把变量作为普通函数对待 val sum { x: Int, y: Int -> x y } println(sum(1, 2))maxBy()接收一个Lambda&#xff0c;传…...

mysql忘记密码,然后重置

数据库版本8.0.26 只针对以下情况 mysql忘记了密码&#xff0c;但是你navicat之前连接上了 解决方法&#xff1a; 第一步&#xff0c;选中mysql这个数据库&#xff0c;点击新建查询 第二步&#xff1a;重置密码 alter user rootlocalhost IDENTIFIED BY 你的密码; 然后就可…...

linux centos系统命令安装

Zip unzip 命令安装下载 centos 命令常用常用下载 https://rpmfind.net/linux/rpm2html/search.php?queryzip%28x86-64%29&submitSearch…&system&arch 在线安装zip命令 Centos用yum安装的话用下面的命令安装 yum install -y unzip zipUbuntu的的系统可以用下…...

基于springboot实现高校食堂移动预约点餐系统【项目源码】计算机毕业设计

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…...

栈和队列OJ题目——C语言

目录 LeetCode 20、有效的括号 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 225、用队列实现栈 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 232、用栈…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...