Spring MVC 工作原理深度解析(含流程图+源码示例)

在这里插入图片描述

1. Spring MVC 概述

Spring MVC 是基于 Java模型-视图-控制器(MVC) 框架,用于构建灵活、松耦合的 Web 应用程序。它围绕 DispatcherServlet(前端控制器)设计,负责协调请求处理流程。

1.1 Spring MVC 核心组件

组件作用
DispatcherServlet前端控制器,接收所有 HTTP 请求并分发给合适的处理器
HandlerMapping确定哪个 Controller 处理当前请求
Controller处理业务逻辑,返回 ModelAndView
ModelAndView封装模型数据 + 视图名称
ViewResolver解析视图名称,返回实际的 View 对象
View渲染最终的响应(如 JSP、Thymeleaf)

2. Spring MVC 请求处理流程

Spring MVC 的请求处理流程可以分为 6 个关键步骤,下面结合 流程图代码示例 详细说明。

2.1 Spring MVC 请求处理流程图

Client DispatcherServlet HandlerMapping Controller ViewResolver View HTTP 请求 (GET /user/1) 查询 Handler 返回 HandlerExecutionChain 调用 Handler 方法 返回 ModelAndView 解析 View 返回 View 对象 渲染视图 返回 HTML 返回 HTTP 响应 Client DispatcherServlet HandlerMapping Controller ViewResolver View

2.2 详细步骤解析

  1. HTTP 请求到达 DispatcherServlet

    • 所有请求先由 DispatcherServlet 拦截(web.xmlServlet 3.0+ 配置)。
  2. HandlerMapping 查找合适的 Controller

    • DispatcherServlet 查询 HandlerMapping,确定哪个 Controller 能处理该请求。
    • 示例:@RequestMapping("/user/{id}") 匹配 /user/1
  3. 调用 Controller 方法

    • DispatcherServlet 调用匹配的 Controller 方法,并传入请求参数(如 @PathVariable@RequestParam)。
  4. Controller 返回 ModelAndView

    • Controller 处理业务逻辑,返回 ModelAndView(包含数据模型 + 视图名称)。
  5. ViewResolver 解析视图

    • DispatcherServlet 调用 ViewResolver 将逻辑视图名(如 "user")解析为实际视图(如 /WEB-INF/views/user.jsp)。
  6. View 渲染并返回响应

    • View 渲染 HTML,DispatcherServlet 返回最终的 HTTP 响应。

3. 代码示例:Spring MVC 实战

3.1 配置 DispatcherServlet(web.xml)

<web-app>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.2 定义 Controller

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ModelAndView getUser(@PathVariable Long id) {
        User user = userService.getUserById(id);
        ModelAndView mav = new ModelAndView("user");  // 视图名: "user"
        mav.addObject("user", user);  // 数据模型
        return mav;
    }
}

3.3 配置 ViewResolver(Spring XML 配置)

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>
  • 逻辑视图 "user" → 实际路径 /WEB-INF/views/user.jsp

4. Spring MVC 核心机制

4.1 注解驱动的 Controller

注解作用
@Controller标记类为 Spring MVC Controller
@RequestMapping映射 URL 到方法
@GetMapping / @PostMapping限定 HTTP 方法
@PathVariable获取 URL 路径变量
@RequestParam获取查询参数
@RequestBody解析 JSON/XML 请求体
@ResponseBody直接返回数据(非视图)

4.2 数据绑定 & 验证

@PostMapping("/register")
public String register(@Valid @ModelAttribute User user, BindingResult result) {
    if (result.hasErrors()) {
        return "register-form";  // 返回表单页显示错误
    }
    userService.save(user);
    return "redirect:/login";  // 重定向
}

4.3 异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ModelAndView handleUserNotFound(UserNotFoundException ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}

5. Spring MVC 高级特性

5.1 拦截器(Interceptor)

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!isUserLoggedIn(request)) {
            response.sendRedirect("/login");
            return false;  // 中断请求
        }
        return true;
    }
}

配置拦截器:

<mvc:interceptors>
    <bean class="com.example.AuthInterceptor" />
</mvc:interceptors>

5.2 文件上传

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        file.transferTo(new File("/uploads/" + file.getOriginalFilename()));
    }
    return "redirect:/success";
}

6. 总结

关键点说明
核心组件DispatcherServletHandlerMappingViewResolver
请求流程请求 → DispatcherServlet → Controller → 视图渲染
注解驱动@Controller@RequestMapping@ResponseBody
数据绑定@ModelAttribute@Valid + BindingResult
拦截器实现 HandlerInterceptor 进行权限控制
文件上传MultipartFile 处理

Spring MVC 通过 DispatcherServlet 统一调度,结合注解驱动开发,使得 Web 层开发更加灵活高效! 🚀
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰alk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值