Spring MVC 全面解析

news/2025/3/16 3:48:32/

img

Spring MVC 是 Spring 框架中的一个模块,它基于 MVC(Model-View-Controller)设计模式,旨在帮助开发者构建灵活、松耦合的 Web 应用。主要目的是简化传统 Servlet+JSP 模式下的 Web 开发方式。下面将从工作流程、核心组件、代码示例三个方面进行详细解析。

​ 其次, Spring MVC 的整体架构设计对 Java Web 里面的 MVC 架构模式做了增强和扩展,主要有几

个方面。

  1. 把传统 MVC 框架里面的 Controller 控制器做了拆分,分成了前端控制器 DispatcherServlet 和后

端控制器 Controller。

  1. 把 Model 模型拆分成业务层 Service 和数据访问层 Repository。

  2. 在视图层,可以支持不同的视图,比如 Freemark、velocity、JSP 等等

一、Spring MVC 的核心组件

  1. DispatcherServlet
    所有请求首先进入 DispatcherServlet,它作为前端控制器,负责协调整个请求处理流程。
  2. HandlerMapping
    DispatcherServlet 根据请求 URL 通过 HandlerMapping 寻找对应的处理器(Controller)。
  3. Controller
    控制器负责处理具体业务逻辑,并返回一个 ModelAndView 对象,包含业务数据(Model)和逻辑视图名称(View)。
  4. ViewResolver
    根据逻辑视图名称,通过 ViewResolver 找到具体的视图模板(例如 JSP、Thymeleaf 等)。
  5. View
    最终视图负责将 Model 数据渲染成 HTML 等格式,返回给客户端。

如图,我们来看一下工作流程:

image-20250310194934718

二、Spring MVC 的工作流程

整个请求-响应流程可以概括如下:

  1. 请求进入
    用户发送 HTTP 请求,首先到达 DispatcherServlet
  2. 处理器映射
    DispatcherServlet 调用 HandlerMapping 根据请求信息查找对应的 Controller。
  3. 调用 Controller
    找到 Controller 后,调用对应的方法执行业务逻辑,并返回 ModelAndView
  4. 视图解析
    DispatcherServletModelAndView 中的逻辑视图名称传递给 ViewResolver,解析出具体视图。
  5. 渲染视图
    具体视图使用 Model 数据进行渲染,生成最终的响应内容返回给用户。

三、实战代码示例

下面是一个简单的 Spring MVC 示例代码,展示如何定义 Controller 以及如何返回 ModelAndView。

1.Controller 示例

java">import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/hello")
public class HelloController {// 处理 GET 请求 http://yourdomain/hello@RequestMapping(method = RequestMethod.GET)public ModelAndView sayHello() {ModelAndView mv = new ModelAndView("helloView"); // 逻辑视图名称mv.addObject("message", "Hello Spring MVC!");return mv;}
}

2. Spring 配置(基于 XML)

如果你使用 XML 配置,可以这样配置 DispatcherServlet 和视图解析器:

<!-- web.xml 中配置 DispatcherServlet -->
<servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping><!-- spring-servlet.xml 配置 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 启用注解驱动 --><mvc:annotation-driven /><!-- 扫描 Controller 包 --><context:component-scan base-package="com.example.controller" /><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>
</beans>

3. JSP 视图示例(helloView.jsp)

/WEB-INF/views/helloView.jsp 文件中,可以这样写:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Hello Spring MVC</title>
</head>
<body><h1>${message}</h1>
</body>
</html>

4.关键注解说明

image-20250310195508788

四、总结

  • 核心流程:请求经过 DispatcherServlet -> HandlerMapping -> Controller -> ViewResolver -> View,每一步都发挥着关键作用。
    YSO-1741608287752)]


http://www.ppmy.cn/news/1579478.html

相关文章

【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)

我用夸克网盘分享了「DeepSeek完整资料合集」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/621259e4af15 近日&#xff0c;清华大学发布了《…

Java中char取值范围

在 Java 中&#xff0c;char 的取值范围是 0 到 65,535&#xff08;即 \u0000 到 \uffff&#xff09;&#xff0c;这两个描述是等价的&#xff0c;只是表示方式不同。下面deepseek详细解释&#xff1a; 1. char 的基本特性 位数&#xff1a;16 位&#xff08;2 字节&#xff0…

docker镜像发布的应用程序,其配置https的流程

1、docker启动命令&#xff1a;将443端口映射出来&#xff0c;其中注意 /root/app/nginx/ai-ssl&#xff08;证书存放路径&#xff09;、/data/app/ai-nginx/nginx.conf(nginx的配置路径) docker run -d --restartalways -p 12324:80 -p 8443:443 -v /root/app/nginx/ai-ssl:/e…

电脑实用小工具--VMware常用功能简介

一、创建、编辑虚拟机 1.1 创建新的虚拟机 详见文章新创建虚拟机流程 1.2 编辑虚拟机 创建完成后&#xff0c;点击编辑虚拟机设置&#xff0c;可对虚拟机内存、处理器、硬盘等各再次进行编辑设置。 二、虚拟机开关机 2.1 打开虚拟机 虚拟机创建成功后&#xff0c;点击…

zsh: command not found: adb 报错问题解决

哈喽小伙伴们大家好&#xff0c;我是小李&#xff0c;今天&#xff0c;我满怀信心想要在本地跑一下pda,然而&#xff0c; what? 居然报错了&#xff01;&#xff01;别逗我啊&#xff01; 好吧&#xff0c;究其原因&#xff1a;没有配置好sdk 那就配呗。 首先&#xff0c;…

Ubuntu 配置 github 代理

参考&#xff1a;虚拟机 ubuntu 20.04 git 设置代理的方法_ubuntu_张世争-华为开发者空间 (csdn.net) 查看 Windows 的 IP&#xff0c;例如&#xff1a;192.168.10.100 然后回到 ubuntu 中 git config --global https.proxy https://192.168.10.100:7890 git config --global …

【数据结构】-哈夫曼树以及其应用

哈夫曼树&#xff08;Huffman Tree&#xff09; 1. 哈夫曼树的定义 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种 带权路径长度最短的二叉树&#xff0c;常用于数据压缩和最优前缀编码。其目标是使得 带权路径长度&#xff08;WPL&#xff09;最小。 在信息论和计算…

leetcode top100矩阵题73.54.48.240

73. 矩阵置零 class Solution {public void setZeroes(int[][] matrix) {int line matrix.length;int col matrix[0].length;List<Integer> changeLines new ArrayList<Integer>();List<Integer> changeCols new ArrayList<Integer>();for(int i …