SpringMVC基础知识学习笔记

Universe Infinity Inc.

目录

        • 一、学习SpringMVC主要是学什么
          • 1、SpringMVC的基本原理
          • 2、SpringMVC学习串联
        • 二、快速体验SpringMVC的开发
          • 1、新建项目,转成web项目
          • 2、引入依赖
          • 3、编写Spring的配置类
          • 4、配置web启动类,替代web.xml
          • 5、编写Handler(Controller)处理请求
          • 6、配置Tomcat,访问[localhost:8080/index](http://localhost:8080/index)
        • 三、SpringMVC接收数据
          • 1、param接收数据
          • 2、json接收数据
          • 3、路径传参
          • 4、请求头、请求体、cookies等内容
        • 四、SpringMVC响应数据
          • 1、返回json数据
          • 2、返回页面视图
          • 3、转发和重定向
          • 4、静态资源访问
        • 五、异常处理和拦截器
          • 1、异常处理配置
          • 2、SpringMVC拦截器

一、学习SpringMVC主要是学什么

在SpringMVC的学习中,我们首先要明确其核心内容是稳定的,而其他内容则需要在探索中逐渐掌握。对于那些不熟悉Spring的底层知识,你无需过于担心,可以先学会如何使用它,然后在你单独学习Spring的基础知识时再去深入理解其背后的原理。同样,如果你对Servlet的知识感到困惑,可能会让你对请求和响应的处理感到迷茫。此时,你不应停滞不前,去深入研究Servlet的知识,可以先学会如何使用SpringMVC,然后再去深入了解Servlet的相关知识。重要的是要明确,SpringMVC的知识点并不包含那些内容。我们在学习的过程中切忌偏离主题,不要因为关注一些细枝末节而忽略了真正重要的核心内容。

1、SpringMVC的基本原理

看懂下面这个图
在这里插入图片描述

2、SpringMVC学习串联

1、知道SpringMVC的基本原理。
DIspatcherServlet、HandlerMapping、HandlerAdapter、Handler、ViewResovler几个内容的含义及理解
DefaultServletHandler、HandlerInterceptor、ExceptionHandler等内容的理解
2、SpringMVC接入参数
param入参、json入参、路径传参、原生API获取、请求头和请求体获取
3、SpringMVC响应数据
返回json数据、返回页面视图、转发和重定向、静态资源的访问处理DefaultServletHandler
4、SpringMVC的HandlerInterceptor、ExceptionHandler配置

二、快速体验SpringMVC的开发

SpringMVC6、JDK17、Tomcat10+

1、新建项目,转成web项目

项目整体的架构
在这里插入图片描述

2、引入依赖
<dependencies><!-- springIoc相关依赖  --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.2</version></dependency><!-- springMVC相关依赖  --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.1.2</version></dependency><!-- web相关依赖  --><!--SpringMVC6中使用jakarta EEServlet,需要配置对应的依赖--><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-web-api</artifactId><version>10.0.0</version><scope>provided</scope> <!--这里打个疑问,为什么要配置成provide呢?--></dependency>
</dependencies>
3、编写Spring的配置类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/*** 全注解开发模式,配置Spring容器的信息*/
@Configuration
@ComponentScan("com.universe")
public class SpringConfig {
}
4、配置web启动类,替代web.xml
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/*** 全注解开发模式,替代web.xml* 通过继承AbstractAnnotationConfigDispatcherServletInitializer实现容器的初始化*/
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 指定service / mapper层的配置类*/@Overrideprotected Class<?>[] getRootConfigClasses() {System.out.println("getRootConfigClasses");return new Class[0];}/*** 指定Spring的配置类* @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {System.out.println("getServletConfigClasses");return new Class[]{SpringConfig.class}; //这里指定了Spring的配置类,将会在web启动时加载}/*** 设置dispatcherServlet的处理路径!* 一般情况下为 / 代表处理所有请求!*/@Overrideprotected String[] getServletMappings() {System.out.println("getServletMappings");return new String[]{"/"};}
}
5、编写Handler(Controller)处理请求
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {@RequestMapping("/index")@ResponseBodypublic String index(){return "Welcome to UII!";}
}
6、配置Tomcat,访问localhost:8080/index

在这里插入图片描述

三、SpringMVC接收数据
1、param接收数据

param传参形式,使用==@RequestParam==注解

  • param传参是什么形式,在url后加?形式
  • 单值传参、多值传参、同名值传参、实体类接收param、Map接收param
  • 创建实体类
@Data
public class Product {String id;String name;String price;
}
  • param传参的示例
@Controller
@ResponseBody
@RequestMapping("product")
public class ProductController {/*** 1、使用param传参形式测试* 1)使用注解@RequestParam表示param传参* 2)当URL传递的参数名和方法形参名相同时,会自动接收* 3)可以使用required表示是否必须,并使用defaultValue设置默认值* 4)特殊情况* a、一名多值情况* b、实体类接收* c、Map接收*///http://localhost:8080/product/update1?name=mobile@RequestMapping("update1")public String updateProduct1(@RequestParam("name") String name) {System.out.println(name);return name;}//http://localhost:8080/product/update2?name=mobile&price=200@RequestMapping("update2")public String updateProduct2(String name, String price) { //这种情况因配置问题会报错,暂且忽略System.out.println("name=" + name + ",price=" + price);return name + " " + price;}//http://localhost:8080/product/update3?name=mobile&price=200//通过required指定参数是否为必须,默认true必须。使用defaultValue指定默认值@RequestMapping("update3")public String updateProduct3(@RequestParam(value = "name") String productName,@RequestParam(value = "price", required = false, defaultValue = "0") String productPrice) {System.out.println("name=" + productName + ",price=" + productPrice);return productName + " " + productPrice;}//http://localhost:8080/product/update4a?name=mobile&name=computer//多个相同传参情况下,直接使用list接收@RequestMapping("update4a")public String updateProduct4a(@RequestParam("name") List<String> list) {System.out.println(list.toString());return list.toString(); //[mobile, computer]}//http://localhost:8080/product/update4b?name=mobile&price=999//通过实体类接收param,实体类的成员变量和param传参名相同,mvc会自动封装@RequestMapping("update4b")public String updateProduct4b(Product product) {System.out.println(product.toString());return product.toString(); //Product(id=null, name=mobile, price=999)}//http://localhost:8080/product/update4c?name=mobile&price=999//通过Map接收param,自动封装为map@RequestMapping("/update4c")public String updateProduct4c(@RequestParam Map<String, Object> map){for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {System.out.println(stringObjectEntry.getKey()+":"+stringObjectEntry.getValue());}return map.toString(); //{name=mobile, price=999}}
}
2、json接收数据

json传参形式,使用==@ResponseBody来接收数据,SpringMVC会自动封装json到实体类
json转实体类需要配置json转换器。使用
@EnablewebMvc添加json处理器,该注解同时也会添加HandlerMappingHandlerAdapter==处理器不用手工创建。

  • 知道如何配置json处理器,知道如何使用json传参
  • json传参封装到String
  • 简单json传参封装到实体类
  • 复杂json传参封装到实体类
  • json传参封装到Map中
  • 创建实体类
//用户
@Data
public class User {String name;int age;
}
//订单详情
@Data
public class OrderDetails {int id; //订单编号List<Product> productList; //订单的产品列表int date; //下单日期
}
  • JSON传参的示例
@Controller
@ResponseBody
@RequestMapping("user")
public class UserController {/*** 2、使用json传参* json传参需要先配置web的json转换器,先引入依赖*<dependency>*     <groupId>com.fasterxml.jackson.core</groupId>*     <artifactId>jackson-databind</artifactId>*     <version>2.15.0</version>* </dependency>* 在Spring配置类中加上注解@EnableWebMvc  //json数据处理,必须使用此注解,因为他会加入json处理器* 这里留一个问题:@EnableWebMvc的原理是什么呢?*//*** http://localhost:8080/user/data1* {"name": "tang","age":"22"}* 1) 输入的json直接转为String*/@RequestMapping("data1")public String updateUser1(@RequestBody String json) {System.out.println(json);return json;}/*** http://localhost:8080/user/data2* {"name": "tang","age":"22"}* 2) 将简单参数直接封装到实体类*/@RequestMapping("data2")public String updateUser2(@RequestBody User user) {System.out.println(user.toString());return user.toString(); //User(name=tang, age=22)}/*** http://localhost:8080/user/data3{"id":"001","productList":[{"id":"1","name":"apple","price":"999"},{"id":"2","name":"hw","price":"1999"},{"id":"3","name":"mobile","price":"9999"}],"date":"20240116"}* 3) 将复杂的参数封装到实体类*/@RequestMapping("data3")public String updateUser3(@RequestBody OrderDetails orderDetails) {System.out.println(orderDetails.toString());for (Product product : orderDetails.getProductList()) {System.out.println(product.toString());}return orderDetails.toString();//OrderDetails(id=1, productList=[Product(id=1, name=apple, price=999), Product(id=2, name=hw, price=1999), Product(id=3, name=mobile, price=9999)], date=20240116)}/*** http://localhost:8080/user/data4(1) {"name": "tang","age":"22"}(2) {"id":"001","productList":[{"id":"1","name":"apple","price":"999"},{"id":"2","name":"hw","price":"1999"},{"id":"3","name":"mobile","price":"9999"}],"date":"20240116"}* 4)使用map接收json数据*/@RequestMapping("data4")public String updateUser4(@RequestBody Map<String,Object> map){for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {System.out.println(stringObjectEntry.getKey()+":"+stringObjectEntry.getValue());}return map.toString(); //{name=tang, age=22}//{id=001, productList=[{id=1, name=apple, price=999}, {id=2, name=hw, price=1999}, {id=3, name=mobile, price=9999}], date=20240116}}
}
3、路径传参

路径传参的使用在后续的RestFul风格的开发中会经常用到
其主要的注解是==@PathVariable==

  • 知道路径传参的输入格式,后续怎么处理扥个
@Controller
@ResponseBody
@RequestMapping("order")
public class OrderDetailsController {/*** http://localhost:8080/order/1/20230116* 3、使用路径传参的形式* 路径传参主要在RestFul风格开发中用到* 使用@PathVariable注解表示* 简单的展示下*/@RequestMapping("/{id}/{date}")public String selectOrder(@PathVariable("id") String id,@PathVariable("date") String date){System.out.println(id+" "+date);return id+"_"+date;}
}
4、请求头、请求体、cookies等内容

SpringMVC也支持原生的API的使用,直接在Handler中参数中传
请求头使用==@RequestHeader==
请求体使用==@RequestBody==,这一点可以看到,json接收数据仅仅是接收请求体数据的一部分
接收Cookies可以使用==@CookieValue==

  • 请求头数据也可以获取到
  • 请求体数据可以是任何内容,json只是其中的一部分
  • 想要使用原生Servlet的话,直接在handler参数中声明即可
  • cookies可以使用特定注解获取,当然也有其它方式
@Controller
@ResponseBody
@RequestMapping("native")
public class NativeController {/*** 4、请求头,请求体,cookies等内容* 使用原生的Servlet API获取数据*///获取请求头:http://localhost:8080/native/header1//(1)获取请求头中的单个内容,@RequestHeader("accept")获取的是accept@RequestMapping("header1")public String getHerder1(@RequestHeader("accept") String header){System.out.println(header);return header; //text/html,application/xhtml+x...}//http://localhost:8080/native/header2//(2)获取全部请求头内容@RequestMapping("header2")public String getHerder2(@RequestHeader Map<String, Object> headers){System.out.println(headers.toString());return headers.toString();}//http://localhost:8080/native/body//使用postman,请求体可以是任何内容//(3)获取请求体,对应的json传参情况只是获取请求体过程中的一个例外@RequestMapping("body")public String getBody(@RequestBody String body){System.out.println(body);return body;}//http://localhost:8080/native/setcookies//(4)获取cookies,当然在获取cookies的时候需要先存放cookies@RequestMapping("setcookies")public String setCookies(HttpServletRequest req, HttpServletResponse resp){Cookie cookies1 = new Cookie("cookies1", "Universe_Infinity_inc.");resp.addCookie(cookies1);return "Ok!";}//http://localhost:8080/native/cookies1@RequestMapping("cookies1")public String getCookies1(@CookieValue(value = "cookies1",required = false,defaultValue = "") String cookies){System.out.println(cookies);return cookies; //Universe_Infinity_inc.}//http://localhost:8080/native/cookies2@RequestMapping("cookies2")public String getCookies2(@CookieValue Map<String,Object> map){ //这个请求会失败!System.out.println(map.toString());return map.toString();}
}

在这里插入图片描述

四、SpringMVC响应数据

在前后端分离的开发模式下,响应数据仅仅需要返回字符串,这时使用==@ResponseBody==直接返回字符串
在非前后端分离的开发模式下,响应数据需要返回具体的视图,这时需要对视图进行一系列的配置

  • 返回JSON数据情况,配置好
  • 创建实体类
@Data
public class User {String name;String age;
}@Controller
@RequestMapping("user")
public class UserController {
}
1、返回json数据

关键注解==@ResponseBody==

/*** http://localhost:8080/user/get* request:{"name":"tang","age":"22"}* 1、前后端分离的情况下,响应数据为json形式情况,使用@ResponseBody注解* 使用@EnableWebMvc注解,配置json处理器*/
@PostMapping("/get")
@ResponseBody
public User getUser(@RequestBody User user){System.out.println(user.toString());return user;
}
2、返回页面视图
  • 编写页面视图

    文件路径:/webapp/WEB-INF/view/page.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>Title</title>
    </head>
    <body><p>这是JSP生成的页面</p>${msg}
    </body>
    </html>
  • 配置页面处理

    @EnableWebMvc
    @Configuration
    @ComponentScan("com.response")
    public class SpringConfig implements WebMvcConfigurer {//配置jsp对应的视图解析器@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {//快速配置jsp模板语言对应的registry.jsp("/WEB-INF/view/", ".jsp");}
    }
    
  • 编写handler

    注意不要加==@ResponseBody注解,同样不能使用@RestController==注解

    /***http://localhost:8080/user/page?name=tang&age=22* 2、非全后端分离的情况下,返回页面视图。注意不要加@ResponseBody注解!!* 在容器中添加好视图解析器*     public void configureViewResolvers(ViewResolverRegistry registry) {*         //快速配置jsp模板语言对应的*         registry.jsp("/WEB-INF/view/", ".jsp");*     }* 直接返回的page会自动拼装为"/WEB-INF/view/page.jsp",同时也会对model中的数据解析*/
    @RequestMapping("page")
    public String getUserPage(User user,Model model){System.out.println(user.toString());model.addAttribute("msg",user.toString());return "page";
    }
    
  • 前台展示
    在这里插入图片描述

3、转发和重定向

什么是转发,什么是重定向呢?
转发和重定向在返回视图页面时使用。
转发直接在返回的字符串前加forward:
重定向直接在返回的字符串加redirect:

 /*** http://localhost:8080/user/forward?name=tang&age=22* 此请求返回的是:User(name=tang, age=22)* 3、使用forward进行转发,注意不要加@ResponseBody注解* 转发时服务器的操作,用户请求一次。全程只有一个HttpServletRequest对象,请求参数可以传递* 转发可以访问到WEB-INF下受保护的资源*/
@RequestMapping("forward") //转发
public String forward() {return "forward:/user/page";
}
/*** http://localhost:8080/user/redirect?name=tang&age=22* 此请求返回的是:User(name=null, age=null)* 4、使用redirect进行重定向,注意不要加@ResponseBody注解* 重定向是服务端告诉客户端去请求其它路径的操作,客户端至少请求两次。会产生多个请求对象,参数不可以传递* 重定向可以访问项目外的资源**/
@RequestMapping("redirect") //重定向
public String redirect() {return "redirect:/user/page";
}
4、静态资源访问
  • 添加静态资源处理器

    @EnableWebMvc
    @Configuration
    @ComponentScan("com.response")
    public class SpringConfig implements WebMvcConfigurer {//http://localhost:8080/image/lyf.jpg//请求在最初的时候会通过SpringMVC的机制转给RequestMapping查找对应的Handler,然而查不到静态资源,会直接报错//开启静态资源处理 <mvc:default-servlet-handler/>,添加DefaultServletHandler再解析@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
    }
    
  • 放个静态资源

    /webapp/image/lyf.jpg

    http://localhost:8080/image/lyf.jpg 直接访问就可以访问到了

五、异常处理和拦截器
1、异常处理配置
  • 异常处理内容
/*** SpringMVC异常处理机制的步骤:* 1、编写专门处理异常的类,标注注解@ControllerAdvice或@RestControllerAdvice。* 2、编写异常处理的方法,方法上标注@ExceptionHandler(异常.class)* 3、异常处理的方法中编写异常处理的逻辑等* 异常处理一般单独放在一个包内*/
@RestControllerAdvice //这个是@ControllerAdvice和@ResponseBody的整合形式
public class ExceptionHandlerConfig {//在其中编写异常处理的类//使用@ExceptionHandler来注解处理异常的类@ExceptionHandler(Exception.class)public String allExcetpion(Exception e){System.out.println(e.getMessage());return "serious mistake!";}@ExceptionHandler(NullPointerException.class)public String nullPointerExcetpionHandler(NullPointerException e){System.out.println(e.getMessage());return "null error!";}
}
  • 测试异常处理是否正常
@RestController
@RequestMapping("exception")
public class ExceptionController {//http://localhost:8080/exception/exce1@RequestMapping("exce1")public String exception1() {int i = 1 / 0;return "exception1";}//http://localhost:8080/exception/exce2@RequestMapping("exce2")public String exception2() {User user = null;user.toString();return "exception2";}
}
  • 无异常处理的时候
    在这里插入图片描述

  • 有异常处理机制
    在这里插入图片描述

2、SpringMVC拦截器

SpringMVC拦截器是MVC容器内部的处理器。其主要是与过滤器对比。
1、如何编写SpringMVC拦截器,实现HandlerInterceptor接口
2、HandlerInterceptor接口的三个方法的生效位置
3、拦截器的作用范围。addPathPatterns(),excludePathPatterns()的使用

  • 编写拦截器
/*** SpringMVC的拦截器编写步骤:* 1、编写自定义的拦截类,实现HandlerInterceptor接口* 2、HandlerInterceptor接口中有三个方法,用于请求拦截* 3、直接实现三个方法即可* 4、将拦截器加到配置类中*     //配置拦截器*     @Override*     public void addInterceptors(InterceptorRegistry registry) {*         registry.addInterceptor(new MyInterceptor());*     }* 5、拦截器可以配置拦截的路径,针对性拦截*/
public class MyInterceptor implements HandlerInterceptor {/*** preHandle在HandlerAdapter寻找Handler前执行* @param request 请求* @param response 响应* @param handler 方法* @return true放行 false拦截* @throws Exception 异常处理*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor.preHandle");System.out.println(handler.toString());return true;}/*** postHandler在Handler执行后执行,handler报错不执行* @param request 请求* @param response 响应* @param handler 方法* @param modelAndView 视图* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor.postHandle");}/*** afterCompletion在视图渲染(如果有)后执行* @param request 请求* @param response 响应* @param handler 方法* @param ex 异常* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor.afterCompletion");}
}
  • 注册拦截器
@EnableWebMvc
@Configuration
@ComponentScan("com.universe")
public class SpringConfig implements WebMvcConfigurer {//配置拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new RootInterceptor()).addPathPatterns("/rest/*"); //拦截特定的urlregistry.addInterceptor(new MyInterceptor());}
}

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

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

相关文章

第十二篇【传奇开心果系列】Ant Design Mobile of React开发移动应用:内置组件实现酷炫CSS 动画

Ant Design Mobile of React 开发移动应用示例博文系列 第一篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:从helloworld开始 第二篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:天气应用 第三篇【传奇开心果系列】Ant Design Mobile of Reac…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

MySQL 索引(上)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL-进阶篇 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

libpcap简明教程

文章目录 前言tcpdump的使用libpcap API的简单使用libpcap API的进阶使用 前言 因为之前简单写过wireshark入门指北&#xff0c;所以我知道基本的抓包流程。最近尝试调用libpcap的C API接口&#xff0c;顺道整理下。 本文实验如下&#xff1a; 使用tcpdump命令抓取目标地址为…

【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视&#xff08;Hikvision&#xff09;公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload&#xff0c;后端使用文件上传阿里云报错&#xff1a; 报错原因&#xff1a;前端image参数未传进去 解决方法&#xff1a;在el-upload添加属性 name"image" 文件传进去了&#xff01;

回溯法:0-1背包问题

问题描述 给定种物品和一背包。 物品的重量是&#xff0c; 其价值为&#xff0c;背包的容量为 c。 问应该如何选择装入背包中的物品&#xff0c;使得装入背包中物品的总价值最大&#xff1f;注意物品不重复! 实例&#xff1a;物品价值V{12, 11, 9, 8}, 物品重量W{8, 6, 4, 3},…

手写Vue3源码

Vue3核心源码 B站视频地址&#xff1a;https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式&#xff0c;只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块&#xff0c;…

Fog-Aware Adaptive YOLO for Object Detection in Adverse Weather

Abstract 提出了一种雾自适应YOLO算法。使用一种雾评估算法将图片分为有雾和无雾图片&#xff0c;随后将标准的YOLO应用于正常图片&#xff0c;自适应YOLO应用于有雾图片。 Method 目前的除雾方法去除雾霾时不考虑其雾度和发生频率。例如&#xff0c;图像自适应YOLO算法[6]试…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址&#xff08;含历史版本&#xff09;&#xff1a;https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1&#xff0c;安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料&#xff08;Qt C…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

Python——面向对象案列

1. class User(object):#重写__int__初始化方法&#xff0c;该方法用来初始化属&#xff0c;在构建方法的时候&#xff0c;这个方法会自动触发&#xff0c;用来初始化属性def __init__(self): #name “” 这是一个局部变量#self类似指针 this#self.name类的属性print("构…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

无刷电机学习-原理篇

一、无刷电机的优点 使用一项东西首先就要明白为什么要使用它&#xff0c;使用它有什么优点。与有刷电机相比无刷电机除了控制繁琐几乎全是优点。 1、应用范围广&#xff1a;家用电器&#xff08;冰箱空调压缩机、洗衣机、水泵等&#xff09;、汽车、航空航天、消费品工业自动…

4个值得使用的免费爬虫工具

在信息时代&#xff0c;数据的获取对于各行业都至关重要。而在数据采集的众多工具中&#xff0c;免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具&#xff0c;突出介绍其中之一——147采集软件&#xff0c;为您揭示这些工具的优势和应用&#xff0c;助您在数…

【c语言】扫雷(上)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…