Java29:Spring MVC

一:Springmvc簡介

1.簡介:

Spring Web MVC 是基于Servlet API構建的原始Web框架,從一開始就包含在Spring Framework中。正式名稱“Spring Web MVC” 來自其源模塊名稱(spring-webmvc)但它通常被稱為“Spring Mvc”

在控制層框架歷經 Strust ,WebWork,Strust2等諸多產品的歷代更迭之后,目前業界普遍選擇了Spring MVC 作為JavaEE 項目表述層開發的首先方案。

優勢:

》Spring 家族的原生產品,與IOC容器等基礎設施無縫對接

》表述層各細分領域需要解決的問題全方位覆蓋,提供全面解決方案

》代碼清新簡潔,大幅度提升開發效率

》 內部組件化程度高,可插拔式組件即插即用,想要什么功能配置相應組件即可

》性能卓著,尤其適合現代大型/超大型互聯網項目要求

2.作用:

3.核心組件:

1.DispatcherServlet:SpringMVC提供,我們需要使用web.xml配置使其生效,它式整個流程處理的核心,所有請求都經過它的處理和分發

2.HandlerMapping:SpringMVC提供,我們需要進行Ioc配置使其假如Ioc容器方可生效,它內部緩存handler和handler訪問路徑數據,被DispatcherServlet調用,用于查找路徑對應的handler!

3.HandlerAdapter:SpringMVC提供,我們需要進行Ioc配置使其假如Ioc容器方可生效,它可以

處理請求參數和處理響應數據,每次DispatcherServlet都是通過HandlerAdapter間接調用handler,它是handler和DispatcherServlet之間的適配器

4.Handler:handler又稱為處理器,它是Controller類內部方法的簡稱,是由我們自己定義,用來接收參數,向后調用業務,最終返回響應結果!

5.ViewResovler: SpringMVC提供,我們需要進行Ioc配置使其假如Ioc容器方可生效,視圖解析器主要作用簡化模板視圖頁面查找的,但是需要注意,前后端分離項目,后端只返回JSON數據,不返回界面,那就不需要視圖解析器,相對其他組件不是必須的。

二:快速入門程序

步驟1:創建項目并導入依賴:

<dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-web-api</artifactId><version>9.1.0</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.6</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.6</version>
</dependency>

步驟2:創建控制層處理器并添加注解

@Controllerpublic class HelloHandler {@RequestMapping("spring/hello")//配置訪問路徑@ResponseBody //返回前端字符串,不調用視圖解析器public String hello(){System.out.println("hello handler");return "hello springmvc";}
}

步驟3:創建配置類

@Configuration
@ComponentScan("com.cn.handler")
public class MyConfig {@Beanpublic  RequestMappingHandlerMapping  getRequestMapping(){RequestMappingHandlerMapping requestMappingHandlerMapping = new RequestMappingHandlerMapping();return requestMappingHandlerMapping;}@Beanpublic RequestMappingHandlerAdapter getRequestMappingHandlerAdapter(){RequestMappingHandlerAdapter requestMappingHandlerAdapter = new RequestMappingHandlerAdapter();return requestMappingHandlerAdapter;}}

步驟4:加載配置類并初始化容器

package com.cn.config;import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.server.adapter.AbstractReactiveWebInitializer;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}//指定配置類@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MyConfig.class};}//設置DispatcherServlet的處理路徑,一般情況下 /代表處理所有請求@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

步驟5:工程設置為web工程,并部署到tomcat(10.0以上版本)

1. 工程右鍵-選擇JBLJavaToWeb 把工程設置為web工程

2.把工程部署到tomcat,并重啟服務

3.瀏覽器地址輸入:http://localhost:8080/spring/hello

4.瀏覽器顯示:hello springmvc 表示程序運行成功

三:Spring MVC接收數據

1.訪問路徑設置:

@RequestMapping注解的作用就是將請求的URL地址和處理請求的方式(handler 方法)關聯起來,建立映射關系。

SpringMVC接收到指定的請求,就會來找到在映射關系中對應的方法來處理這個請求。@RequestMapping(不用必須使用/開頭) user/login??

1.精準地址【1個|多個】/user/login? ? {"地址1","地址2"}

2.支持模糊 * 任意一層字符串| **任意層任意字符串

? ?/user/* ->? /user/a? user/aaaa 可以, /user/a/b 不行

?/user/** ->? /user/a? ?/user/a/a/a/a

3.類上和方法上添加@RequestMapping的區別

? 類上提取通用的訪問地址

? 方法上時具體的handler地址

訪問: 類地址+方法地址即可

4.請求方式指定

?客戶端-> http(get|post|put|delete)->ds->handler

默認情況:@RequestMapping("login")主要地址正確,任何請求方式都可以訪問

指定請求方式:method={RequestMethod.GET,RequestMethod.POST}

不符合請求方式:會出現405異常!

5注解進階:

get @GetMapping ==@RequestMapping(xxx,method=GET);

post@PostMapping ==@RequestMapping(xxx,method=POST);

put@PUTMapping ==@RequestMapping(xxx,method=PUT);

delete@DeleteMapping ==@RequestMapping(xxx,method=DELETE);

2.參數接收:

2.1 param和json參數比較

在http請求中,我們可以選擇不同的參數類型,如 param 類型和JSon類型。下面對這兩種參數類型進行區別和對比:

1.參數編碼:

?param 類型的參數被編碼為ASCII碼。JSON類型會被編碼為UTF-8

2.參數順序:

param類型的參數沒有順序限制。但是,JSON類型的參數是有序的。JSON采用鍵值對的形式進行傳遞,其中鍵值對是有序排列的

3.數據類型:

param類型的參數僅支持字符串類型,數值類型和布爾類型等簡單數據類型。而JSON類型的參數則支持更復雜的數據類型,如數組,對象等。

4.嵌套性:

param類型的參數不支持嵌套。但是,JSON類型的參數支持嵌套,可以傳遞更為復雜的數據結構。

5.可讀性:

param 類型的參數格式比JSON類型的參數更加簡單,易讀。但是JSON格式在傳遞嵌套數據結構時更加清晰易懂。

總的來說,param類型的參數適用于單一的數據傳遞,而JSON類型的參數則更適用于更復雜的數據結構傳遞。根據具體的業務需求,需要選擇合適的參數類型。在實際開發中,常見的做法是:在GET請求中采用param類型的參數,而在POST請求中采用JSON類型的參數傳遞。

2.2 param接收參數:
@Controller
@RequestMapping("user")
public class MyHandler {/** 1 直接接收* /user/login?name=root&age=18* 形參列表,填寫對應名稱的參數即可!請求參數名=形參參數名即可!* 1)名稱相同* 2)可以不傳遞,不報錯** */@RequestMapping("/login")@ResponseBodypublic String login(String name,int age){System.out.println("name = " + name + ", age = " + age);return "name = " + name + ", age = " + age;}/** 2 注解指定* 指定任意的請求參數名,要求必須傳遞  ,要求不必須傳遞,給一個默認值* /user/login?account=root&age=18* account必須傳遞 ,page可以必須傳遞,如果不傳遞默認值就是1@RequestParam-> 形參列表 指定請求參數名 或者是否必須傳遞,或者非必須傳遞設置默認值用法:@RequestParam(value="指定請求參數名,如果形參名和請求參數名一致,可以省略!",required=false 前端是否必須傳遞此參數,默認是必須,不傳400異常!,* defaultValue="1" 當非必須傳遞false,可以設置默認值)** */@RequestMapping("/login2")@ResponseBodypublic String login2(@RequestParam("account")String name, @RequestParam(required = false,defaultValue = "10") int age){System.out.println("name = " + name + ", age = " + age);return "name = " + name + ", age = " + age;}/** 3 特殊值* /user/login3?hbs=吃&hbs=喝* 不加注解@RequestParam 將hbs對應的一個字符串直接賦值給集合! 類型異常!* 加了注解,會將集合加入對應的字符串* */@RequestMapping("/login3")@ResponseBodypublic String login3(@RequestParam  List<String> hbs){System.out.println(hbs);return hbs.toString();}/** 4 使用實體對象接值* /user/login4?name=tom&age=10  準備一個對應屬性和get|set 方法的實體類即可,* 形參列表聲明對象參數即可!* */@RequestMapping("/login4")@ResponseBodypublic String login3(User user){System.out.println("name = " + user.getName() + ", age = " + user.getAge());return "name = " + user.getName() + ", age = " + user.getAge();}}
2.3?路徑傳參:
@Controller
@RequestMapping("path")
@ResponseBody
public class PathHandler {// path/用戶名/密碼//動態路徑設計{key}//必須使用 注解@PathVariable@RequestMapping("{name}/{password}")public String  hello(@PathVariable String name , @PathVariable String password){System.out.println("name = " + name + ", password = " + password);return "name = " + name + ", password = " + password;}
}
2.4 JSON數據接收(重點):

前端傳遞JSON數據時,SpringMVC 框架可以使用@RequestBody 注解 來將JSON

數據轉換為Java對象,@RequestBody 注解表示當前方法參數的值應該從請求體中獲取,并且需要指定value 屬性來指示請求體應該映射到哪個參數上,其使用方式和示類代碼如下:

步驟1 .前端發送JSON數據(使用postman)

{"name":"zhangsan","age":18,"gender":"男"}

步驟2.定義一個用于接收JSON數據的Java 類

@Data
public class Person {private String name;private int age;private String gender;
}

步驟3.在控制器中使用@RequestBody注解來接收JSON數據,并將器轉換為Java對象:

@Controller
@RequestMapping("json")
@ResponseBody
public class JsonHandler {@PostMapping("data")
    public String data(@RequestBody Person person){System.out.println("person = " + person);return person.toString();}}

步驟4:添加JSON解析依賴:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>

步驟5:在配置類添加注解:@EnableWebMvc,給SpringMVC HandlerAdpater配置JSON轉換器

@EnableWebMvc
@Configuration
@ComponentScan("com.cn.json")
public class MyConfig {}

步驟6:測試并查看響應數據:

Person(name=zhangsan,?age=18,?gender=nan)

2.5?cookie和Header接收:

1.使用@CookieValue 注解獲取cookie數據

存取cookie

@GetMapping("save")
public String save(HttpServletResponse httpResponse){Cookie  cookie = new Cookie("cookieName","cookieValue");httpResponse.addCookie(cookie);return "ok";
}

獲取cookie

 @RequestMapping("data")
public String data(@CookieValue(name="cookieName") String value){System.out.println("value = " + value);return value;
}

2.使用注解@RequestHeader 獲取header信息

@Controller
@ResponseBody
@RequestMapping("header")
public class HeaderController {@GetMapping("data")public String  data(@RequestHeader(value = "Host") String host){System.out.println("host = " + host);return host;}}
2.6?接收數據總結:

四:Spring MVC響應數據

1.開發模式介紹:

在Web開發中,有兩種主要的開發模式:前后端分離和混合開發

前后端分離模式(重點)

指將前端的界面和后端的業務邏輯通過接口分離開發的一種方式。開發人員使用不同的

技術和框架,前端開發人員主要負責界面的呈現和用戶交互,后端開發人員主要

負責業務邏輯和數據存儲。前后端通信通過API接口完成,數據格式一般使用JSON

或XML。前后端分離模式可以提高開發效率,同時也有助于代碼重用和維護。

混合開發模式:

指將前端和后端的代碼集成在同一個項目中,共享相同的技術棧和框架。這種模式在

小型項目中比較常見,可以減少學習成本和部署難度。但是,在大型項目中,這種模式

會導致代碼耦合性很高,維護和升級難度較大。

2.快速返回邏輯視圖:

1.創建項目并添加依賴:

<dependency><groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api</artifactId><version>3.0.0</version>
</dependency>

2. 在WEB-INF下創建視圖目錄和jsp文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><font color="red">${data}</font>
</body>
</html>

3. 在配置類下配置視圖解析器

@Configuration
@ComponentScan("com.cn.controller")
@EnableWebMvc
public class Myconfig  implements WebMvcConfigurer {
// 視圖解析器,指定前后綴
public  void configureViewResolvers(ViewResolverRegistry registry) {registry.jsp("/WEB-INF/views/",".jsp");}}

4.創建handler

@Controller
@RequestMapping("jsp")
public class JspHandler {/** 快速查找視圖方法* 1.方法的返回值是字符串類型* 2.不能添加ResponseBody,直接返回字符串給瀏覽器,不找視圖,不走視圖解析器* 3.返回值 對應中間的視圖名稱即可* */@GetMapping("index")public String  data(HttpServletRequest request){request.setAttribute("data","hello jsp!");return "index";}
}

5.創建初始化接口

import com.cn.config.Myconfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class SpringMvcInit  extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{Myconfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

6.轉換為web項目部署到服務器 并測試:

瀏覽器輸入:http://localhost:8080/jsp/index

3.轉發重定向:

@Controller
@RequestMapping("jsp")
public class JspHandler {/** 快速查找視圖方法* 1.方法的返回值是字符串類型* 2.不能添加ResponseBody,直接返回字符串給瀏覽器,不找視圖,不走視圖解析器* 3.返回值 對應中間的視圖名稱即可*** */@GetMapping("index")public String  data(HttpServletRequest request){request.setAttribute("data","hello jsp!");return "index";}/** 轉發:只能是項目下的資源* 1.方法的返回值寫成字符串* 2.不能添加ResponseBody注解* 3.返回的字符串前 forward:+/轉發地址** */@GetMapping("forward")public String forward(){System.out.println("jsp forward");return "forward:/jsp/index";}/** 重定向:即可以是項目下的資源,也可以是項目外的資源* 1.方法的返回值寫成字符串* 2.不能添加ResponseBody注解* 3.返回的字符串前 redirect:+/轉發地址** */@GetMapping("redirect")public String redirect(){System.out.println("jsp redirect");return "redirect:/jsp/index";}@GetMapping("redirect/baidu")public String redirectbaidu(){System.out.println("jsp redirect");return "redirect:http://www.baidu.com";}}

4.返回JSON數據(重點):

步驟1:新建項目并導入依賴:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>

步驟2:創建配置類

@Configuration
@ComponentScan("com.cn.handler")
@EnableWebMvc
public class MyConfig {
}

步驟3:創建SpringMvc初始化類

package com.cn.init;import com.cn.config.MyConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class SpringMvcInit  extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MyConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

步驟4:創建 返回的json對應的實體類

import lombok.Data;@Data
public class User {private String name;private String gender;private int age;
}

步驟5:創建Handler

@Controller
@RequestMapping("json")
@ResponseBody//返回json的注解,不找視圖
public class JsonHandler {//返回單個實體類的json數據@GetMapping("data")public User data(){User user =new User();user.setName("zhangsan");user.setAge(18);user.setGender("man");return  user;}//返回集合對應的json數據@GetMapping("data2")public List<User> data2(){List<User> list =new ArrayList<>();User user1 =new User();user1.setName("zhangsan");user1.setAge(18);user1.setGender("man");User user2 =new User();user2.setName("lisi");user2.setAge(20);user2.setGender("woman");list.add(user1);list.add(user2);return  list;}
}

步驟6:部署并測試:

瀏覽器輸入地址:http://localhost:8080/json/data

返回結果:

{"name":"zhangsan","gender":"man","age":18}

瀏覽器輸入地址:http://localhost:8080/json/data2

[{"name":"zhangsan","gender":"man","age":18},{"name":"lisi","gender":"woman","age":20}]

5.訪問靜態資源:

在配置類中重寫方法,開啟靜態資源查找

@Configuration
@ComponentScan("com.cn.handler")
@EnableWebMvc
public class MyConfig  implements WebMvcConfigurer {/*開啟靜態資源查找dispatcherServlet->handlerMapping 找有沒有對應的handler->沒有,找有沒有靜態資源* */@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}
}

五:其他擴展功能

1.restful 介紹和理解:

1)簡介:

2)設計規范:

3)實戰

1.需求

2.設計

3.實現:

package com.cn.controller;import com.cn.pojo.User;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("user")
public class UserController {//分頁查詢@GetMappingpublic List<User> page(@RequestParam(required = false,defaultValue = "1") int page ,@RequestParam(required = false,defaultValue = "10") int size){return null;}//用戶添加
@PostMappingpublic User save(@RequestBody  User user){return user;}//用戶詳情@GetMapping("{id}")public User  detail(@PathVariable int id){return null;}//用戶更新@PutMapping()public User update(@RequestBody User user){return user;}//用戶刪除
@DeleteMapping("{id}")public int delete(@PathVariable  int id){return 0;
}//用戶模糊
public  List<User> search(String keyword,@RequestParam(required = false,defaultValue = "1") int page,@RequestParam(required = false,defaultValue = "10") int size){return null;}
}

2.全局處理異常:

1.異常處理的方式:

2全局異常處理步驟:

步驟1:聲明全局異常處理類并添加注解@RestControllerAdvice

步驟2:在該類中通過添加注解@ExceptionHandler(指定異常.class) 聲明handler方法,處理異常

步驟3:在配置類中掃描類中把該包加進去

3.實戰:

1)產生異常的handler

@RestController
@RequestMapping("user")
public class UserHandler {@GetMapping("data")public String data(){String s1=null;int length = s1.length();//java.lang.NullPointerExceptionreturn "ok";}@GetMapping("data1")public String data1(){int i= 10/0;//   java.lang.ArithmeticException: / by zeroreturn "ok2";}}

2)全局處理異常的類

package com.cn.excption;import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@RestControllerAdvice
public class GlobelExceptionHandler {
// 發生異常->ControllerAdvice 注解的類型-》  @ExceptionHandler(指定異常類型)-》handler@ExceptionHandler(NullPointerException.class)public  Object  PowerPointHandler(NullPointerException e){String message = e.getMessage();return message;}@ExceptionHandler(Exception.class)public  Object OtherHandler(Exception e){String message = e.getMessage();return message;}
}

3)把異常處理類添加到配置類掃描中,初始化類省略(SpringMvcInit)

@Configuration
@ComponentScan({"com.cn.handler","com.cn.excption"})
@EnableWebMvc
public class Myconfig {
}

3.攔截器:

1.攔截器和過濾器區別:

2.攔截器使用:

步驟1:創建攔截器:

public class MyInterceptor  implements HandlerInterceptor {@Override//在處理請求的目標handler方法前執行//一般用于編碼格式設置,登錄保護,權限處理public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle------------------");//返回true 放行,返回false:不放行return true;}@Override//在目標handler方法之后,handler報錯不執行!//此方法只有在preHandle返回true后才執行, 對結果處理,敏感詞匯檢查   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle------------------");}@Override//渲染視圖之后執行,一定執行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion------------------");}
}

步驟2:在配置類中開啟攔截器,并設置攔截路徑

@Configuration
@ComponentScan("com.cn.handler")
@EnableWebMvc
public class MyConfig implements WebMvcConfigurer {@Override//開啟攔截器public void addInterceptors(InterceptorRegistry registry) {//攔截所有// registry.addInterceptor(new MyInterceptor());//攔截指定地址registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/data1");}
}

4.參數校驗注解jsr303:

1.校驗概述:

jsr303 是java為Bean數據合法性校驗提供的標準框架,他已經包含在JAVAEE6.0標準中,jsr303通過在Bean屬性上標注類似于@NotNull,@Max等標準的注解指定校驗規則,并通過標準的接口對Bean進行驗證。

2.校驗實現:

步驟1:導入jar包

    <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator-annotation-processor</artifactId><version>8.0.0.Final</version></dependency>
</dependencies>

步驟2:在實體類添加校驗注解

@Data
public class User {/*1.name 不為null和空字符串字符串@NotBlank 集合@NotEmpty 包裝類@NotNull2.password長度大于63.age必須》=14.email 郵件格式的字符串5.birthday過去實際*** */@NotBlankprivate String name;@Length(min = 6)private String password;@Min(1)private int age;@Emailprivate String email;@Pastprivate Date birthday;
}

步驟3:handler 添加注解@Validated,如果自定義返回異常,添加BindingResult,獲取錯誤信息

@RestController
@RequestMapping("user")
public class RegisterHandler {/** 步驟1:實體類添加校驗注解* 步驟2:handler(@Validated 實體類 對象)* 細節:param|json校驗都有效果*      json參數-@RequestBody* 如果不符合校驗規則,直接向前端拋出異常* 接收綁定錯誤信息,自定義返回結果,約定參數錯誤-》{code:400}** 捕捉綁定信息* 1.handler(校驗對象,BindingResult result)要求:BindingResult必須緊挨著校驗對象* 2.BindingResult獲取綁定錯誤** */@PostMapping("register")public Object  register(@Validated @RequestBody User user){// 自定義返回異常代碼       
//    public Object  register(@Validated @RequestBody User user, BindingResult result){
//        if(result.hasErrors()){
//            Map map = new HashMap();
//            map.put("code",400);
//            map.put("msg","參數校驗異常");
//            return map;
//
//        }return user;}
}

步驟4:測試

1)正常情況:

2)自定義異常:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77493.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VLC搭建本機的rtsp直播推流和拉流

媒體---流---捕獲設備&#xff0c;選擇攝像頭&#xff0c;點擊串流 x下一步 選擇rtsp&#xff0c;點擊添加 看到了端口&#xff0c;并設置路徑&#xff1a; 選擇Video -H 264 mp3(TS) 點擊下一個&#xff0c; 點擊流&#xff0c;就開始推流了 拉流&#xff0c;觀看端&#x…

云點數據讀寫

一、常見點云數據格式 LAS/LAZ格式 LAS是點云數據的行業標準格式 LAZ是LAS的壓縮版本 支持地理參考信息、顏色、強度等屬性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)開發的格式 支持ASCII和二進制存儲 包含頭部信息和數據部分 PLY格式(Polygon File Format…

[RHEL8] 指定rpm軟件包的更高版本模塊流

背景&#xff1a;掛載RHEL ISO使用kickstart安裝操作系統&#xff0c;安裝包未指定安裝perl&#xff0c;但是安裝完可以查到其版本&#xff0c;且安裝的是ISO中多個版本中的最低版本。 原因&#xff1a;&#xff08;1&#xff09;為什么沒有裝perl&#xff0c;perl -v可以看到版…

Spring 事務管理核心機制與傳播行為應用

Spring 事務詳解 一、Spring 事務簡介 Spring 事務管理基于 AOP&#xff08;面向切面編程&#xff09;實現&#xff0c;通過 聲明式事務&#xff08;注解或 XML 配置&#xff09;統一管理數據庫操作&#xff0c;確保數據一致性。核心目標&#xff1a;保證多個數據庫操作的原子…

JavaScript解密實戰指南:從基礎到進階技巧

JavaScript加密技術廣泛應用于數據保護、反爬蟲和代碼混淆&#xff0c;但掌握解密方法能幫助開發者突破技術壁壘。本文結合爬蟲實戰與安全分析場景&#xff0c;系統梳理JS解密的核心方法與工具。 一、基礎解密方法 1. Base64解碼 適用于簡單編碼場景&#xff0c;如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片&#xff08;SoC&#xff09;與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板&#xff0c;最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄羅斯方塊-簡單開發版

一、需求分析 實現了一個經典的俄羅斯方塊小游戲&#xff0c;主要滿足以下需求&#xff1a; 1.圖形界面 使用 pygame 庫創建一個可視化的游戲窗口&#xff0c;展示游戲的各種元素&#xff0c;如游戲區域、方塊、分數等信息。 2.游戲邏輯 實現方塊的生成、移動、旋轉、下落和鎖…

使用安全繼電器的急停電路設計

使用安全繼電器的急停電路設計 一&#xff0c;急停回路的設計1&#xff0c;如何將急停接到線路當中&#xff1f;2&#xff0c;急停開關 如何接到安全繼電器中 一&#xff0c;急停回路的設計 急停是每一個設備必不可少的部分&#xff0c;因為關乎安全&#xff0c;所以說所以說他…

【讀書筆記·VLSI電路設計方法解密】問題64:什么是芯片的功耗分析

低功耗設計是一種針對VLSI芯片功耗持續攀升問題的設計策略。隨著工藝尺寸微縮&#xff0c;單顆芯片可集成更多元件&#xff0c;導致功耗相應增長。更嚴峻的是&#xff0c;現代芯片工作頻率較二十年前大幅提升&#xff0c;而功耗與頻率呈正比關系。因此&#xff0c;芯片功耗突破…

在 Debian 10.x 安裝和配置 Samba

1. 更新系統 sudo apt update sudo apt upgrade -y2. 安裝 Samba sudo apt install samba -y3. 配置 Samba 備份默認配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak編輯配置文件 sudo nano /etc/samba/smb.conf示例配置&#xff08;共享目錄&#xff09; …

修改PointLIO項目

添加key_frame_info.msg消息 新建.msg文件&#xff0c;內容填寫為&#xff1a; # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…

關于隔離1

1.隔離的目的&#xff1a; 在隔離電源設計中&#xff0c;輸入與輸出之間沒有直接電氣連接&#xff0c;提供絕緣高阻態&#xff0c;防止電流回路。這意味著輸入與輸出之間呈現為絕緣的高阻態&#xff0c;從而確保了無電流回路的形成。 隔離與可靠保護有關。電隔離是一種電路設…

【java實現+4種變體完整例子】排序算法中【插入排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是插入排序的詳細解析&#xff0c;包含基礎實現、常見變體的完整代碼示例&#xff0c;以及各變體的對比表格&#xff1a; 一、插入排序基礎實現 原理 將元素逐個插入到已排序序列的合適位置&#xff0c;逐步構建有序序列。 代碼示例 public class InsertionSort {void…

清醒思考的藝術

成為穿越暴風雨后的幸存者 系統性錯誤是指系統性的偏離理性&#xff0c;偏離最理想的、合乎邏輯的、理智的思考和行為。 “系統”一詞很重要&#xff0c;因為我們經常錯誤地走向同一方向。 幸存偏誤 幸存偏誤會扭曲概率&#xff0c;系統性的高估了成功概率。一旦混淆選擇標準和…

DSA數據結構與算法 6

查找技術&#xff08;Searching Techniques&#xff09; 查找簡介 在計算機科學中&#xff0c;“查找”指的是在某個集合或序列中尋找特定元素的過程。這個過程可以是成功的&#xff0c;也可以是失敗的&#xff1a; 若目標元素存在于集合中&#xff0c;我們稱之為“查找成功”…

FastAPI:現代高性能Python Web框架的技術解析與實踐指南

一、FastAPI的誕生背景與技術定位 在數字化轉型的浪潮中,API(應用程序接口)作為連接服務與數據的核心樞紐,其性能與開發效率直接影響業務迭代速度。傳統Python框架如Django和Flask雖功能豐富,但在高并發場景下面臨性能瓶頸,且缺乏對異步編程的原生支持。FastAPI應運而生…

VuePress 使用教程:從入門到精通

VuePress 使用教程&#xff1a;從入門到精通 VuePress 是一個以 Vue 驅動的靜態網站生成器&#xff0c;它為技術文檔和技術博客的編寫提供了優雅而高效的解決方案。無論你是個人開發者、團隊負責人還是開源項目維護者&#xff0c;VuePress 都能幫助你輕松地創建和管理你的文檔…

1.Vue自動化工具安裝(Vue-cli)

目錄 1.node.js 安裝&#xff1a; 2 npm 安裝 3 安裝Vue-cli 4總結&#xff1a; 一般情況下&#xff0c;單文件組件&#xff0c;我們運行在 自動化工具vue-CLI中&#xff0c;可以幫我們編譯單文件組件。所以我們在學習時一般需要在系統中先搭建vue-CLI工具 下面就是一些我…

IP數據報

IP數據報組成 IP數據報&#xff08;IP Datagram&#xff09;是網絡中傳輸數據的基本單位。 IP數據報頭部 版本&#xff08;Version&#xff09; 4bit 告訴我們使用的是哪種IP協議。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 頭部長度&#xff08;IHL&#xff0c;Intern…

Leetcode 2158. 每天繪制新區域的數量【Plus題】

1.題目基本信息 1.1.題目描述 有一幅細長的畫&#xff0c;可以用數軸來表示。 給你一個長度為 n 、下標從 0 開始的二維整數數組 paint &#xff0c;其中 paint[i] [starti, endi] 表示在第 i 天你需要繪制 starti 和 endi 之間的區域。 多次繪制同一區域會導致不均勻&…