Spring MVC配置详解:从历史到实战

文章目录

  • 一、Java Web的发展历程
    • 1.Model I与Model II开发模式
      • (1) Model I开发模式
      • (2)Model II开发模式
    • 2.MVC设计模式
      • Spring MVC本质
      • MVC工作流程
  • 二、Spring MVC快速入门实战
    • 1.环境搭建步骤
      • (1)创建Maven Web工程
      • (2)配置web.xml
      • (3) Spring MVC配置文件(springmvc.xml)
      • (4) 编写Controller
      • (5) 创建视图页面
  • 三、Spring MVC核心原理剖析
    • 1.请求处理全流程
      • (1)DispatcherServlet接收请求
      • (2)HandlerAdapter执行方法
      • (3)处理返回结果
      • (4)视图渲染
    • 2.核心组件详解
      • (1)Spring MVC 核心组件功能表
      • (2)组件协作示意图
    • 3.架构优势分析
  • 总结


一、Java Web的发展历程

1.Model I与Model II开发模式

(1) Model I开发模式

核心架构:JSP + JavaBean
流程特点

  • JSP页面直接处理用户请求、执行业务逻辑(通过JavaBean)并渲染页面
  • 优点:快速开发小型项目
  • 致命缺陷:视图展示与业务逻辑高度耦合,JSP文件臃肿,维护困难
浏览器请求 → JSP接收请求 → 调用JavaBean → JSP渲染响应

(2)Model II开发模式

核心架构:JSP + Servlet + JavaBean
分层思想

  • JSP:专注视图渲染
  • Servlet:负责流程控制(Controller前身)
  • JavaBean:处理业务逻辑(Service/DAO层)
浏览器请求 → Servlet接收 → 调用JavaBean → 转发结果至JSP → 渲染响应

划时代意义:首次实现MVC分层,支持中大型项目开发(2000年代主流架构)

2.MVC设计模式

Spring MVC本质

Spring MVC本质:基于Servlet的增强框架,核心思想遵循MVC规范

组件核心职责实现示例
Model1. 处理业务逻辑
2. 封装数据对象
- @Service标注的业务类
- 实体类(如User.java
- DAO层实现类
View1. 数据可视化展示
2. 用户交互界面
- JSP页面(*.jsp
- Thymeleaf模板(*.html
- JSON响应(@ResponseBody
Controller1. 接收请求
2. 调用业务层
3. 返回响应
- @Controller注解类
- @RequestMapping方法
(如/user/login映射)

MVC工作流程

  1. 用户通过View发起请求
  2. Controller接收并解析请求参数
  3. 调用Model层处理业务逻辑
  4. 返回处理结果至View渲染

二、Spring MVC快速入门实战

1.环境搭建步骤

(1)创建Maven Web工程

关键依赖

<dependencies><!-- Spring MVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version></dependency><!-- 视图模板引擎 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.14.RELEASE</version></dependency><!-- Servlet API --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
</dependencies>

(2)配置web.xml

核心配置项

<!-- 字符编码过滤器 -->
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter><!-- DispatcherServlet配置 -->
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.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>

(3) Spring MVC配置文件(springmvc.xml)

<!-- 组件扫描 -->
<context:component-scan base-package="com.example.controller"/><!-- Thymeleaf视图解析 -->
<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/>
</bean><bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver"/>
</bean><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/><property name="characterEncoding" value="UTF-8"/>
</bean><!-- 开启注解驱动 -->
<mvc:annotation-driven/>

(4) 编写Controller

@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Welcome to Spring MVC!");return "result"; // 对应/WEB-INF/views/result.html}
}

(5) 创建视图页面

result.html(Thymeleaf模板)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Result Page</title>
</head>
<body><h1 th:text="${message}">Default Message</h1>
</body>
</html>

三、Spring MVC核心原理剖析

1.请求处理全流程

(1)DispatcherServlet接收请求

  • 作为统一入口拦截所有请求
  • 通过HandlerMapping查找匹配的Controller方法

(2)HandlerAdapter执行方法

  • 参数绑定:自动将请求参数映射到方法参数
  • 执行@RequestMapping标注的方法

(3)处理返回结果

  • 返回String:通过ViewResolver解析为具体视图
  • 返回@ResponseBody:直接序列化为JSON

(4)视图渲染

  • 模板引擎处理动态内容
  • 生成最终HTML响应

2.核心组件详解

(1)Spring MVC 核心组件功能表

组件名称职责说明实现示例
DispatcherServlet前端控制器,统一处理所有HTTP请求和响应,协调各组件工作流程web.xml中配置的核心Servlet,默认名称dispatcher,处理所有/请求
HandlerMapping建立请求URL与Controller方法的映射关系RequestMappingHandlerMapping(基于@RequestMapping注解的映射策略)
HandlerAdapter实际执行Controller方法,处理参数绑定、数据转换、验证等核心逻辑RequestMappingHandlerAdapter(支持基于注解的处理器方法)
ViewResolver将Controller返回的逻辑视图名解析为具体的视图实现(HTML/JSON等)InternalResourceViewResolver(JSP)、ThymeleafViewResolver(模板引擎)
HandlerExceptionResolver统一处理Controller层抛出的异常,返回定制化错误响应ExceptionHandlerExceptionResolver(配合@ExceptionHandler使用)

(2)组件协作示意图

在这里插入图片描述

3.架构优势分析

  1. 松耦合设计:各组件通过接口定义,易于扩展
  2. 注解驱动开发:@Controller、@RequestMapping简化配置
  3. 强大的数据绑定:自动处理表单数据、JSON转换
  4. 视图技术无关性:支持JSP、Thymeleaf、FreeMarker等

总结

Spring MVC通过清晰的层次划分和强大的扩展能力,已成为Java Web开发的事实标准。理解其核心原理并掌握配置技巧,是构建高性能Web应用的关键。建议通过Debug模式跟踪请求处理流程,深入体会各组件协作机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比

Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…

【树莓派Pico FreeRTOS】-Mutex(互斥体)

Mutex(互斥体) 文章目录 Mutex(互斥体)1、硬件准备2、软件准备3、FreeRTOS的Mutex介绍4、完整示例RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (P…

sock文件介绍--以mysql.sock为例

socket 文件 (.sock) 通常是临时文件。 MySQL 的 socket 文件是临时文件&#xff0c;只在服务运行时有效。可通过配置文件更改 socket 文件的存放路径&#xff0c;常见路径如 /tmp/mysql.sock 或指定自定义目录。如果连接出现问题&#xff0c;可能需要检查 MySQL 服务状态或路…

Docker应用部署之mysql篇(day5)

文章目录 前言一、问题描述二、解决方案1. 搜索 MySQL 镜像2. 拉取 MySQL 镜像3. 创建并运行 MySQL 容器参数说明&#xff1a; 4. 验证容器是否运行5. 进入 MySQL 容器 三、总结 前言 在日常开发和部署中&#xff0c;MySQL 是最常用的关系型数据库之一。借助 Docker&#xff0…

【Elasticsearch基础】基本核心概念介绍

Elasticsearch作为当前最流行的分布式搜索和分析引擎&#xff0c;其强大的功能背后是一套精心设计的核心概念体系。本文将深入解析Elasticsearch的五大核心概念&#xff0c;帮助开发者构建坚实的技术基础&#xff0c;并为高效使用ES提供理论支撑。 1 索引&#xff08;Index&…

Qt在ARM中,如何使用drmModeObjectSetProperty 设置 Plane 的 zpos 值

在 Qt 中直接使用 drmModeObjectSetProperty 设置 Plane 的 zpos 值需要结合 Linux DRM/KMS API 和 Qt 的底层窗口系统&#xff08;如 eglfs 平台插件&#xff09;。以下是详细步骤和代码示例&#xff1a; 1. 原理说明 DRM/KMS 基础&#xff1a; Plane&#xff1a;负责图层合成…

MFC添加免费版大漠3.1233

先创建一个MFC工程&#xff0c; 添加dm.dll 方法一&#xff1a;通过类向导-添加类-类型库中的MFC类-文件&#xff0c;选择dm.dll&#xff0c;如果没有"添加类型库中的MFC类"选项就用方法二添加 方法二&#xff1a;添加-新建项-MFC-Active或TypeLib-实现接口位置选…

【Linux】应用层协议 HTTP

应用层协议 HTTP 一. HTTP 协议1. URL 地址2. urlencode 和 urldecode3. 请求与响应格式 二. HTTP 请求方法1. GET 和 POST (重点) 三. HTTP 状态码四. HTTP 常见报头五. 手写 HTTP 服务器 HTTP&#xff08;超文本传输协议&#xff09;是一种应用层协议&#xff0c;用于在万维网…

【活动回顾】StarRocks Singapore Meetup #2 @Shopee

3 月 13 日&#xff0c;StarRocks 社区在新加坡成功举办了第二场 Meetup 活动&#xff0c;主题为“Empowering Customer-Facing Analytics”。本次活动在 Shopee 新加坡办公室举行&#xff0c;吸引了来自 Shopee、Grab 和 Pinterest 的专家讲师以及 50 多位参会者。大家围绕电商…

Retinexformer:基于 Retinex 的单阶段 Transformer 低光照图像增强方法

开头发点牢骚&#xff1a;本来做的好好都都要中期了&#xff0c;导师怎么突然给我换题目啊。真是绷不住了......又要从头开始学了&#xff0c;唉&#xff01; 原论文链接&#xff1a;Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement 低光…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…

flink广播算子Broadcast

文章目录 一、Broadcast二、代码示例三.或者第二种(只读取一个csv文件到广播内存中)提示:以下是本篇文章正文内容,下面案例可供参考 一、Broadcast 为了关联一个非广播流(keyed 或者 non-keyed)与一个广播流(BroadcastStream),我们可以调用非广播流的方法 connect(),…

Redis 和 MySQL双写一致性的更新策略有哪些?常见面试题深度解答。

目录 一. 业务数据查询&#xff0c;更新顺序简要分析 二. 更新数据库、查询数据库、更新缓存、查询缓存耗时对比 2.1 更新数据库&#xff08;最慢&#xff09; 2.2 查询数据库&#xff08;较慢&#xff09; 2.3 更新缓存&#xff08;次快&#xff09; 2.4 查询缓存&#…

SRT协议

SRT&#xff08;Secure Reliable Transport&#xff09;是一种开源的视频传输协议&#xff0c;专为高丢包、高延迟网络环境设计&#xff0c;结合了UDP的低延迟和TCP的可靠性&#xff0c;广泛应用于直播、远程制作、视频会议等场景。 定位&#xff1a;SRT协议的官方C/C实现库&am…

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

npm install 卡在创建项目:sill idealTree buildDeps

参考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再执行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者换梯子

c++中cpp文件从编译到执行的过程

C 文件从编写到执行的过程可以分为几个主要阶段&#xff1a;编写代码、预处理、编译、汇编、链接和运行。以下是每个阶段的详细说明&#xff1a; 1. 编写代码 这是整个过程的起点。程序员使用文本编辑器&#xff08;如 VSCode、Sublime Text 或其他 IDE&#xff09;编写 C 源…

PROE 与 STL 格式转换:开启 3D 打印及多元应用的大门

在 3D 设计与制造的复杂生态中&#xff0c;将 PROE 格式转换为 STL 格式绝非无端之举&#xff0c;而是有着深厚且多元的现实需求作为支撑。 一、文件格式介绍​ &#xff08;一&#xff09;PROE 格式​ PROE 作为一款参数化设计软件&#xff0c;采用基于特征的参数化建模技术…

开发中后端返回下划线数据,要不要统一转驼峰?

先说结论。看情况&#xff01;&#xff01;&#xff01;&#xff01; 前端 主要用 JS/TS 建议后端返回 camelCase&#xff0c;减少前端转换成本。后端 主要是 Python/Go 建议保持 snake_case&#xff0c;前端做转换。但是团队统一风格最重要&#xff01;如果统一返回驼峰就驼峰…

docker pull时报错:https://registry-1.docker.io/v2/

原文&#xff1a;https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 换源&#xff0c;解决连接不上的问题。 编辑以下文件&#xff0c;不存在则创建&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors&qu…