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
(后续内容持续补充具体配置示例、性能优化建议、安全注意事项等深入技术细节...)
正文到此结束
相关文章
热门推荐
评论插件初始化中...