Spring MVC 基本概念
1. Spring MVC 概述
Spring MVC 是 Spring 框架中的一个模块,专注于为 Web 应用程序提供 Model-View-Controller (MVC) 架构。它帮助开发者构建可扩展、可维护的 Web 应用,并且能够轻松集成到 Spring 生态系统中。
2. DispatcherServlet
DispatcherServlet 是 Spring MVC 的核心组件,负责接收 HTTP 请求,并将请求分发给相应的处理器(Controller)。它起到了中央控制器的作用。
示例:
@Configuration
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
在这个例子中,DispatcherServlet 被注册到 ServletContext 中,并映射到根路径。
3. Controller
Controller 是 Spring MVC 中的一个组件,负责处理用户请求,并返回一个 ModelAndView 对象。它将用户的输入与应用程序的业务逻辑连接起来。
示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HomeController {
@GetMapping("/")
public ModelAndView home() {
ModelAndView mav = new ModelAndView("home");
mav.addObject("message", "Welcome to Spring MVC");
return mav;
}
}
在这个例子中,HomeController 处理根路径的 GET 请求,并返回一个包含消息的视图。
4. ModelAndView
ModelAndView 是 Spring MVC 中的一个类,包含了视图名称和模型数据。它将控制器的处理结果传递给视图层。
示例:
ModelAndView mav = new ModelAndView("home");
mav.addObject("message", "Welcome to Spring MVC");
在这个例子中,ModelAndView 对象包含视图名称 “home” 和模型数据 “message”。
5. @RequestMapping
@RequestMapping 是 Spring MVC 中的一个注解,用于映射 HTTP 请求到控制器的方法。它支持多种 HTTP 方法(GET、POST 等),还可以指定路径和参数。
示例:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
}
这个例子展示了如何使用 @RequestMapping 将根路径的 GET 请求映射到 home() 方法。
6. @GetMapping 和 @PostMapping
@GetMapping 和 @PostMapping 是 @RequestMapping 的快捷方式,分别用于处理 GET 和 POST 请求。
示例:
@GetMapping("/hello")
public String hello() {
return "hello";
}
@PostMapping("/submit")
public String submit() {
return "submit";
}
在这个例子中,@GetMapping 处理 GET 请求,@PostMapping 处理 POST 请求。
7. @PathVariable
@PathVariable 注解用于将 URL 路径中的变量绑定到方法参数上。
示例:
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") String userId) {
return "User ID: " + userId;
}
在这个例子中,@PathVariable(“id”) 将 URL 中的 {id} 绑定到方法参数 userId。
8. @RequestParam
@RequestParam 注解用于将查询参数绑定到方法参数上。
示例:
@GetMapping("/search")
public String search(@RequestParam("q") String query) {
return "Search query: " + query;
}
在这个例子中,@RequestParam(“q”) 将查询参数 q 绑定到方法参数 query。
9. @ModelAttribute
@ModelAttribute 注解用于将请求中的数据绑定到模型对象上,通常用于表单处理。
示例:
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {
return "Form submitted for user: " + user.getName();
}
在这个例子中,@ModelAttribute 将请求中的表单数据绑定到 User 对象上。
10. 视图解析器(View Resolver)
视图解析器负责将逻辑视图名称解析为物理视图路径。Spring MVC 提供了多种视图解析器,如 InternalResourceViewResolver 和 ThymeleafViewResolver。
示例:
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
在这个例子中,InternalResourceViewResolver 将视图名称解析为 JSP 文件路径。
11. 表单处理
Spring MVC 提供了对表单处理的全面支持,包括表单绑定、验证和表单回显。
示例:
import javax.validation.Valid;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@PostMapping("/register")
public String register(@Valid @ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "register";
}
return "success";
}
在这个例子中,@Valid 注解用于验证 User 对象,BindingResult 用于处理验证结果。
12. 数据验证(Validation)
Spring MVC 支持基于 JSR-303 的数据验证,可以使用注解对模型对象进行验证。
示例:
import javax.validation.constraints.NotEmpty;
public class User {
@NotEmpty(message = "Name is required")
private String name;
// getter 和 setter 方法
}
在这个例子中,@NotEmpty 注解用于验证 name 字段不能为空。
13. 消息转换器(Message Converters)
消息转换器负责将请求数据转换为对象,以及将对象转换为响应数据。Spring MVC 提供了多种内置的消息转换器,如 JSON 和 XML。
示例:
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
@PostMapping("/user")
@ResponseBody
public User createUser(@RequestBody User user) {
// 处理用户数据
return user;
}
在这个例子中,@RequestBody 和 @ResponseBody 注解用于将 JSON 请求数据转换为 User 对象,并将 User 对象转换为 JSON 响应数据。
14. 拦截器(Interceptor)
拦截器用于在请求处理之前或之后执行额外的逻辑。它们类似于过滤器,但更强大,可以访问 Spring MVC 上下文。
示例:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 执行前置逻辑
return true;
}
}
在这个例子中,MyInterceptor 实现了 HandlerInterceptor 接口,可以在请求处理之前执行逻辑。
15. 异常处理(Exception Handling)
Spring MVC 提供了多种异常处理机制,包括 @ExceptionHandler、@ControllerAdvice 和 ResponseEntityExceptionHandler。
示例:
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return "An error occurred: " + e.getMessage();
}
}
在这个例子中,@ExceptionHandler 注解用于处理控制器中的异常,@RestControllerAdvice 注解用于全局异常处理。
16. 文件上传
Spring MVC 支持文件上传功能,可以处理 Multipart 文件上传请求。
示例:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
// 处理文件
return "File uploaded successfully";
}
return "File upload failed";
}
在这个例子中,@RequestParam 注解用于将上传的文件绑定到 MultipartFile 对象上。
17.RestController
@RestController 是 @Controller 和 @ResponseBody 的组合注解,通常用于构建 RESTful Web 服务。
示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String hello() {
return "Hello, RESTful world!";
}
}
在这个例子中,@RestController 注解用于构建一个 RESTful API。
18. 国际化(Internationalization, i18n)
Spring MVC 提供了对国际化的全面支持,允许根据用户的区域设置提供不同的语言和格式。
示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
在这个例子中,ResourceBundleMessageSource 用于加载国际化资源文件。
19. Spring MVC 与 Thymeleaf 集成
Thymeleaf 是一种流行的模板引擎,可以与 Spring MVC 集成,用于生成动态的 HTML 页面。
示例:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ThymeleafController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("message", "Hello, Thymeleaf!");
return "greeting";
}
}
在这个例子中,ThymeleafController 处理 /greeting 请求,并返回一个包含消息的 Thymeleaf 模板视图。
20. WebSocket 支持
Spring MVC 提供了对 WebSocket 的支持,允许在 Web 应用程序中实现实时双向通信。
示例:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/ws");
}
}
在这个例子中,WebSocketConfig 配置了一个 WebSocket 处理器,用于处理 /ws 路径的 WebSocket 连接。
总结
Spring MVC 是一个功能强大的框架,提供了广泛的工具和特性来构建现代 Web 应用程序。通过理解和掌握上述每一个知识点,开发者可以更高效地构建出可扩展、维护性强的 Web 应用。