SpringMVC全方位HTTP响应处理指南

SpringMVC处理HTTP响应的核心流程

(简要说明DispatcherServlet如何将Controller返回值转换为HTTP响应)

一、返回完整HTML页面

1.1 传统视图解析模式

@Controller
public class PageController {
    @GetMapping("/home")
    public String homePage(Model model) {
        model.addAttribute("welcomeMsg", "欢迎访问首页");
        return "home"; // 对应/WEB-INF/views/home.jsp
    }
}

1.2 视图解析器配置详解

<!-- 配置InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
    <property name="viewClass" 
        value="org.springframework.web.servlet.view.JstlView"/>
</bean>

1.3 ModelAndView高级用法

@GetMapping("/user/profile")
public ModelAndView userProfile() {
    ModelAndView mav = new ModelAndView();
    mav.addObject("user", userService.getCurrentUser());
    mav.setViewName("profile");
    return mav;
}

二、返回HTML片段

2.1 动态内容片段处理

@RestController
public class FragmentController {
    @GetMapping("/time")
    public String showTime() {
        return "<div id=\"time\">当前时间:" + new Date() + "</div>";
    }
}

2.2 Thymeleaf模板片段示例

<!-- fragments.html -->
<div th:fragment="header">
    <h1>系统导航栏</h1>
    <!-- 动态内容 -->
</div>
@GetMapping("/header")
public String getHeader() {
    return "fragments :: header";
}

三、返回JSON数据

3.1 基础JSON序列化配置

<!-- Jackson依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

3.2 复杂对象序列化示例

@GetMapping("/api/users")
public List<User> getAllUsers() {
    return userService.listUsers();
}

3.3 JSON定制化处理

// 自定义日期格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private Date createTime;

// 排除字段
@JsonIgnore
private String internalCode;

四、HTTP响应头控制

4.1 基础响应头设置

@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile() 
    throws IOException {
    
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDisposition(
        ContentDisposition.attachment()
            .filename("report.pdf")
            .build());
    
    return new ResponseEntity<>(fileData, headers, HttpStatus.OK);
}

4.2 缓存控制策略

@GetMapping("/static-data")
public ResponseEntity<String> getStaticData() {
    CacheControl cacheControl = CacheControl.maxAge(30, TimeUnit.MINUTES)
        .cachePublic();
    
    return ResponseEntity.ok()
        .cacheControl(cacheControl)
        .body(cachedData);
}

五、HTTP状态码管理

5.1 常用状态码应用场景

  • 200 OK:常规成功响应
  • 201 Created:资源创建成功
  • 204 No Content:成功但无返回内容
  • 400 Bad Request:客户端请求错误
  • 401 Unauthorized:未认证
  • 403 Forbidden:无访问权限
  • 404 Not Found:资源不存在
  • 500 Internal Server Error:服务器内部错误

5.2 自定义状态码返回

@GetMapping("/custom-status")
public ResponseEntity<String> customStatus() {
    return ResponseEntity.status(HttpStatus.I_AM_A_TEAPOT)
        .body("这个状态码是RFC 2324定义的彩蛋");
}

六、高级响应处理技巧

6.1 响应内容协商

@GetMapping(value = "/data", 
    produces = {
        MediaType.APPLICATION_JSON_VALUE,
        MediaType.APPLICATION_XML_VALUE
    })
public UserData getData() {
    return dataService.fetchData();
}

6.2 异常统一处理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleNotFound(
        ResourceNotFoundException ex) {
        
        ErrorResponse error = new ErrorResponse(
            "NOT_FOUND", 
            ex.getMessage());
            
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }
}

6.3 响应压缩配置

# application.properties
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/json
server.compression.min-response-size=1024

(后续内容持续补充具体配置示例、性能优化建议、安全注意事项等深入技术细节...)

正文到此结束
评论插件初始化中...
Loading...