【SpringMVC】SSM框架【二】——SpringMVC超詳細

SpringMVC

學習目標:在這里插入圖片描述

1.SpringMVC簡介

1)web訪問流程

在這里插入圖片描述

  • 1.web服務器通過瀏覽器訪問頁面
  • 2.前端頁面使用異步提交的方式發送請求到后端服務器
  • 3.后端服務器采用:表現層—業務層—數據層的架構進行開發
  • 4.頁面請求由表現層進行接收,獲取用戶的請求后將參數傳遞到業務層,再由業務層訪問數據層獲取數據庫中的數據,返回給表現層
  • 5.得到用戶需要訪問的數據之后,表現層通過JSON的格式發送數據到前端頁面
  • 6.前端頁面得到數據之后,解析數據并組織對應的頁面渲染到瀏覽器展示給用戶

2)SpringMVC概述

  • 是一種基于Java實現的MVC模型的輕量級web框架(表現層框架技術,主要用于表現層開發)
  • 優點:
    • 使用簡單,開發便捷
    • 靈活性強

2.SpringMVC入門案例

1)案例實施

  • 1.導入SpringMVCServlet的坐標
    <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies>

配置tomcat插件:

    <build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins></build>
  • 2.創建SpringMVC控制器類:
@Controller
public class controller {@RequestMapping("/print")@ResponseBodypublic String print() {System.out.println("user print ...");return "{user: name}";}
}
  • 3.初始化SpringMVC環境,設定SpringMVC加載對應的bean:
    SpringMVCConfig:
@Configuration
@ComponentScan("com.springmvclearn.controller")
public class SpringMvcConfig {
}
  • 4.初始化Servelet容器,加載SpringMVC環境,并設置SpringMVC技術處理的請求:
    SpringMvcContainersInitConfig:
public class ServeletContainersInitConfig extends AbstractDispatcherServletInitializer {//加載SpringMVC容器配置@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class);return context;}//設置哪些請求歸屬springMVC處理@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}

在這里插入圖片描述

涉及的注解介紹

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2)入門案例工作流程

在這里插入圖片描述

3)不同層次結構Bean的加載控制

  • 在開發中,Spring一般加載業務層和數據層的bean,SpringMVC一般加載表現層的bean,而入門案例中配置時,Spring加載時會直接掃描整個包下的bean,包括表現層的bean
  • 為了避免Spring錯誤的加載到SpringMVC的bean:我們需要在Spring加載bean時,排除掉SpringMVC的bean
  • 1.方式一:Spring加載的bean設定掃描范圍為com.itheima,排除掉controller包內的bean(SpringBoot中會使用這種方式進行bean的細粒度控制
@Configuration
@ComponentScan(value = "com.springmvclearn", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}
  • 2.方式二:Spring加載的bean設定掃描范圍為精確的包:比如直接對應service包,dao包等。
@Configuration
@ComponentScan({"com.springmvclearn.service", "com.springmvclearn.dao"})
public class SpringConfig {
}

在這里插入圖片描述

4)簡化開發的書寫格式

5)PostMan

  • 網頁調試與發送網頁http請求的Chrome插件

  • 常用于進行接口測試

  • 在workspaces中可以云備份歷史請求操作

  • 創建請求:
    在這里插入圖片描述

  • 保持請求,并放入到一個集合中,方便分類復用:
    在這里插入圖片描述

3.請求與響應

1.請求映射路徑

  • 當相同層級下的controller有相同的路徑時(/save),在訪問時就會有路徑沖突問題

  • 一般解決就是在不同controller的路徑前加入不同模塊的請求路徑前綴: /user/save/book/save

  • 通過RequestMapping在控制類上統一設置當前控制類下的方法請求路徑前綴,然后在每個控制器方法上再加每個控制方法對應的請求訪問路徑
    在這里插入圖片描述

2.請求參數

1)普通參數請求
//請求參數
@Controller
public class UserController {//普通參數:請求參數與形參名稱對應即可完成參數傳遞@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name ,int age){System.out.println("普通參數傳遞 name ==> "+name);System.out.println("普通參數傳遞 age ==> "+age);return "{'module':'common param'}";}//普通參數:請求參數名與形參名不同時,使用@RequestParam注解關聯請求參數名稱與形參名稱之間的關系@RequestMapping("/commonParamDifferentName")@ResponseBodypublic String commonParamDifferentName(@RequestParam("name") String userName , int age){System.out.println("普通參數傳遞 userName ==> "+userName);System.out.println("普通參數傳遞 age ==> "+age);return "{'module':'common param different name'}";}
}
  • 1.GET 請求:
    在這里插入圖片描述
  • 2.POST請求:
    在這里插入圖片描述
  • 3.POST中文參數亂碼問題
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}//亂碼處理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}

在這里插入圖片描述

2)POJO參數傳遞
  • 當大量參數需要傳遞時,一般將參數封裝成一個實體類,在參數傳遞時,直接將參數賦值給實體類對象,然后從實體類對象中拿取對應參數值

User:

package com.itheima.domain;public class User {private String name;private int age;@Overridepublic 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;}
}

在controller中:

//請求參數
@Controller
public class UserController {//POJO參數:請求參數與形參對象中的屬性對應即可完成參數傳遞@RequestMapping("/pojoParam")@ResponseBodypublic String pojoParam(User user){System.out.println("pojo參數傳遞 user ==> "+user);System.out.println("userName ==> "+user.getName());System.out.println("userAge ==> "+user.getAge());return "{'module':'pojo param'}";}
}

在這里插入圖片描述
在這里插入圖片描述

3)嵌套POJO參數傳遞
  • 當POJO中還有引用的POJO時,如何傳遞參數
  • 也就是在POJO中將該POJO注入,并給出setter和getter方法:

user:

package com.itheima.domain;public class User {private String name;private int age;private Address address;@Overridepublic 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中同樣接收POJO對象即可:

//請求參數
@Controller
public class UserController {//嵌套POJO參數:嵌套屬性按照層次結構設定名稱即可完成參數傳遞@RequestMapping("/pojoContainPojoParam")@ResponseBodypublic String pojoContainPojoParam(User user){System.out.println("pojo嵌套pojo參數傳遞 user ==> "+user);System.out.println("userName ==> "+user.getName());System.out.println("userAge ==> "+user.getAge());System.out.println("userAddress ==> "+user.getAddress());return "{'module':'pojo contain pojo param'}";}
}

在這里插入圖片描述

在這里插入圖片描述

4)數組參數傳遞
  • 需要傳入一個數組類型的參數時:
//請求參數
@Controller
public class UserController {//數組參數:同名請求參數可以直接映射到對應名稱的形參數組對象中@RequestMapping("/arrayParam")@ResponseBodypublic String arrayParam(String[] hobby){System.out.println("數組參數傳遞 hobby ==> "+ Arrays.toString(hobby));return "{'module':'array param'}";}
}

在這里插入圖片描述

在這里插入圖片描述

5)集合類型參數
  • 需要集合類型參數時:我們需要設置該集合參數為RequestParam,否則無法識別需要傳遞的是集合
//請求參數
@Controller
public class UserController {//集合參數:同名請求參數可以使用@RequestParam注解映射到對應名稱的集合對象中作為數據@RequestMapping("/listParam")@ResponseBodypublic String listParam(@RequestParam List<String> likes){System.out.println("集合參數傳遞 likes ==> "+ likes);return "{'module':'list param'}";}
}

請求則同上,結果也是一樣的。

在這里插入圖片描述

3.JSON格式參數傳遞

  • 首先要加入解析JSON的坐標:
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
1)JSON格式的集合參數
  • 1.開啟支持集合JSON格式的數據類型自動轉換:
@Configuration
@ComponentScan("com.itheima.controller")
//開啟json數據類型自動轉換
@EnableWebMvc
public class SpringMvcConfig {
}
  • 2.加上在參數前面加入@RequestBody,表示傳入的參數是在JSON的body中
//請求參數
@Controller
public class UserController {//集合參數:json格式//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc//2.使用@RequestBody注解將外部傳遞的json數組數據映射到形參的集合對象中作為數據@RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)參數傳遞 list ==> "+likes);return "{'module':'list common for json param'}";}
}

在這里插入圖片描述
在這里插入圖片描述

2)JSON格式的POJO參數傳遞(以及嵌套POJO)
  • 接收參數格式:
//請求參數
@Controller
public class UserController {//POJO參數:json格式//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc//2.使用@RequestBody注解將外部傳遞的json數據映射到形參的實體類對象中,要求屬性名稱一一對應@RequestMapping("/pojoParamForJson")@ResponseBodypublic String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)參數傳遞 user ==> "+user);return "{'module':'pojo for json param'}";}
}
  • 參數請求格式:
    在這里插入圖片描述

  • 結果:
    在這里插入圖片描述

3)JSON格式對象集合參數傳遞
  • 接收參數格式:
//請求參數
@Controller
public class UserController {//集合參數:json格式//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc//2.使用@RequestBody注解將外部傳遞的json數組數據映射到形參的保存實體類對象的集合對象中,要求屬性名稱一一對應@RequestMapping("/listPojoParamForJson")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)參數傳遞 list ==> "+list);return "{'module':'list pojo for json param'}";}
}
  • 參數請求格式:

在這里插入圖片描述

  • 結果:
    在這里插入圖片描述

4.對比

在這里插入圖片描述

5.日期型參數傳遞

在這里插入圖片描述
在這里插入圖片描述

  • 接收參數格式:
//請求參數
@Controller
public class UserController {//日期參數//使用@DateTimeFormat注解設置日期類型數據格式,默認格式yyyy/MM/dd@RequestMapping("/dataParam")@ResponseBodypublic String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){System.out.println("參數傳遞 date ==> "+date);System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);return "{'module':'data param'}";}
}
  • 參數請求格式:

在這里插入圖片描述

  • 結果:
    在這里插入圖片描述

6.響應

  • 1.響應頁面
  • 2.響應文本
  • 3.響應POJO
  • 4.響應POJO集合

使用@ResponseBody

  • 將其注解在SpringMVC控制器方法定義的上方
  • 作用:設置當前控制器返回值為響應體(POJO轉JSON,POJO集合轉JSON)
//請求參數
@Controller
public class UserController {//返回頁面@RequestMapping("/pageParam")public String pageParam() {System.out.println("返回頁面");return "index.jsp";}//返回文本數據@RequestMapping("/textParam")@ResponseBodypublic String totext() {System.out.println("返回文本數據");return "context text";}//返回POJO@RequestMapping("/userParam")@ResponseBodypublic User userParam(User user) {System.out.println("返回POJO");User new_user = new User();new_user.setName(user.getName());new_user.setAge(user.getAge());new_user.setAddress(user.getAddress());return new_user;}//返回POJO集合@RequestMapping("/usersParam")@ResponseBodypublic List<User> usersParam(List<User> user) {System.out.println("返回POJO集合");List<User> new_users = new ArrayList<>();new_users.addAll(user);return new_users;}
}

4.REST風格

  • 是一種定義資源描述的形式
    在這里插入圖片描述

  • REST風格訪問資源時,使用行為動作區分對資源進行了何種操作:路徑+請求方式
    在這里插入圖片描述
    在這里插入圖片描述

1)RESTful
  • 在請求時通過不同的請求方式
    在這里插入圖片描述

  • @PathVariable接收路徑參數或者路徑變量(路徑中的參數獲取:http://localhost/users/3 -> 3的獲取)
    在這里插入圖片描述

package com.itheima.controller;import com.itheima.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
public class UserController {//設置當前請求方法為POST,表示REST風格中的添加操作@RequestMapping(value = "/users",method = RequestMethod.POST)@ResponseBodypublic String save(){System.out.println("user save...");return "{'module':'user save'}";}//設置當前請求方法為DELETE,表示REST風格中的刪除操作//@PathVariable注解用于設置路徑變量(路徑參數),要求路徑上設置對應的占位符,并且占位符名稱與方法形參名稱相同@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("user delete..." + id);return "{'module':'user delete'}";}//設置當前請求方法為PUT,表示REST風格中的修改操作@RequestMapping(value = "/users",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update..."+user);return "{'module':'user update'}";}//設置當前請求方法為GET,表示REST風格中的查詢操作//@PathVariable注解用于設置路徑變量(路徑參數),要求路徑上設置對應的占位符,并且占位符名稱與方法形參名稱相同@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("user getById..."+id);return "{'module':'user getById'}";}//設置當前請求方法為GET,表示REST風格中的查詢操作@RequestMapping(value = "/users",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("user getAll...");return "{'module':'user getAll'}";}
}
2)@RequestBody@RequestParam@PathVariable

在這里插入圖片描述

3)RESTful快速開發
  • 在1)RESTful的編寫中,同一個路徑前綴等在每個控制器方法上都有,為了簡化書寫,以下注解和簡化寫法是標準的RESTful開發:
    在這里插入圖片描述
    在這里插入圖片描述

  • 標準RESTful開發:

package com.itheima.controller;import com.itheima.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;//@Controller
//@ResponseBody配置在類上可以簡化配置,表示設置當前每個方法的返回值都作為響應體
//@ResponseBody
@RestController     //使用@RestController注解替換@Controller與@ResponseBody注解,簡化書寫
@RequestMapping("/books")
public class BookController {//    @RequestMapping( method = RequestMethod.POST)@PostMapping        //使用@PostMapping簡化Post請求方法對應的映射配置public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}//    @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)@DeleteMapping("/{id}")     //使用@DeleteMapping簡化DELETE請求方法對應的映射配置public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}//    @RequestMapping(method = RequestMethod.PUT)@PutMapping         //使用@PutMapping簡化Put請求方法對應的映射配置public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}//    @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)@GetMapping("/{id}")    //使用@GetMapping簡化GET請求方法對應的映射配置public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}//    @RequestMapping(method = RequestMethod.GET)@GetMapping             //使用@GetMapping簡化GET請求方法對應的映射配置public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}
4)案例:基于RESRful頁面數據交互
  • 1.制作控制器,通過PostMan測試接口:
    在這里插入圖片描述

  • 2.放行靜態資源訪問:
    由于SpringMVC設置了訪問路徑攔截,當訪問前端靜態頁面時,會被攔截,導致無法訪問到,于是我們需要制作放行器,將對應的靜態數據進行放行:

SpringMVCSupport:

package com.itheima.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class SpringSupport extends WebMvcConfigurationSupport {//當訪問/pages/????的時候,走/pages目錄下的內容@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}
  • 3.異步提交訪問后端控制器獲取數據:
    在這里插入圖片描述

5.攔截器

  • 動態攔截方法調用的機制,在SpringMVC中動態攔截控制器的執行
  • 作用:
    • 在指定的方法調用前后執行預先設定的代碼
    • 阻止原始方法的執行(權限控制)
      在這里插入圖片描述

1)攔截器與過濾器區別

  • 歸屬不同:Filter屬于Serverlet技術,Interceptor屬于SpringMVC技術
  • 攔截內容不同:Filter針對所有訪問進行增強,Interceptor僅針對SpringMVC的訪問進行增強

2)攔截器入門案例

  • 1.聲明攔截器的bean,并實現HandlerInterceptor接口:
@Component
public class MyProjectInterceptor implements HandlerInterceptor {@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyProjectInterceptor posHandle");}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyProjectInterceptor preHandle");return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyProjectInterceptor afterCompletion");}
}
  • 2.定義配置類,繼承WebMvcConfigurationSupport,實現addInterceptor方法:
@Configuration
public class MySpringMvcSupport extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {}
}
  • 3.添加攔截器并設定攔截的訪問路徑,路徑可以通過可變參數設置多個:
@Configuration
public class MySpringMvcSupport extends WebMvcConfigurerAdapter {@Autowiredprivate MyProjectInterceptor projectInterceptor;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/page/**").addResourceLocations("classpath:/pages/");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//攔截器配置,當遇到哪些路徑時,會將其攔截下來執行對應的postHandle和preHandle方法registry.addInterceptor(projectInterceptor).addPathPatterns("/books", "/books/*");}
}
  • 4.發送請求:
    在這里插入圖片描述
  • 5.攔截器攔截對應的路徑下方法的調用,并在方法調用前后執行預先定義的方法:
    在這里插入圖片描述
攔截器執行流程:

在這里插入圖片描述

3)攔截器參數(了解即可,主要用到的可能是前置處理)

  • 前置處理,拿到handler(原始方法對象的封裝)可以對原始方法進行一些處理
  • 主要用處為在方法執行前作校驗
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

4)攔截器鏈(了解即可)

  • 當配置多個攔截器是,形參攔截器鏈
  • 攔截器鏈的運行順序參照攔截器添加的順序為準
    在這里插入圖片描述
    *注:上述內容均來自黑馬程序員SSM框架的課程學習,僅用作學習交流,不作為商業用途,如有侵權,聯系刪除。

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

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

相關文章

PostgreSQL表膨脹的危害與解決方案

PostgreSQL 的 表膨脹&#xff08;Table Bloat&#xff09; 是數據庫中由于 MVCC&#xff08;多版本并發控制&#xff09;機制導致的一種常見性能問題&#xff0c;表現為物理存儲空間遠大于實際有效數據量。以下是詳細解釋及其危害&#xff1a;一、表膨脹的產生原因 1. MVCC 機…

Elasticsearch面試精講 Day 5:倒排索引原理與實現

【Elasticsearch面試精講 Day 5】倒排索引原理與實現 在“Elasticsearch面試精講”系列的第五天&#xff0c;我們將深入探討搜索引擎最核心的技術基石——倒排索引&#xff08;Inverted Index&#xff09;。作為全文檢索系統的靈魂&#xff0c;倒排索引直接決定了Elasticsearc…

【小白筆記】基本的Linux命令來查看服務器的CPU、內存、磁盤和系統信息

一、 核心概念與命令知識點英文名詞&#xff08;詞源解釋&#xff09;作用與命令CPU (中央處理器)Central Processing Unit&#xff1a;<br> - Central&#xff08;中心的&#xff09;&#xff1a;來自拉丁語 centralis&#xff0c;意為“中心的”。<br> - Process…

51c大模型~合集177

自己的原文哦~ https://blog.51cto.com/whaosoft/14154064 #公開V3/R1訓練全部細節&#xff01; 剛剛&#xff0c;DeepSeek最新發文&#xff0c;回應國家新規 AI 生成的內容該不該打上“水印”&#xff1f;網信辦《合成內容標識方法》正式生效后&#xff0c;De…

CA根證書的層級關系和驗證流程

CA根證書的層級關系和驗證流程&#xff1a;1. 證書層級結構&#xff08;樹狀圖&#xff09; [根證書 (Root CA)] │ ├── [中間證書 (Intermediate CA 1)] │ │ │ ├── [網站證書 (example.com)] │ └── [郵件證書 (mail.example.com)] │ └── [中間證書 (In…

液態神經網絡(LNN)1:LTC改進成CFC思路

從液態時間常數網絡&#xff08;Liquid Time-Constant Networks, LTC&#xff09;到其閉式解版本——閉式連續時間網絡&#xff08;Closed-form Continuous-time Networks, CfC&#xff09; 的推導過程&#xff0c;可以分為以下幾個關鍵步驟。我們將基于你提供的兩篇論文&#…

【圖像處理基石】圖像預處理方面有哪些經典的算法?

圖像預處理是計算機視覺任務&#xff08;如目標檢測、圖像分割、人臉識別&#xff09;的基礎步驟&#xff0c;核心目的是消除圖像中的噪聲、提升對比度、修正幾何畸變等&#xff0c;為后續高階處理提供高質量輸入。以下先系統梳理經典算法&#xff0c;再通過Python實現2個高頻應…

MySQL 多表查詢方法

MySQL 多表查詢方法MySQL 多表查詢用于從多個表中檢索數據&#xff0c;通常通過關聯字段&#xff08;如外鍵&#xff09;實現。以下是常見的多表查詢方式&#xff1a;內連接&#xff08;INNER JOIN&#xff09;內連接返回兩個表中匹配的行。語法如下&#xff1a;SELECT 列名 F…

網絡斷連與業務中斷的全鏈路診斷與解決之道(面試場景題)

目錄 1. 網絡鏈路的“命脈”:從物理層到應用層的排查邏輯 物理層:別小看那一根網線 數據鏈路層:MAC地址和交換機的“恩怨情仇” 工具推薦:抓包初探 2. 網絡層的“幕后黑手”:IP沖突與路由迷霧 IP沖突:誰搶了我的地址? 路由問題:數據包的“迷路”之旅 3. 傳輸層與…

英偉達Newton與OpenTwins如何重構具身智能“伴隨式數采”范式

具身智能的“數據饑荒”&#xff1a;行業痛點與技術瓶頸的深度剖析1.1 具身智能的現狀與核心挑戰Embodied AI的落地之路面臨著多重嚴峻挑戰。在算法層面&#xff0c;實現通用智能仍需人類的持續介入&#xff0c;并且從感知到行動的認知映射尚未完全打通。在硬件層面&#xff0c…

STM32HAL 快速入門(十六):UART 協議 —— 異步串行通信的底層邏輯

大家好&#xff0c;這里是 Hello_Embed。在前幾篇中&#xff0c;我們通過環形緩沖區解決了按鍵數據丟失問題&#xff0c;而在嵌入式系統中&#xff0c;設備間的數據交互&#xff08;如單片機與電腦、傳感器的通信&#xff09;同樣至關重要。UART&#xff08;通用異步收發傳輸器…

使用 C 模仿 C++ 模板的拙劣方法

如下所示&#xff0c;準備兩個宏&#xff0c;一個定義類型&#xff0c;一個定義容器大小。 使用時只要先定義這兩個宏&#xff0c;然后再包含容器頭文件就能生成不同類型和大小的容器了。但是這種方法只允許在源文件中使用&#xff0c;如果在頭文件中使用&#xff0c;定義不同類…

flume接收處理器:構建高可用與高性能的數據鏈路

flume接收處理器&#xff1a;構建高可用與高性能的數據鏈路 在大規模數據采集場景中&#xff0c;單點故障和性能瓶頸是兩大核心挑戰。Flume 通過 Sink Group 接收處理器&#xff08;Processor&#xff09; 機制&#xff0c;提供了強大的故障轉移&#xff08;Failover&#xf…

高級Kafka應用之流處理

40 Kafka Streams與其他流處理平臺的差異在哪里&#xff1f; 什么是流處理平臺&#xff1f; “Streaming Systems”一書是這么定義“流處理平臺”的&#xff1a;流處理平臺&#xff08;Streaming System&#xff09;是處理無限數據集&#xff08;Unbounded Dataset&#xff09;…

Custom SRP - LOD and Reflections

1 LOD Groups 場景中對象越多,場景就越豐富,但是過多的對象,也會增加 CPU 和 GPU 的負擔.同時如果對象最終渲染在屏幕上后覆蓋的像素太少,就會產生模糊不清的像素點/噪點.如果能夠不渲染這些過小的對象,就能解決噪點問題,同時釋放 CPU GPU,去處理更重要的對象. 裁剪掉這些對象…

【Linux篇章】互聯網身份密碼:解密 Session 與 Cookie 的隱藏玩法和致命漏洞!

本篇摘要 本篇將承接上篇HTTP講解&#xff08; 戳我查看 &#xff09;遺留的關于Cookie與Session的介紹&#xff0c;在本篇&#xff0c;將會介紹Cookie的由來&#xff0c;作用&#xff0c;以及缺點等&#xff0c;進而引出Session&#xff0c;最后介紹一下它們的性質等&#xf…

Postman接口測試工具:高效管理測試用例與環境變量,支持斷言驗證及團隊協作同步

之前跟你們聊過能搭知識網絡的 Obsidian&#xff0c;今天換個偏向接口測試的方向 —— 給你們安利一個 Github 上的「Postman」&#xff0c;它是個接口測試工具&#xff0c;官網能直接下載&#xff08;Postman: The Worlds Leading API Platform | Sign Up for Free&#xff09…

可可圖片編輯 HarmonyOS 上架應用分享

可可圖片編輯 HarmonyOS 上架應用分享 介紹 可可圖片編輯 原名 圖片編輯大師&#xff0c;因為上架審核的時候 &#xff0c;提示與一些已有應用重名&#xff0c;為了避免沖突&#xff0c;需要改名字&#xff0c;所以苦心思考了一分鐘&#xff0c;就調整成 可可圖片編輯。 應用…

Notepad++近期版本避雷

近期Notepad若干版本存在投毒事件&#xff0c;雖然也歡迎大家使用替代軟件&#xff0c;但是Notepad作為一款開源軟件&#xff0c;如有需要也可以繼續白嫖使用&#xff0c;但是請務必避開若干埋雷版本&#xff01; 經檢查&#xff0c;部分版本在幫助菜單中加入了有關tw的部分個人…

【lucene核心】impacts的由來

在 Lucene 的 Impact 概念&#xff08;出現在 ImpactsEnum / Impact 對象里&#xff09;中&#xff1a;字段 含義 freq 當前 term 在該文檔中出現了多少次&#xff08;即詞頻 term frequency&#xff09;。 norm 當前 文檔在該字段中的長度因子&#xff08;即之前 norms 里保存…