Servlet、HTTP與Spring Boot Web全面解析與整合指南

目錄

第一部分:HTTP協議與Servlet基礎

1. HTTP協議核心知識

2. Servlet核心機制

第二部分:Spring Boot Web深度整合

1. Spring Boot Web架構

2. 創建Spring Boot Web應用

3. 控制器開發實踐

4. 請求與響應處理

第三部分:高級特性與最佳實踐

1. 會話管理方案對比

2. 異常處理統一方案

3. 性能優化策略

第四部分:安全與部署

1. 安全防護基礎

2. 部署方案對比

第五部分:現代化演進

1. 響應式Web開發

2. 微服務架構整合


第一部分:HTTP協議與Servlet基礎

1. HTTP協議核心知識

HTTP協議特性

  • 無狀態協議(可通過Cookie/Session維持狀態)

  • 基于請求/響應模型(Request/Response)

  • 默認端口:HTTP(80)/HTTPS(443)

  • 支持多種請求方法(GET/POST/PUT/DELETE等)

HTTP請求方法對照表

方法冪等性安全性典型應用場景
GET獲取資源
POST創建資源或提交數據
PUT完整更新資源
PATCH部分更新資源
DELETE刪除資源

HTTP狀態碼分類

狀態碼范圍類別常見狀態碼示例
1xx信息性100 Continue
2xx成功200 OK, 201 Created
3xx重定向301 Moved Permanently
4xx客戶端錯誤400 Bad Request, 403 Forbidden
5xx服務器錯誤500 Internal Server Error

2. Servlet核心機制

Servlet生命周期

  1. 初始化階段:容器調用init()方法

  2. 服務階段:針對每個請求調用service()方法(內部路由到doGet/doPost等)

  3. 銷毀階段:容器調用destroy()方法釋放資源

Servlet處理流程

客戶端請求 → Web服務器 → Servlet容器 → 創建Request/Response對象 
→ 調用Servlet的service()方法 → 生成響應 → 返回客戶端

Servlet API核心接口

// 傳統Servlet配置示例(web.xml)
<servlet><servlet-name>helloServlet</servlet-name><servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>helloServlet</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>// 注解配置示例(Servlet 3.0+)
@WebServlet(name = "modernServlet",urlPatterns = {"/api/*"},initParams = @WebInitParam(name = "config", value = "value")
)
public class ModernServlet extends HttpServlet {// 實現代碼
}

第二部分:Spring Boot Web深度整合

1. Spring Boot Web架構

核心組件關系

HTTP請求 → DispatcherServlet → HandlerMapping 
→ Controller → 業務處理 → 返回ModelAndView 
→ ViewResolver → 渲染視圖 → HTTP響應

與傳統Servlet的關系

  • DispatcherServlet作為唯一的前端控制器

  • 內嵌Servlet容器(Tomcat/Jetty/Undertow)

  • 自動配置Spring MVC組件

2. 創建Spring Boot Web應用

項目初始化

# 使用Spring Initializr創建項目
curl https://start.spring.io/starter.zip \-d dependencies=web \-d javaVersion=11 \-d packageName=com.example \-d name=demo \-o demo.zip

基礎項目結構

src/
├── main/
│   ├── java/
│   │   └── com/example/demo/
│   │       ├── DemoApplication.java       # 啟動類
│   │       ├── config/                   # 配置類
│   │       ├── controller/               # 控制器
│   │       ├── service/                  # 服務層
│   │       └── repository/               # 數據訪問層
│   └── resources/
│       ├── static/                       # 靜態資源
│       ├── templates/                    # 模板文件
│       ├── application.properties        # 配置文件
│       └── application.yml              # 替代配置

3. 控制器開發實踐

RESTful控制器示例

@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {return ResponseEntity.ok(userService.findAll());}@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {return userService.findById(id).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user) {User savedUser = userService.save(user);URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(savedUser.getId()).toUri();return ResponseEntity.created(location).body(savedUser);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @Valid @RequestBody User user) {return ResponseEntity.ok(userService.update(id, user));}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.delete(id);return ResponseEntity.noContent().build();}
}

4. 請求與響應處理

參數綁定方式對比

參數類型注解示例
路徑變量@PathVariable/users/{id}
請求參數@RequestParam?name=value
請求體@RequestBodyJSON/XML格式數據
請求頭@RequestHeader獲取特定Header值
Cookie值@CookieValue獲取Cookie信息
表單數據@ModelAttribute綁定表單對象
Servlet原生對象直接聲明HttpServletRequest等

響應處理技術

// 1. 返回視圖
@Controller
public class ViewController {@GetMapping("/greet")public String greet(Model model) {model.addAttribute("message", "Hello World");return "greetView"; // 對應templates/greetView.html}
}// 2. 返回JSON(RESTful)
@RestController
public class ApiController {@GetMapping("/data")public Map<String, Object> getData() {return Map.of("status", "success", "code", 200);}
}// 3. 文件下載
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile() {InputStreamResource resource = new InputStreamResource(...);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.txt").contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource);
}

第三部分:高級特性與最佳實踐

1. 會話管理方案對比

方案對比表

方案實現方式優點缺點
SessionHttpSession服務端狀態,安全性較好集群環境需要同步
Cookie瀏覽器存儲簡單易用大小限制,安全性低
TokenJWT等機制無狀態,適合分布式需要處理令牌過期
Spring Session配合Redis等存儲適合分布式系統增加架構復雜度

JWT實現示例

// 生成Token
public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return Jwts.builder().setClaims(claims).setSubject(userDetails.getUsername()).setIssuedAt(new Date(System.currentTimeMillis())).setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)).signWith(SignatureAlgorithm.HS512, secret).compact();
}// 驗證Filter
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {// 驗證邏輯}
}

2. 異常處理統一方案

全局異常處理

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {ErrorResponse error = new ErrorResponse("NOT_FOUND",ex.getMessage(),System.currentTimeMillis());return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);}@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ErrorResponse> handleValidation(MethodArgumentNotValidException ex) {List<String> errors = ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.toList());ErrorResponse error = new ErrorResponse("VALIDATION_FAILED","字段驗證失敗",System.currentTimeMillis(),errors);return ResponseEntity.badRequest().body(error);}
}

3. 性能優化策略

緩存配置示例

@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager();cacheManager.setCaffeine(Caffeine.newBuilder().initialCapacity(100).maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).recordStats());return cacheManager;}
}// 使用緩存
@Service
public class ProductService {@Cacheable(value = "products", key = "#id")public Product getProductById(Long id) {// 數據庫查詢}@CacheEvict(value = "products", key = "#product.id")public void updateProduct(Product product) {// 更新操作}
}

異步處理示例

@RestController
public class AsyncController {@GetMapping("/async")public CompletableFuture<String> asyncTask() {return CompletableFuture.supplyAsync(() -> {// 模擬耗時操作try { Thread.sleep(2000); } catch (InterruptedException e) { /* 處理異常 */ }return "異步任務完成";});}
}

第四部分:安全與部署

1. 安全防護基礎

Spring Security配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().antMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/").and().rememberMe().and().csrf().disable(); // 根據實際情況決定是否禁用}
}

2. 部署方案對比

部署方式對比

部署方式適用場景特點
內嵌容器開發/小型生產環境簡單快捷,無需額外容器
WAR包部署傳統Java EE環境需要外部Servlet容器
Docker容器化云原生環境環境一致,便于擴展
云平臺原生部署Kubernetes等云環境彈性伸縮,高可用

生產環境配置建議

# application-prod.yml
server:port: 8080compression:enabled: truemime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/jsonmin-response-size: 1024error:whitelabel:enabled: falsemanagement:endpoints:web:exposure:include: health,info,metricsendpoint:health:show-details: always

第五部分:現代化演進

1. 響應式Web開發

WebFlux基礎示例

@RestController
@RequestMapping("/reactive")
public class ReactiveController {@GetMapping("/flux")public Flux<String> getFlux() {return Flux.just("Item1", "Item2", "Item3").delayElements(Duration.ofSeconds(1));}@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ServerSentEvent<String>> getStream() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> ServerSentEvent.<String>builder().id(String.valueOf(sequence)).event("periodic-event").data("SSE - " + LocalTime.now().toString()).build());}
}

2. 微服務架構整合

OpenAPI文檔集成

@Configuration
public class OpenApiConfig {@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("電商平臺API").version("1.0").description("基于Spring Boot的電商平臺接口文檔").license(new License().name("Apache 2.0"))).externalDocs(new ExternalDocumentation().description("項目Wiki").url("https://github.com/example/wiki"));}
}// 控制器注解示例
@Operation(summary = "獲取用戶詳情", description = "根據ID返回用戶完整信息")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "成功獲取用戶"),@ApiResponse(responseCode = "404", description = "用戶不存在")
})
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@Parameter(description = "用戶ID") @PathVariable Long id) {// 實現代碼
}

本整合指南從傳統的Servlet基礎出發,逐步深入到Spring Boot Web的現代化開發模式,涵蓋了從基礎概念到高級特性的完整知識體系。在實際開發中,建議根據項目需求選擇合適的架構方案和技術組合,平衡開發效率與系統性能。

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

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

相關文章

vue中根據html動態渲染內容2.0

上次使用的是p標簽用的contenteditable代替的可編輯的input&#xff0c;最后實現還是選擇了用el-input的textarea方式。 一開始考慮的是需要根據用戶輸入自動撐開輸入框&#xff0c;所以選擇了p標簽可編輯。 最后發現還是el-input會更好一點&#xff0c;只不過需要處理輸入框撐…

CentOS 系統磁盤擴容并掛載到根目錄(/)的詳細步驟

在使用 CentOS 系統時&#xff0c;經常會遇到需要擴展磁盤空間的情況。例如&#xff0c;當虛擬機的磁盤空間不足時&#xff0c;可以通過增加磁盤容量并將其掛載到根目錄&#xff08;/&#xff09;來解決。以下是一個完整的操作流程&#xff0c;詳細介紹了如何將新增的 10G 磁盤…

LINUX基礎 [二] - Linux常見指令

目錄 &#x1f4bb;前言 &#x1f4bb;指令 &#x1f3ae;ls指令 &#x1f3ae;pwd指令 &#x1f3ae;whoami指令 &#x1f3ae;cd指令 &#x1f3ae;clear指令 &#x1f3ae;touch指令 &#x1f3ae;mkdir指令 &#x1f3ae;rmdir指令 &#x1f3ae;rm指令 &#…

基于php的成績分析和預警與預測網站(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 人類現已邁入二十一世紀&#xff0c;科學技術日新月異&#xff0c;經濟、資訊等各方面都有了非常大的進步&#xff0c;尤其是資訊與網絡技術的飛速發展&#xff0c;對政治、經濟、軍事、文化、教育等各方面都有了極大的影響。 利用電腦網絡的這些便利&#xff0c;發展一套…

《從底層邏輯剖析:分布式軟總線與傳統計算機硬件總線的深度對話》

在科技飛速發展的當下&#xff0c;我們正見證著計算機技術領域的深刻變革。計算機總線作為信息傳輸的關鍵樞紐&#xff0c;其發展歷程承載著技術演進的脈絡。從傳統計算機硬件總線到如今備受矚目的分布式軟總線&#xff0c;每一次的變革都為計算機系統性能與應用拓展帶來了質的…

Spring Boot 3.5新特性解析:自動配置再升級,微服務開發更高效

&#x1f4dd; 摘要 Spring Boot 3.5作為Spring生態的最新版本&#xff0c;帶來了多項令人振奮的改進。本文將深入解析其中最核心的自動配置增強特性&#xff0c;以及它們如何顯著提升微服務開發效率。通過詳細的代碼示例和通俗易懂的講解&#xff0c;您將全面了解這些新特性在…

【前端】webpack一本通

今日更新完畢&#xff0c;不定期補充&#xff0c;建議關注收藏點贊。 目錄 簡介Loader和Plugin的不同&#xff1f;&#xff08;必會&#xff09; 使用webpack默認只能處理js文件 ->引入加載器對JS語法降級&#xff0c;兼容低版本語法合并文件再次打包進階 工作原理Webpack 的…

leetcode 264. Ugly Number II

動態規劃解決。 關鍵是理解如何生成新的丑數。這道題和經典的斐波那契數列問題其實是一樣的。求第n個數&#xff0c;需要用第n個數前面的數來求。不同的是&#xff0c;斐波那契數列不會重復。而本題的丑數&#xff0c;會重復出現。 class Solution { public:int nthUglyNumbe…

深入理解 HTML5 語義元素:提升網頁結構與可訪問性

引言 在構建網頁的過程中&#xff0c;合理的結構與清晰的語義對于網頁的質量、可維護性以及搜索引擎優化&#xff08;SEO&#xff09;都至關重要。HTML5 引入了一系列語義元素&#xff0c;為開發者提供了更精準描述網頁內容的工具。本文將深入探討 HTML5 語義元素的作用、使用…

PyCharm顯示主菜單和工具欄

顯示主菜單 新版 PyCharm 是不顯示主菜單的&#xff0c;要想顯示主菜單和工具欄&#xff0c;則通過 “視圖” → “外觀” &#xff0c;勾選 “在單獨的工具欄中顯示主菜單” 和 “工具欄” 即可。 設置工具欄 此時工具欄里并沒有什么工具&#xff0c;因此我們需要自定義工具…

CyclicBarrier 基本用法

CyclicBarrier 基本用法 簡介 CyclicBarrier 是 Java 并發包&#xff08;java.util.concurrent&#xff09;中的一個同步輔助類。它允許一組線程相互等待&#xff0c;直到到達某個公共屏障點&#xff08;common barrier point&#xff09;。只有當所有參與的線程都到達屏障點…

[特殊字符] 手機連接車機熱點并使用 `iperf3` 測試網絡性能

好的&#xff0c;以下是根據你的描述整理出來的步驟及解釋&#xff1a; &#x1f4f6; 手機連接車機熱點并使用 iperf3 測試網絡性能 本文將通過 iperf3 來測試手機和車機之間的網絡連接性能。我們會讓車機作為服務端&#xff0c;手機作為客戶端&#xff0c;進行 UDP 流量傳輸…

FPGA上實現SD卡連續多塊讀的命令

在FPGA上實現SD卡連續多塊讀的命令 CMD17命令一次只能讀取1個塊 CMD18命令一次可以連續讀取多個塊&#xff0c;直到停止命令CMD12 CMD18命令讀的塊數程序可任意設置 目錄 前言 一、SD卡多塊讀命令CMD18 二、停止讀命令CMD12 三、SD卡初始化SD卡連續塊讀操作的verilog代碼 …

DeepSeek 助力 Vue3 開發:打造絲滑的日歷(Calendar)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現

目錄 NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現一、引言二、NSGA-II 基本原理2.1 非支配排序2.2 擁擠距離2.3 算法流程三、數學模型與算法推導3.1 多目標優化問題描述3.2 非支配關系與排序3.3 擁擠距離計算四、NSGA-II 的優缺點4.1 優點4.2 缺點五、典型案例分析5.…

庫學習04——numpy

一、基本屬性 二、 創建數組 &#xff08;一&#xff09;arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一個參數n的話&#xff0c;默認是從0到n-1的一維數組。 &#xff08;二&#xff09;自定義reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …

NVIDIA Jetson 快速切換CUDA版本| 多CUDA版本

當NVIDIA Jetson中安裝了多個CUDA時&#xff0c;可以通過命令&#xff0c;快速切換不同版本的。 這樣在環境變量和代碼編譯時&#xff0c;能使用指定版本的CUDA了。 本文適用于Jetson Nano、TX1/TX2、Xavier 和 Orin系列的設備&#xff0c;供大家參考。 cuda參考地址&#xf…

當開源邂逅AI,公益長出翅膀 | 回顧3.30 上海「開源×AI 賦能公益」Meetup

在春和景明的三月&#xff0c;一場打破常規的公益聚會在上海剪愛公益發展中心肇清項目點溫暖上演。這&#xff0c;便是G-Star公益行帶來的「開源AI 賦能公益」Meetup&#xff0c;一場技術與善意交織、創新與溫暖共生的奇妙之旅。 活動現場&#xff0c;沒有高冷的技術壁壘&#…

高階函數/柯里化/純函數

本篇文章主要是介紹一下標題里面的概念&#xff0c;在面試的時候經常文檔&#xff0c;結合閱讀到的資料&#xff0c;結合本人的個人見解出品了該文章&#xff0c;如有寫的不好的地方或理解有誤的&#xff0c;還望閣下多多指教。 1、高階函數 什么是高階函數&#xff1f; 接受…

Docker+Jenkins+Gitee自動化項目部署

前置條件 docker安裝成功 按照下面配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://register.librax.org"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker一、…