Spring MVC 介绍与实践

Spring MVC 是一个基于 Java 的轻量级 Web 框架,是 Spring Framework 中用于构建 Web 应用程序的核心模块之一。它遵循了传统的 MVC(Model-View-Controller)设计模式,旨在将应用程序的业务逻辑与用户界面分离,从而提高代码的可维护性和可扩展性。本文将详细介绍 Spring MVC 的基本概念、工作原理及其应用实践。

1. Spring MVC 简介

Spring MVC 是一个请求驱动的 Web 框架,它在 Spring Framework 中起着至关重要的作用。Spring MVC 提供了一种通过 DispatcherServlet 处理 HTTP 请求的机制,并根据不同的请求映射到相应的控制器方法上,返回对应的视图或数据。

Spring MVC 主要由以下组件组成:

  • DispatcherServlet:前端控制器,接收所有请求并根据配置分发到相应的处理器。
  • HandlerMapping:根据请求的 URL 查找并映射到相应的处理器(Controller)。
  • Controller:业务逻辑处理器,负责接收用户请求,处理业务逻辑,并返回一个 ModelAndView 对象。
  • ModelAndView:封装了模型数据和视图信息,决定响应内容。
  • ViewResolver:将 ModelAndView 中的视图名解析成实际的视图对象(如 JSP、Thymeleaf 等)。
  • HandlerInterceptor:用于在请求处理的不同阶段进行拦截,适合进行日志记录、权限验证等功能。

2. Spring MVC 工作原理

Spring MVC 的工作流程通常可以分为以下几个步骤:

  1. 请求到达 DispatcherServlet :所有的 HTTP 请求都会首先通过前端控制器 DispatcherServlet,该控制器会根据请求的 URL 分发请求到相应的处理器方法(即 Controller)。

  2. 请求映射DispatcherServlet 会通过 HandlerMapping 查找合适的处理器(Controller)方法。

  3. 业务逻辑处理 :一旦找到合适的 Controller,Spring MVC 会调用该方法,执行相关的业务逻辑,并将模型数据封装到 ModelAndView 对象中。

  4. 视图解析 :控制器返回的 ModelAndView 对象会交由 ViewResolver 解析,找到实际的视图。

  5. 视图渲染:最后,视图被渲染为 HTML 页面返回给客户端,完成整个请求的处理过程。

3. Spring MVC 核心组件详解

3.1 DispatcherServlet

DispatcherServlet 是 Spring MVC 的核心组件,它是前端控制器,所有的请求都必须经过它。它负责将请求委派给合适的处理器(Controller),并最终将响应渲染到客户端。

在 web.xml 配置文件中,我们需要定义 DispatcherServlet

复制代码
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3.2 HandlerMapping

HandlerMapping 是 Spring MVC 中负责根据请求的 URL 查找并映射到相应的控制器(Controller)的方法。Spring MVC 提供了多种 HandlerMapping 实现,常用的有:

  • AnnotationMethodHandlerMapping :根据注解(如 @RequestMapping)来查找方法。
  • SimpleUrlHandlerMapping:基于 URL 的映射。

3.3 Controller

Controller 是 Spring MVC 中的核心组件,负责接收请求、处理业务逻辑并返回视图。通常,Controller 会通过 @RequestMapping 注解来映射请求路径。

复制代码
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello";  // 返回视图名
    }
}

3.4 ModelAndView

ModelAndView 是 Spring MVC 用来封装模型数据和视图信息的对象。它可以将模型数据(例如一个 JavaBean)和视图(如 JSP 或 Thymeleaf)绑定在一起。

复制代码
@RequestMapping("/hello")
public ModelAndView sayHello() {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello, Spring MVC!");
    return modelAndView;
}

3.5 ViewResolver

ViewResolver 负责将 ModelAndView 中的视图名称解析成实际的视图对象。Spring MVC 提供了多种视图解析器实现,常见的有:

  • InternalResourceViewResolver:用于解析 JSP 视图。

  • ThymeleafViewResolver:用于解析 Thymeleaf 视图。

3.6 HandlerInterceptor

HandlerInterceptor 用于在请求处理的不同阶段进行拦截,常用于进行权限验证、日志记录、性能监控等操作。拦截器可以在请求处理前后分别执行方法,拦截器是基于代理设计模式的。

复制代码
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 处理请求之前
        return true;  // 如果返回 false,后续的处理器方法将不会执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理后,视图渲染前
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后
    }
}

4. Spring MVC 配置示例

一个基本的 Spring MVC 配置通常包括以下几个步骤:

  1. web.xml 配置 DispatcherServlet

    dispatcher org.springframework.web.servlet.DispatcherServlet 1 dispatcher /
  2. Spring 配置文件(applicationContext.xml)

    复制代码
     <!-- 配置视图解析器 -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/views/" />
         <property name="suffix" value=".jsp" />
     </bean>
    
     <!-- 配置 Controller -->
     <bean name="/hello" class="com.example.HelloController" />

5. 总结

Spring MVC 是一个功能强大的 Web 框架,它基于 MVC 模式,有助于分离业务逻辑和视图层,从而提高代码的可维护性和可扩展性。通过 DispatcherServlet、HandlerMapping、Controller、ModelAndView 等组件,Spring MVC 提供了高效的请求处理和视图渲染机制。

在现代 Web 应用程序中,Spring MVC 仍然是一个非常流行且强大的框架,适合构建各种规模的企业级应用程序。通过结合 Spring 的其他模块(如 Spring Boot 和 Spring Data JPA),你可以构建出高效、可扩展且易于维护的应用程序。

相关推荐
逍遥德16 分钟前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD20 分钟前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_5231853223 分钟前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海24 分钟前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran26 分钟前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄39 分钟前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记43 分钟前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
凡人叶枫1 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯1 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
NE_STOP2 小时前
Raft算法处理细节
java