Spring MVC 响应机制的核心方式
返回视图(页面渲染)
通过返回视图名称(如 return "home"),配合视图解析器(InternalResourceViewResolver)定位到 /WEB-INF/views/home.jsp 等具体页面。需在配置中定义视图前缀和后缀:
java
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
返回纯文本或HTML
使用 @ResponseBody 注解直接返回字符串内容,适用于简单文本或HTML片段:
java
@GetMapping("/text")
@ResponseBody
public String rawText() {
return "<h1>Hello World</h1>";
}
JSON 响应处理
自动序列化对象为JSON
结合 @RestController 或 @ResponseBody,Spring 默认使用 Jackson 将对象序列化为 JSON:
java
@GetMapping("/user")
public User getUser() {
return new User("Alice", 25);
}
需添加 Jackson 依赖(如 spring-boot-starter-json)。
定制JSON字段
通过 @JsonIgnore 忽略字段,@JsonProperty 重命名字段:
java
public class User {
@JsonProperty("username")
private String name;
@JsonIgnore
private String password;
}
响应头与状态码控制
手动设置状态码
使用 ResponseEntity 自定义状态码和响应头:
java
@GetMapping("/custom")
public ResponseEntity<String> customResponse() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Custom-Header", "value");
return new ResponseEntity<>("Custom Body", headers, HttpStatus.CREATED);
}
重定向与转发
通过 redirect: 前缀实现重定向,或返回 ModelAndView 进行转发:
java
@GetMapping("/redirect")
public String redirect() {
return "redirect:/new-url";
}
全局响应配置
统一响应格式
使用 @ControllerAdvice 定义全局响应封装:
java
@ControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
return new ResponseWrapper<>(200, "success", body);
}
}
CORS 跨域配置
在配置类中全局启用 CORS:
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST");
}
}
异常处理与错误响应
统一异常处理
通过 @ExceptionHandler 捕获异常并返回结构化错误信息:
java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
ErrorResponse error = new ErrorResponse(500, ex.getMessage());
return ResponseEntity.status(500).body(error);
}
}
自定义错误页面
配置 ErrorViewResolver 或定义 /error 映射:
java
@Controller
public class ErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");
return status == 404 ? "error-404" : "error-general";
}
}