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

打印 上一主题 下一主题

主题 1534|帖子 1534|积分 4602

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
第一部分: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 Continue2xx成功200 OK, 201 Created3xx重定向301 Moved Permanently4xx客户端错误400 Bad Request, 403 Forbidden5xx服务器错误500 Internal Server Error 2. Servlet核心机制

Servlet生命周期

  • 初始化阶段:容器调用init()方法
  • 服务阶段:针对每个请求调用service()方法(内部路由到doGet/doPost等)
  • 烧毁阶段:容器调用destroy()方法开释资源
Servlet处理流程
  1. 客户端请求 → Web服务器 → Servlet容器 → 创建Request/Response对象
  2. → 调用Servlet的service()方法 → 生成响应 → 返回客户端
复制代码
Servlet API核心接口
  1. // 传统Servlet配置示例(web.xml)
  2. <servlet>
  3.     <servlet-name>helloServlet</servlet-name>
  4.     <servlet-class>com.example.HelloServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7.     <servlet-name>helloServlet</servlet-name>
  8.     <url-pattern>/hello</url-pattern>
  9. </servlet-mapping>
  10. // 注解配置示例(Servlet 3.0+)
  11. @WebServlet(
  12.     name = "modernServlet",
  13.     urlPatterns = {"/api/*"},
  14.     initParams = @WebInitParam(name = "config", value = "value")
  15. )
  16. public class ModernServlet extends HttpServlet {
  17.     // 实现代码
  18. }
复制代码
第二部分:Spring Boot Web深度整合

1. Spring Boot Web架构

核心组件关系
  1. HTTP请求 → DispatcherServlet → HandlerMapping
  2. → Controller → 业务处理 → 返回ModelAndView
  3. → ViewResolver → 渲染视图 → HTTP响应
复制代码
与传统Servlet的关系


  • DispatcherServlet作为唯一的前端控制器
  • 内嵌Servlet容器(Tomcat/Jetty/Undertow)
  • 自动配置Spring MVC组件
2. 创建Spring Boot Web应用

项目初始化
  1. # 使用Spring Initializr创建项目
  2. curl https://start.spring.io/starter.zip \
  3.   -d dependencies=web \
  4.   -d javaVersion=11 \
  5.   -d packageName=com.example \
  6.   -d name=demo \
  7.   -o demo.zip
复制代码
基础项目布局
  1. src/
  2. ├── main/
  3. │   ├── java/
  4. │   │   └── com/example/demo/
  5. │   │       ├── DemoApplication.java       # 启动类
  6. │   │       ├── config/                   # 配置类
  7. │   │       ├── controller/               # 控制器
  8. │   │       ├── service/                  # 服务层
  9. │   │       └── repository/               # 数据访问层
  10. │   └── resources/
  11. │       ├── static/                       # 静态资源
  12. │       ├── templates/                    # 模板文件
  13. │       ├── application.properties        # 配置文件
  14. │       └── application.yml              # 替代配置
复制代码
3. 控制器开辟实践

RESTful控制器示例
  1. @RestController
  2. @RequestMapping("/api/users")
  3. public class UserController {
  4.     @Autowired
  5.     private UserService userService;
  6.     @GetMapping
  7.     public ResponseEntity<List<User>> getAllUsers() {
  8.         return ResponseEntity.ok(userService.findAll());
  9.     }
  10.     @GetMapping("/{id}")
  11.     public ResponseEntity<User> getUser(@PathVariable Long id) {
  12.         return userService.findById(id)
  13.                 .map(ResponseEntity::ok)
  14.                 .orElse(ResponseEntity.notFound().build());
  15.     }
  16.     @PostMapping
  17.     public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
  18.         User savedUser = userService.save(user);
  19.         URI location = ServletUriComponentsBuilder.fromCurrentRequest()
  20.                 .path("/{id}")
  21.                 .buildAndExpand(savedUser.getId())
  22.                 .toUri();
  23.         return ResponseEntity.created(location).body(savedUser);
  24.     }
  25.     @PutMapping("/{id}")
  26.     public ResponseEntity<User> updateUser(@PathVariable Long id,
  27.                                          @Valid @RequestBody User user) {
  28.         return ResponseEntity.ok(userService.update(id, user));
  29.     }
  30.     @DeleteMapping("/{id}")
  31.     public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
  32.         userService.delete(id);
  33.         return ResponseEntity.noContent().build();
  34.     }
  35. }
复制代码
4. 请求与响应处理

参数绑定方式对比
参数类型注解示例路径变量@PathVariable/users/{id}请求参数@RequestParam?name=value请求体@RequestBodyJSON/XML格式数据请求头@RequestHeader获取特定Header值Cookie值@CookieValue获取Cookie信息表单数据@ModelAttribute绑定表单对象Servlet原生对象直接声明HttpServletRequest等 响应处理技术
  1. // 1. 返回视图
  2. @Controller
  3. public class ViewController {
  4.     @GetMapping("/greet")
  5.     public String greet(Model model) {
  6.         model.addAttribute("message", "Hello World");
  7.         return "greetView"; // 对应templates/greetView.html
  8.     }
  9. }
  10. // 2. 返回JSON(RESTful)
  11. @RestController
  12. public class ApiController {
  13.     @GetMapping("/data")
  14.     public Map<String, Object> getData() {
  15.         return Map.of("status", "success", "code", 200);
  16.     }
  17. }
  18. // 3. 文件下载
  19. @GetMapping("/download")
  20. public ResponseEntity<Resource> downloadFile() {
  21.     InputStreamResource resource = new InputStreamResource(...);
  22.     return ResponseEntity.ok()
  23.             .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.txt")
  24.             .contentType(MediaType.APPLICATION_OCTET_STREAM)
  25.             .body(resource);
  26. }
复制代码
第三部分:高级特性与最佳实践

1. 会话管理方案对比

方案对比表
方案实现方式优点缺点SessionHttpSession服务端状态,安全性较好集群环境需要同步Cookie欣赏器存储简单易用大小限制,安全性低TokenJWT等机制无状态,适合分布式需要处理令牌过期Spring Session共同Redis等存储适合分布式系统增长架构复杂度 JWT实现示例
  1. // 生成Token
  2. public String generateToken(UserDetails userDetails) {
  3.     Map<String, Object> claims = new HashMap<>();
  4.     return Jwts.builder()
  5.             .setClaims(claims)
  6.             .setSubject(userDetails.getUsername())
  7.             .setIssuedAt(new Date(System.currentTimeMillis()))
  8.             .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
  9.             .signWith(SignatureAlgorithm.HS512, secret)
  10.             .compact();
  11. }
  12. // 验证Filter
  13. public class JwtAuthenticationFilter extends OncePerRequestFilter {
  14.     @Override
  15.     protected void doFilterInternal(HttpServletRequest request,
  16.                                   HttpServletResponse response,
  17.                                   FilterChain chain) {
  18.         // 验证逻辑
  19.     }
  20. }
复制代码
2. 非常处理统一方案

全局非常处理
  1. @RestControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(ResourceNotFoundException.class)
  4.     public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
  5.         ErrorResponse error = new ErrorResponse(
  6.             "NOT_FOUND",
  7.             ex.getMessage(),
  8.             System.currentTimeMillis());
  9.         return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
  10.     }
  11.     @ExceptionHandler(MethodArgumentNotValidException.class)
  12.     public ResponseEntity<ErrorResponse> handleValidation(MethodArgumentNotValidException ex) {
  13.         List<String> errors = ex.getBindingResult()
  14.                 .getFieldErrors()
  15.                 .stream()
  16.                 .map(FieldError::getDefaultMessage)
  17.                 .collect(Collectors.toList());
  18.         
  19.         ErrorResponse error = new ErrorResponse(
  20.             "VALIDATION_FAILED",
  21.             "字段验证失败",
  22.             System.currentTimeMillis(),
  23.             errors);
  24.         
  25.         return ResponseEntity.badRequest().body(error);
  26.     }
  27. }
复制代码
3. 性能优化策略

缓存配置示例
  1. @Configuration
  2. @EnableCaching
  3. public class CacheConfig {
  4.     @Bean
  5.     public CacheManager cacheManager() {
  6.         CaffeineCacheManager cacheManager = new CaffeineCacheManager();
  7.         cacheManager.setCaffeine(Caffeine.newBuilder()
  8.                 .initialCapacity(100)
  9.                 .maximumSize(1000)
  10.                 .expireAfterWrite(10, TimeUnit.MINUTES)
  11.                 .recordStats());
  12.         return cacheManager;
  13.     }
  14. }
  15. // 使用缓存
  16. @Service
  17. public class ProductService {
  18.    
  19.     @Cacheable(value = "products", key = "#id")
  20.     public Product getProductById(Long id) {
  21.         // 数据库查询
  22.     }
  23.    
  24.     @CacheEvict(value = "products", key = "#product.id")
  25.     public void updateProduct(Product product) {
  26.         // 更新操作
  27.     }
  28. }
复制代码
异步处理示例
  1. @RestController
  2. public class AsyncController {
  3.     @GetMapping("/async")
  4.     public CompletableFuture<String> asyncTask() {
  5.         return CompletableFuture.supplyAsync(() -> {
  6.             // 模拟耗时操作
  7.             try { Thread.sleep(2000); }
  8.             catch (InterruptedException e) { /* 处理异常 */ }
  9.             return "异步任务完成";
  10.         });
  11.     }
  12. }
复制代码
第四部分:安全与摆设

1. 安全防护基础

Spring Security配置
  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4.     @Override
  5.     protected void configure(HttpSecurity http) throws Exception {
  6.         http
  7.             .authorizeRequests()
  8.                 .antMatchers("/public/**").permitAll()
  9.                 .antMatchers("/admin/**").hasRole("ADMIN")
  10.                 .anyRequest().authenticated()
  11.             .and()
  12.             .formLogin()
  13.                 .loginPage("/login")
  14.                 .permitAll()
  15.             .and()
  16.             .logout()
  17.                 .logoutSuccessUrl("/")
  18.             .and()
  19.             .rememberMe()
  20.             .and()
  21.             .csrf().disable(); // 根据实际情况决定是否禁用
  22.     }
  23. }
复制代码
2. 摆设方案对比

摆设方式对比
摆设方式适用场景特点内嵌容器开辟/小型生产环境简单快捷,无需额外容器WAR包摆设传统Java EE环境需要外部Servlet容器Docker容器化云原生环境环境同等,便于扩展云平台原生摆设Kubernetes等云环境弹性伸缩,高可用 生产环境配置建议
  1. # application-prod.yml
  2. server:
  3.   port: 8080
  4.   compression:
  5.     enabled: true
  6.     mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
  7.     min-response-size: 1024
  8.   error:
  9.     whitelabel:
  10.       enabled: false
  11. management:
  12.   endpoints:
  13.     web:
  14.       exposure:
  15.         include: health,info,metrics
  16.   endpoint:
  17.     health:
  18.       show-details: always
复制代码
第五部分:现代化演进

1. 响应式Web开辟

WebFlux基础示例
  1. @RestController
  2. @RequestMapping("/reactive")
  3. public class ReactiveController {
  4.     @GetMapping("/flux")
  5.     public Flux<String> getFlux() {
  6.         return Flux.just("Item1", "Item2", "Item3")
  7.                 .delayElements(Duration.ofSeconds(1));
  8.     }
  9.     @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  10.     public Flux<ServerSentEvent<String>> getStream() {
  11.         return Flux.interval(Duration.ofSeconds(1))
  12.                 .map(sequence -> ServerSentEvent.<String>builder()
  13.                         .id(String.valueOf(sequence))
  14.                         .event("periodic-event")
  15.                         .data("SSE - " + LocalTime.now().toString())
  16.                         .build());
  17.     }
  18. }
复制代码
2. 微服务架构整合

OpenAPI文档集成
  1. @Configuration
  2. public class OpenApiConfig {
  3.     @Bean
  4.     public OpenAPI customOpenAPI() {
  5.         return new OpenAPI()
  6.                 .info(new Info()
  7.                         .title("电商平台API")
  8.                         .version("1.0")
  9.                         .description("基于Spring Boot的电商平台接口文档")
  10.                         .license(new License().name("Apache 2.0")))
  11.                 .externalDocs(new ExternalDocumentation()
  12.                         .description("项目Wiki")
  13.                         .url("https://github.com/example/wiki"));
  14.     }
  15. }
  16. // 控制器注解示例
  17. @Operation(summary = "获取用户详情", description = "根据ID返回用户完整信息")
  18. @ApiResponses(value = {
  19.     @ApiResponse(responseCode = "200", description = "成功获取用户"),
  20.     @ApiResponse(responseCode = "404", description = "用户不存在")
  21. })
  22. @GetMapping("/{id}")
  23. public ResponseEntity<User> getUser(@Parameter(description = "用户ID") @PathVariable Long id) {
  24.     // 实现代码
  25. }
复制代码
本整合指南从传统的Servlet基础出发,逐步深入到Spring Boot Web的现代化开辟模式,涵盖了从基础概念到高级特性的完整知识体系。在实际开辟中,建议根据项目需求选择合适的架构方案和技术组合,平衡开辟效率与系统性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表