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),你可以构建出高效、可扩展且易于维护的应用程序。

相关推荐
WeiLai11121 小时前
面试基础--Redis 缓存穿透、缓存击穿、缓存雪崩深度解析
java·redis·分布式·后端·缓存·面试·架构
zctel1 小时前
java中小型公司面试预习资料(二):Redis
java·redis·面试
爱吃烤鸡翅的酸菜鱼2 小时前
Java【网络原理】(3)网络编程续
java·运维·服务器·网络
╰つ゛木槿5 小时前
Spring Boot 调用DeepSeek API的详细教程
java·spring boot·后端·deepseek
hhw1991126 小时前
c#面试题整理6
java·开发语言·c#
程序视点7 小时前
SpringBoot配置入门
java·spring boot·spring
Benaso8 小时前
Java,Golang,Rust 泛型的大体对比小记
java·golang·rust
程序员清风8 小时前
什么时候会考虑用联合索引?如果只有一个条件查就没有建联合索引的必要了么?
java·后端·面试
Seven978 小时前
【设计模式】掌握建造者模式:如何优雅地解决复杂对象创建难题?
java·后端·设计模式
自在如风。8 小时前
MyBatis-Plus 使用技巧
java·mybatis·mybatis-plus