Spring全家桶笔记九:Web层与RESTful

Spring全家桶笔记九:Web层与RESTful

Spring MVC概述

Spring MVC是Spring框架的Web层模块,基于Servlet API构建,实现了MVC设计模式。

请求处理流程

  1. 请求 → DispatcherServlet
  2. HandlerMapping查找处理器
  3. HandlerAdapter执行处理器
  4. Controller处理业务逻辑
  5. ViewResolver解析视图
  6. 渲染视图 → 响应

核心组件

DispatcherServlet

前端控制器,统一处理请求和响应。

1
2
3
4
5
6
7
8
9
10
// web.xml配置
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

@Controller vs @RestController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 返回视图
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String getUser(Model model) {
model.addAttribute("user", userService.findById(id));
return "userDetail";
}
}

// 返回JSON
@RestController
public class UserController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}

请求参数绑定

路径参数

1
2
3
4
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}

请求参数

1
2
3
4
5
6
7
8
@GetMapping("/user/list")
public List<User> list(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String name
) {
return userService.list(page, size, name);
}

请求体

1
2
3
4
@PostMapping("/user")
public User create(@RequestBody User user) {
return userService.save(user);
}

表单提交

1
2
3
4
5
6
7
8
@PostMapping("/user/save")
public String save(@ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "userForm";
}
userService.save(user);
return "redirect:/user/list";
}

RESTful API设计

规范

方法 用途 示例
GET 查询 GET /users
POST 创建 POST /users
PUT 更新 PUT /users/1
DELETE 删除 DELETE /users/1

响应结构

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ApiResponse<T> {
private int code;
private String message;
private T data;

public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(200, "success", data);
}

public static <T> ApiResponse<T> error(String message) {
return new ApiResponse<>(500, message, null);
}
}

统一异常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(BusinessException.class)
public ApiResponse<Void> handleBusinessException(BusinessException e) {
return ApiResponse.error(e.getMessage());
}

@ExceptionHandler(Exception.class)
public ApiResponse<Void> handleException(Exception e) {
return ApiResponse.error("系统错误");
}
}

文件上传

1
2
3
4
5
6
7
8
9
@PostMapping("/upload")
public ApiResponse<String> upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ApiResponse.error("文件为空");
}
String filename = file.getOriginalFilename();
// 保存文件
return ApiResponse.success(filename);
}

跨域处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@CrossOrigin(origins = "*")
@RestController
public class UserController {}

// 或全局配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
}

拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
public class AuthInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("Authorization");
if (token == null) {
response.setStatus(401);
return false;
}
return true;
}
}

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**");
}
}

总结

Spring MVC提供了强大的Web开发能力,RESTful风格的API设计已成为现代Web服务的主流选择。掌握请求参数绑定、异常处理、拦截器等核心功能是开发高效Web应用的基础。