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 视图。

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>

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

    <web-app> <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> </web-app>
  2. Spring 配置文件(applicationContext.xml)

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

     <!-- 配置视图解析器 -->
     <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" />
    
    </beans>

5. 总结

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

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

相关推荐
m0_7482409123 分钟前
开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)
java
Java中文社群1 小时前
1分钟学会DeepSeek本地部署,小白也能搞定!
java·后端·程序员
C_V_Better1 小时前
SpringCloud Gateway 动态路由配置全解
java·开发语言·spring cloud·gateway
CodeClimb1 小时前
【华为OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
烛.照1031 小时前
使用java代码操作rabbitMQ收发消息
java·linux·rabbitmq
m0_748238631 小时前
15.<Spring Boot 日志>
java·spring boot·后端
drebander2 小时前
Maven 构建生命周期与阶段详解
java·maven
web130933203982 小时前
JAVA面试之容器
java·开发语言·面试
扫地僧0092 小时前
第18章 不可变对象设计模式(Java高并发编程详解:多线程与系统设计)
java·python·设计模式
洛嘚3 小时前
多数据源配置及使用,在同一个方法下切换数据源。
java·服务器·数据库