目录
第一部分: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的现代化开发模式,涵盖了从基础概念到高级特性的完整知识体系。在实际开发中,建议根据项目需求选择合适的架构方案和技术组合,平衡开发效率与系统性能。