Spring全家桶笔记九:Web层与RESTful
Spring MVC概述
Spring MVC是Spring框架的Web层模块,基于Servlet API构建,实现了MVC设计模式。
请求处理流程
- 请求 → DispatcherServlet
- HandlerMapping查找处理器
- HandlerAdapter执行处理器
- Controller处理业务逻辑
- ViewResolver解析视图
- 渲染视图 → 响应
核心组件
DispatcherServlet
前端控制器,统一处理请求和响应。
1 2 3 4 5 6 7 8 9 10
| <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"; } }
@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应用的基础。