Spring框架學習day7--SpringWeb學習(概念與搭建配置)

  • SpringWeb
    • 1.SpringWeb特點
    • 2.SpringWeb運行流程
    • 3.SpringWeb組件
    • 4.搭建
      • 項目結構圖:
      • 4.1導入jar包
      • 4.2在Web.xml配置
        • **4.2.1配置統一攔截分發器 DispatcherServlet**
        • 4.2.2開啟SpringWeb注解(spring.xml)
    • 5.處理類的搭建
    • 6.SpringWeb請求流程(自己理解)
    • 7.接受請求
      • @RequestMapping
    • 8.補充ApiPost7使用(不需要前端直接測試后端)
    • 9.獲取請求數據
      • 1.使用request對象接收
      • 2.spring自動封裝
      • 3.@RequestParam("")進行參數綁 定.
      • 4.使用實體類對象接受
      • 5.日期類轉換
    • 10.中文亂碼處理
    • 11.跨域訪問處理
    • 12.返回json
    • 13.攔截器

SpringWeb

SpringWeb是spring框架的一部分,是對web層進行封裝

在 web 層框架歷經 Strust1,WebWork,Strust2 等諸多產品的歷代更選之后, 目前業界普遍選擇了 springWeb 作為 Java EE 項目 web 層開發的首選方案

1.SpringWeb特點

pringWEB 是 spring 家族原生產品,與 IOC 容器等基礎設施無縫對接.

  • ? 基于原生的 Servlet,提供了一個前端控制器 DispatcherServlet ,開發者
    無須額外開發控制器對象.
  • ? 可以自動綁定用戶輸入,并正確地轉換數據類型.
  • ? 代碼清新簡潔,大幅度提升開發效率.
  • ? 內部組件化程度高,可插拔式組件即插即用.
  • ? 性能卓著,尤其適合現代大型、超大型互聯網項目要求.

2.SpringWeb運行流程

  • 用戶發送出請求到前端控制器 DispatcherServlet

  • ? DispatcherServlet 收到請求調用 HandlerMapping(處理器映射器)。

  • ? HandlerMapping 找到具體的處理器(可查找 xml 配置或注解配置),生成處 理器對象及處理器攔截器(如果有),再一起返回給 DispatcherServlet

  • ?DispatcherServlet調用 HandlerAdapter(處理器適配器)。

  • ? HandlerAdapter 經過適配調用具體的處理器(Handler/Controller)。

  • ? Controller 執行完成向前端響應結果

原理圖:

image-20250602211810022

3.SpringWeb組件

前端控制器:DispatcherServlet,由框架提供,在web.xml配置

**作用:**統一處理請求和響應。整個流程控制的中心,由它組件處理用戶的請求

**處理映射器:HandlerMapping**由框架提供

作用:根據請求的url查找Handler

**處理器適配器HandlerAdapter**由框架提供。

作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler

處理器Handler也稱為Control需要自己開發

注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可 以去正確執行Handler。

作用:接受用戶請求信息,調用業務方法處理請求,也稱之為后端控制器。

4.搭建

創建ssm web!!!項目根據前面搭建IOC AOP 事務管理的項目

項目結構圖:

image-20250605180424293

4.1導入jar包

<!-- springWeb -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version>
</dependency>

完整的pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><name>ssm</name><packaging>war</packaging><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><junit.version>5.6.2</junit.version></properties><dependencies><!--spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency><!--spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.2.RELEASE</version></dependency><!--mybtais--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 阿里巴巴數據源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--spring集成mybatis需要的依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!--springweb層--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency><!--spring中提供的解決跨域問題的過過濾器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.0</version></plugin></plugins></build>
</project>

4.2在Web.xml配置

必須是web項目

配置Web.xml文件

4.2.1配置統一攔截分發器 DispatcherServlet
	<servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><!-- 請求映射 --><servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
4.2.2開啟SpringWeb注解(spring.xml)
<!-- 配置springmvc注解掃描--><mvc:annotation-driven/>

完整spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--開啟注解掃描   對指定包下面的類進行掃描, 檢查添加有spring注解標簽的類--><context:component-scan base-package="com.ffyc.ssm"> </context:component-scan><!--導入屬性文件--><context:property-placeholder location="classpath:config.properties"/><!--讓spring管理阿里巴巴數據庫連接對象--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driverClassName}"></property><property name="url" value="${url}"></property><property name="username" value="${uname}"></property><property name="password" value="${pwd}"></property><property name="initialSize" value="${initialSize}"></property><property name="maxActive" value="${maxActive}"></property></bean><!--spring管理生成SqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!--注入數據庫連接對象--><property name="configLocation" value="classpath:mybatis.xml"></property><!--指定配置文件--><property name="mapperLocations" value="classpath:mappers/*Mapper.xml"><!--指定映射文件地址--></property></bean><!--spring管理生成接口的代理對象--><bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.ffyc.ssm.dao"></property><!--對指定包下的接口進行掃描,并生成接口的代理對象--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- 配置 spring 事務管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 開啟注解事務管理 --><tx:annotation-driven transaction-manager="transactionManager"/><!--開啟web層的注解--><mvc:annotation-driven></mvc:annotation-driven><!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定義哪些地址可以進入到攔截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定義哪些地址不進入攔截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置攔截器的實現類--></mvc:interceptor></mvc:interceptors></beans>

注意:一定要檢查spring.xml的配置

<!--導入屬性文件--><context:property-placeholder location="classpath:config.properties"/>

5.處理類的搭建

image-20250602214944487

package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用來為類和方法定義訪問地址,  類上面的地址不能重復
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping("/login")public String login() {System.out.println("hello Spring Web");return "login success";}}

@RestController 用于標記在一個類上,使用它標記的類就是一個 SpringWEB
控制器類.

Spring 配置中指定了自動掃描的 basepackage 后,Spring 會掃描這些包以及子包中的使用了@RestController 標識的類,然后將類加入到 Spring IOC 容器中,注入依賴。 @RequestMapping 注解是一個用來處理請求地址映射的注解,可用于類或方法上

@RequestMapping("/location") 注解是一個用來處理請求地址映射的注解,可用于類或方 法上。注:類上面的地址不允許重名,同一類內部方法的地址不允許重名

把項目部署在tomcat上運行,部署步驟

1.image-20250602215421077

2.image-20250602215501427

3.image-20250602215558468

注意:轉換web項目時

要添加Artifacs:如圖

image-20250602221354586

4.image-20250602220108968

5.啟動服務器

image-20250602220148952

啟動成功!!!

6.SpringWeb請求流程(自己理解)

  • 用戶發送出請求到前端控制器DispatcherServlet。
  • DispatcherServlet 收到請求調用HandlerMapping(處理器映射器)。
  • HandlerMapping找到具體的處理器(可查找xml配置或注解配置),生成處
    理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。
  • DispatcherServlet 調用 HandlerAdapter(處理器適配器)。
  • HandlerAdapter經過適配調用具體的處理器(Handler/Controller)。
  • Controller 執行完成向前端響應結果

image-20250605154603498

7.接受請求

@RequestMapping

/*@RequestMapping 是一個用來為處理器地址映射的注解,可用于類或方法上.
作用在類上,在整個項目中不能重復,作用在方法上,整個類中不能重復.
常用屬性 path,value,method.
path 和value 用來定義地址
method 用來定義請求方式*/
@RequestMapping(value = "/hello",method = RequestMethod.GET)
@RequestMapping(path= "/hello",method = RequestMethod.POST)

案例:比如只允許post

@RequestMapping(path = "/login",method = RequestMethod.POST)public String login() {System.out.println("hello Spring Web");return "login success";}

8.補充ApiPost7使用(不需要前端直接測試后端)

1.安裝ApiPost7

2.開始配置,點擊API

image-20250605163510832

2.配置接口

image-20250605163826541

3.開始post、get測試

image-20250605164038638

4.點擊發送得到響應

image-20250605164127479

5.后端響應

image-20250605164349095

當然后端也可以更簡單的接受前端post

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(String name, String age) {System.out.println("hello Spring Web");System.out.println(name +"and"+age);return "login success";}

image-20250605164739912

也可以將前端數據封裝在類中,當然前端傳來的名稱要與后端內容一致

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(Admin admin) {System.out.println("hello Spring Web");System.out.println(admin.getAccount());System.out.println(admin.getPassword());return "login success";}

image-20250605165024384

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

那我們對獲取請求數據來做具體介紹

9.獲取請求數據

SpringWeb支持多種類型的請求參數進行封裝

1.使用request對象接收

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(HttpServletRequest request) {System.out.println(request.getParameter("name"));return "login success";}

在處理中如果需要使用到HttpServletRequest 對象只需要定義即可

2.spring自動封裝

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(String account,String password) {System.out.println("account: "+account+" password: "+password);return "login success";}

Spring 會自定進行數據封裝,這里要注意的是,處理器接收參數的形參名稱必須 和表單的name屬性保持一致,否則會接收失敗!

3.@RequestParam(“”)進行參數綁 定.

當請求參數名與形參名不一致時,可以使用

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(@RequestParam("account") String Useraccount,@RequestParam("password") String Userpassword) {System.out.println("account: "+Useraccount+" password: "+Userpassword);return "login success";}

表單的name和控制器的形參并不一致,但是@RequestParam注解的value 值必須和表單的name保持一致。

  • @RequestHeader(“”)用來接收請求中的數據.
  • @RequestHeader(“user-agent”)可以用來接收請求頭中的數據

4.使用實體類對象接受

@RequestBody可以接收前端提交的json格式數據,將json格式封裝到對象 中.

@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public String login(Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";}

5.日期類轉換

屬性類型為Date類型需要指定轉換格式

@DateTimeFormat(pattern="yyyy-MM-dd") 
privateDatebirthday
@DateTimeFormat(pattern = "yyyy-MM-dd")//給前端提交到后端的數據日期指定轉換格式@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")//后端把對象轉為json時,指定日期的格式private Date birthday;

如果前端是json格式的數據則需要在對象前添加如下標簽@RequestBody

@RequestMapping(path = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return "login success";
}

tips:記得在pom.xml添加json組件

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

10.中文亂碼處理

添加jar組件配置web.xml

<!--編碼過濾器--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

11.跨域訪問處理

添加依賴pom.xml

 <!--spring中提供的解決跨域問題的過過濾器--><dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version></dependency>

web.xml配置

<!--跨域過濾器--><filter><filter-name>CORS</filter-name><filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class></filter><filter-mapping><filter-name>CORS</filter-name><url-pattern>/*</url-pattern></filter-mapping>

12.返回json

第一步添加依賴

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

Springweb 中 向 前 端 返 回數據為 json 時,只需要在方法上添加 @ResponseBody注解即可,

由于在類上面已經使用@RestController 注解,所以不需要再次添 加,@RestController 中已經包含

package com.ffyc.ssm.web;import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.model.Result;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.management.Agent;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestController
//@RequestMapping 用來為類和方法定義訪問地址,  類上面的地址不能重復
@RequestMapping(path = "/loginCtl")
public class LoginController {@AutowiredLoginService loginService;@RequestMapping(path = "/login",method = RequestMethod.POST)//直接接受前端的name與age(前提必須name對應前端的name)public Admin login(@RequestBody Admin admin) {Admin admin1 = loginService.login(admin);System.out.println(admin1);return admin;}}

運行tomcat 使用ApiPost測試

image-20250605180302032

為了返回前端的代碼,那我們寫一個上面result.class

package com.ffyc.ssm.model;public class Result {private  int code;private String message;private Object data;public Result() {}public Result(int code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

13.攔截器

Spring WEB中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter), 它主要用于攔截用戶請求并作相應的處理。 Spring 中的攔截器與過濾器有著本質的區別,過濾器是servlet規范中定義并實 現的,在進入到servlet之前截獲請求.而攔截器是spring中定義的一種攔截機制, 是對進入到處理器的請求進行攔截.

image-20250605181000711

SpringWEB 定義了攔截器接口HandlerInterceptor

調用這個三個方法的時候,其參數的值也是從框架內部傳遞進來的。

boolean preHandle

? 預處理方法,實現處理器方法的預處理,就是在處理器方法執行之前這個方法會 被執行,相當于攔截了處理器方法,框架會傳遞請求和響應對象給該方法,第三 個參數為被攔截的處理器。如果preHandle方法返回true表示繼續流程(如調 用下一個攔截器或處理器方法),返回false表示流程中斷,不會繼續調用其他 的攔截器或處理器方法,此時我們需要通過response來產生響應;

1.添加**AdminTokenInterceptor**類攔截器

package com.ffyc.ssm.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;//定義攔截器
public class AdminTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("進入到了攔截器");//獲得tokenString token  =   request.getHeader("token");if(token.equals("123456")){return true; //攔截器中返回true, 請求就會離開攔截器,繼續向后執行,到達處理器}else{response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("token驗證失敗");return false;//攔截器中返回false. 不會繼續向后執行.  可以在攔截器中向用戶做出響應}}
}

2.注冊攔截器(spring.xml)

<!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><!--定義哪些地址可以進入到攔截器中--><mvc:exclude-mapping path="/loginCtl/login"/><!--定義哪些地址不進入攔截器--><bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置攔截器的實現類--></mvc:interceptor></mvc:interceptors>

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

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

相關文章

業務到解決方案構想

解決方案構想的核心理解 解決方案構想是連接業務需求與技術實現的關鍵橋梁&#xff0c;從您描述的內容和我的理解&#xff0c;這個階段的核心點包括&#xff1a; 核心要點解讀 轉化視角&#xff1a;將業務視角的需求轉變為解決方案視角 業務能力探索階段識別了"做什么&q…

jvm學習第1day jvm簡介,棧溢出、堆溢出

jvm學習第1day jvm簡介&#xff0c;棧溢出、堆溢出 jvm簡介棧線程安全棧溢出線程運行診斷堆堆溢出 方法區方法區內存溢出常量池和運行時常量池 jvm簡介 jvm 是編譯后的字節碼文件運行的環境&#xff0c; 因此各個平臺有了jvm可以運行java.class文件&#xff0c;這是Java跨平臺…

關于神經網絡中的激活函數

這篇博客主要介紹一下神經網絡中的激活函數以及為什么要存在激活函數。 首先&#xff0c;我先做一個簡單的類比&#xff1a;激活函數的作用就像給神經網絡里的 “數字信號” 加了一個 “智能閥門”&#xff0c;讓機器能學會像人類一樣思考復雜問題。 沒有激活i函數的神經網絡…

免費無限使用GPT Plus、Claude Pro、Grok Super、Deepseek滿血版

滲透智能-ShirtAI&#xff0c;可以免費無限使用GPT Plus、Claude Pro、Grok Super、Deepseek滿血版、除此之外還能免費使用AI搜索、Gemini AI、AI照片修復、AI橡皮擦、AI去背景、AI智能摳圖、AI證件照、OCR識別、在線思維導圖、在線繪圖工具、PDF工具箱、PDF翻譯。 傳送入口&a…

阿里云 Linux 搭建郵件系統全流程及常見問題解決

阿里云 Linux 搭建 [conkl.com]郵件系統全流程及常見問題解決 目錄 阿里云 Linux 搭建 [conkl.com]郵件系統全流程及常見問題解決一、前期準備&#xff08;關鍵配置需重點檢查&#xff09;1.1 服務器與域名準備1.2 系統初始化&#xff08;必做操作&#xff09; 二、核心組件安裝…

python版若依框架開發:項目結構解析

python版若依框架開發 從0起步&#xff0c;揚帆起航。 python版若依部署代碼生成指南&#xff0c;迅速落地CURD&#xff01;項目結構解析 文章目錄 python版若依框架開發前端后端 前端 后端

RabbitMQ 的異步化、解耦和流量削峰三大核心機制

RabbitMQ 的異步化、解耦和流量削峰三大核心機制 RabbitMQ 是解決數據庫高并發問題的利器&#xff0c;通過異步化、解耦和流量削峰三大核心機制保護數據庫。下面從設計思想到具體實現&#xff0c;深入剖析 RabbitMQ 應對高并發的完整方案&#xff1a; 一、數據庫高并發核心痛點…

前端沒有“秦始皇“,但可以做跨端的王[特殊字符]

前端各領域的 “百家爭鳴” 框架之爭&#xff1a;有 React、Vue、Angular 等多種框架。它們各有優缺點&#xff0c;開發者之間還存在鄙視鏈&#xff0c;比如 Vue 嫌 React 難用&#xff0c;React 嫌 Vue 不夠靈活。樣式處理&#xff1a; CSS 預處理器&#xff1a;像 Sass、Les…

Spring Boot-面試題(52)

摘要&#xff1a; 1、通俗易懂&#xff0c;適合小白 2、僅做面試復習用&#xff0c;部分來源網絡&#xff0c;博文免費&#xff0c;知識無價&#xff0c;侵權請聯系&#xff01; 1. 什么是 Spring Boot 框架&#xff1f; Spring Boot 是基于 Spring 框架的快速開發框架&#…

JVM——JVM中的字節碼:解碼Java跨平臺的核心引擎

引入 在Java的技術版圖中&#xff0c;字節碼&#xff08;Bytecode&#xff09;是連接源代碼與機器世界的黃金橋梁。當開發者寫下第一行public class HelloWorld時&#xff0c;編譯器便開始了一場精密的翻譯工程——將人類可讀的Java代碼轉化為JVM能夠理解的字節碼指令。這些由…

Java中的JSONObject詳解:從基礎到高級應用

Java中的JSONObject詳解&#xff1a;從基礎到高級應用 在當今前后端分離的架構中&#xff0c;JSONObject已成為Java開發者處理JSON數據的瑞士軍刀。本文將深入解析JSONObject的核心機制與實戰技巧。 一、JSONObject的本質與實現庫 1.1 核心定位 JSONObject是Java中表示JSON對…

在 SpringBoot+Tomcat 環境中 線程安全問題的根本原因以及哪些變量會存在線程安全的問題。

文章目錄 前言Tomcat SpringBoot單例加載結果分析多例加載&#xff1a;結果分析&#xff1a; 哪些變量存在線程安全的問題&#xff1f;線程不安全線程安全 總結 前言 本文帶你去深入理解為什么在web環境中(Tomcat SpringBoot)會存在多線程的問題以及哪些變量會存在線程安全的…

npm install 相關命令

npm install 相關命令 基本安裝命令 # 安裝 package.json 中列出的所有依賴 npm install npm i # 簡寫形式# 安裝特定包 npm install <package-name># 安裝特定版本 npm install <package-name><version>依賴類型選項 # 安裝為生產依賴&#xff08;默認&…

貪心算法應用:最小反饋頂點集問題詳解

貪心算法應用&#xff1a;最小反饋頂點集問題詳解 1. 問題定義與背景 1.1 反饋頂點集定義 反饋頂點集(Feedback Vertex Set, FVS)是指在一個有向圖中&#xff0c;刪除該集合中的所有頂點后&#xff0c;圖中將不再存在任何有向環。換句話說&#xff0c;反饋頂點集是破壞圖中所…

BiliNote部署實踐

? 開源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速開始 1. 克隆倉庫 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 啟動后端&#xff08;FastAPI&#xff09; cd backend pip insta…

用go從零構建寫一個RPC(4)--gonet網絡框架重構+聚集發包

在追求高性能的分布式系統中&#xff0c;RPC 框架的底層網絡能力和數據傳輸效率起著決定性作用。經過幾輪迭代優化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;這一版本的最大亮點在于 重寫了底層網絡框架 和 實現了發送端的數據聚集機制&#xff0c;這…

MySQL 高可用基石 - 復制監控與常見 HA 方案

MySQL 高可用基石 - 復制監控與常見 HA 方案 MySQL 復制核心原理 MySQL 復制允許數據從一個 MySQL 數據庫服務器(稱為主庫 - Primary,舊稱 Master)復制到一個或多個其他的 MySQL 服務器(稱為從庫 - Replica,舊稱 Slave)。 復制的主要目的: 高可用性 (High Availability…

微信小程序(uniapp)自定義 TabBar

微信小程序&#xff08;uniapp&#xff09;自定義 TabBar 實現指南 在微信小程序開發中&#xff0c;TabBar 是底部導航欄的重要組件&#xff0c;但官方提供的 TabBar 樣式和功能較為基礎&#xff0c;無法滿足所有項目的需求。本文將詳細介紹如何在 uniapp 中實現自定義 TabBar…

MLP實戰二:MLP 實現圖像數字多分類

任務 實戰&#xff08;二&#xff09;&#xff1a;MLP 實現圖像多分類 基于 mnist 數據集&#xff0c;建立 mlp 模型&#xff0c;實現 0-9 數字的十分類 task: 1、實現 mnist 數據載入&#xff0c;可視化圖形數字&#xff1b; 2、完成數據預處理&#xff1a;圖像數據維度轉換與…

BUUCTF[HCTF 2018]WarmUp 1題解

BUUCTF[HCTF 2018]WarmUp 1題解 分析解題過程代碼審計主體函數CHECK函數&#xff1a; 構造payload 總結 分析 啟動靶機&#xff0c;進入網址&#xff0c;是一張滑稽的表情包&#xff1a; 程序化F12查看源碼&#xff1a; 發現注釋內容&#xff0c;訪問 url:/source.php得到…