【JAVA】Spring MVC 详解

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 应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值