目录
[1. HTTP协议核心知识](#1. HTTP协议核心知识)
[2. Servlet核心机制](#2. Servlet核心机制)
[第二部分:Spring Boot Web深度整合](#第二部分:Spring Boot Web深度整合)
[1. Spring Boot Web架构](#1. Spring Boot Web架构)
[2. 创建Spring Boot Web应用](#2. 创建Spring Boot Web应用)
[3. 控制器开发实践](#3. 控制器开发实践)
[4. 请求与响应处理](#4. 请求与响应处理)
[1. 会话管理方案对比](#1. 会话管理方案对比)
[2. 异常处理统一方案](#2. 异常处理统一方案)
[3. 性能优化策略](#3. 性能优化策略)
[1. 安全防护基础](#1. 安全防护基础)
[2. 部署方案对比](#2. 部署方案对比)
[1. 响应式Web开发](#1. 响应式Web开发)
[2. 微服务架构整合](#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控制器示例:
java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public 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());
}
@PostMapping
public 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等 |
响应处理技术:
java
// 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实现示例:
java
// 生成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 {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) {
// 验证逻辑
}
}
2. 异常处理统一方案
全局异常处理:
java
@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. 性能优化策略
缓存配置示例:
java
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public 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) {
// 更新操作
}
}
异步处理示例:
java
@RestController
public class AsyncController {
@GetMapping("/async")
public CompletableFuture<String> asyncTask() {
return CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try { Thread.sleep(2000); }
catch (InterruptedException e) { /* 处理异常 */ }
return "异步任务完成";
});
}
}
第四部分:安全与部署
1. 安全防护基础
Spring Security配置:
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected 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等云环境 | 弹性伸缩,高可用 |
生产环境配置建议:
java
# application-prod.yml
server:
port: 8080
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
min-response-size: 1024
error:
whitelabel:
enabled: false
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
第五部分:现代化演进
1. 响应式Web开发
WebFlux基础示例:
java
@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文档集成:
java
@Configuration
public class OpenApiConfig {
@Bean
public 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的现代化开发模式,涵盖了从基础概念到高级特性的完整知识体系。在实际开发中,建议根据项目需求选择合适的架构方案和技术组合,平衡开发效率与系统性能。