目錄
第一部分: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生命周期:
-
初始化階段:容器調用
init()
方法 -
服務階段:針對每個請求調用
service()
方法(內部路由到doGet/doPost等) -
銷毀階段:容器調用
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 |
請求體 | @RequestBody | JSON/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. 會話管理方案對比
方案對比表:
方案 | 實現方式 | 優點 | 缺點 |
---|---|---|---|
Session | HttpSession | 服務端狀態,安全性較好 | 集群環境需要同步 |
Cookie | 瀏覽器存儲 | 簡單易用 | 大小限制,安全性低 |
Token | JWT等機制 | 無狀態,適合分布式 | 需要處理令牌過期 |
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的現代化開發模式,涵蓋了從基礎概念到高級特性的完整知識體系。在實際開發中,建議根據項目需求選擇合適的架構方案和技術組合,平衡開發效率與系統性能。