Spring MVC:从历史演变到实战入门

1. Java Web的发展历史与MVC模式

1.1 Model I与Model II的演进

Model I(JSP+JavaBean)
作为早期Java Web开发的主流模式,其核心架构如下:

graph LR
A[客户端] --> B[JSP页面]
B --> C{业务逻辑}
C --> D[JavaBean]
D --> B
B --> A

痛点分析

  • JSP同时承担视图渲染与业务控制,代码耦合度高

  • 项目规模扩大后维护成本指数级增长

Model II(Servlet+JSP+JavaBean)
通过分层思想实现解耦:

graph LR
A[客户端] --> B[Servlet]
B --> C{控制逻辑}
C --> D[JavaBean]
D --> E[JSP]
E --> A

优势

  • 职责分离:Servlet负责流程控制,JSP专注视图展示

  • 更适合大型项目开发

1.2 MVC设计模式的精髓

组件职责说明具体实现
Model数据处理与业务逻辑Service/Dao/Entity
View用户界面与数据展示JSP/Thymeleaf模板
Controller请求调度与响应处理@Controller注解类

2. Spring MVC快速入门实战

2.1 环境搭建(IntelliJ IDEA演示)

Maven依赖配置

<properties><spring.version>5.3.18</spring.version>
</properties><dependencies><!-- Spring MVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- 视图解析 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.15.RELEASE</version></dependency>
</dependencies>

2.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><!-- 前端控制器 -->
<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:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>

Spring MVC配置(spring-mvc.xml)

<!-- 组件扫描 -->
<context:component-scan base-package="com.example.controller"/><!-- 视图解析器 -->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/>
</bean><!-- 模板引擎配置 -->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".html"/></bean></property>
</bean>

2.3 控制器开发实例

@Controller
public class HelloController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Welcome to Spring MVC!");return "result-page";}
}

页面结构

src
├── main
│   ├── webapp
│   │   └── WEB-INF
│   │       └── views
│   │           └── result-page.html

3. Spring MVC核心原理剖析

3.1 请求处理全流程

  1. DispatcherServlet接收请求
    作为统一入口,拦截所有HTTP请求

  2. HandlerMapping路由匹配
    根据URL找到对应的Controller方法

  3. HandlerAdapter执行处理
    通过反射调用目标方法

  4. 视图解析与渲染
    将逻辑视图名转换为物理视图路径

sequenceDiagram
客户端->>DispatcherServlet: HTTP请求
DispatcherServlet->>HandlerMapping: 查询处理器
HandlerMapping-->>DispatcherServlet: 返回Handler
DispatcherServlet->>HandlerAdapter: 执行处理器
HandlerAdapter->>Controller: 调用方法
Controller-->>HandlerAdapter: 返回ModelAndView
HandlerAdapter-->>DispatcherServlet: 返回结果
DispatcherServlet->>ViewResolver: 解析视图
ViewResolver-->>DispatcherServlet: 返回视图
DispatcherServlet->>View: 渲染视图
View-->>客户端: 响应HTML

3.2 核心组件详解

组件职责说明默认实现类
HandlerMapping请求到处理器的映射RequestMappingHandlerMapping
HandlerAdapter执行处理器方法RequestMappingHandlerAdapter
ViewResolver解析逻辑视图名InternalResourceViewResolver
HandlerExceptionResolver异常处理ExceptionHandlerExceptionResolver

4. 开发技巧与最佳实践

  1. RESTful风格设计

@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {// 业务逻辑}
}

        2.统一异常处理

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception ex) {ModelAndView mav = new ModelAndView();mav.addObject("errorMsg", ex.getMessage());mav.setViewName("error-page");return mav;}
}

3. 参数验证技巧

@PostMapping("/register")
public String register(@Valid User user, BindingResult result) {if (result.hasErrors()) {return "register-form";}// 处理注册逻辑
}

5. 常见问题排查指南

问题1:404未找到页面
✅ 检查项:

  • 控制器是否添加@Controller注解

  • 请求路径是否匹配@RequestMapping

  • 视图文件位置是否符合配置的prefix/suffix

问题2:参数绑定失败
✅ 解决方案:

  • 检查表单字段名与POJO属性名是否一致

  • 使用@RequestParam指定参数名称

  • 添加BindingResult参数捕获错误

6. 性能优化建议

  1. 启用缓存

@Cacheable("users")
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {// 数据库查询
}

         2.异步处理

@Async
public CompletableFuture<User> fetchUserAsync(Long id) {// 异步操作
}

         3.静态资源优化

结语

<mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>

通过本文的学习,我们不仅掌握了Spring MVC的核心原理,还完成了从环境搭建到实战开发的完整流程。建议读者在掌握基础后,继续深入以下方向:

  1. 深入理解拦截器(Interceptor)机制

  2. 研究Spring Boot对MVC的自动化配置

  3. 探索响应式编程WebFlux框架

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

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

相关文章

工作记录 2017-03-10

工作记录 2017-03-10 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了payment detail和patient insurance的health plan的输入方式。 2、new payment detail时&#xff0c;增加了allowable的处理。 3、选择payer的窗体&#xff0c;增…

MySQL数据库和表的操作

#使用数据库 use 数据库名; # 查询当前数据库是哪个数据库 select database(); 查看数据库版本 SELECT VERSION(); 查看当前用户 SELECT USER(); 查看所有用户() SELECT User,Host,Password FROM mysql.user;数据库 MySQL自带数据库&#xff1a; Information_schema: 主要存储…

lxd-dashboard 图形管理LXD/LXC

前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…

[GESP202503 C++一级题解]:B4257:图书馆里的老鼠

[GESP202503 C++一级题解]:B4257:图书馆里的老鼠 题目描述 图书馆里有 n n n 本书,不幸的是,还混入了一只老鼠,老鼠每 x x x 小时能啃光一本书,假设老鼠在啃光一本书之前,不会啃另一本。请问 y y y 小时后图书馆里还剩下多少本完整的书。 输入格式 三行,第一行一…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.2.2 文本生成逻辑:Top-k采样与温度控制1. 文本生成的核心挑战与数学框架1.1 自回归生成的基本流程2. `Top-k`采样原理与工程实现2.1 数学定义与算法流程2.2 PyTorch实现优化3. 温度控制的数学本质与参…

Unity中实现UI的质感和圆角

质感思路有两种&#xff1a; 一种是玻璃质感的做法&#xff0c;抓取UI后面的图像做模糊&#xff08;build是GrabPass&#xff0c;urp抓图像我有写过在往期文章&#xff09;&#xff0c;这个方式网络上有很多就不写了&#xff1b; 另外一种是使用CubeMap的方式去模拟质感&…

[异步监听事件、异步绑定属性]通过vue的this.$refs.组件.$props和.$on实现异步绑定组件属性和事件监听

child.vue <template><div><el-button type"primary" click.stop"$emit(get, data)">点击传参</el-button></div> </template> <script> export default { name: "child", props: ["data"…

第六届 蓝桥杯 嵌入式 省赛

参考 第六届蓝桥杯嵌入式省赛程序设计题解析&#xff08;基于HAL库&#xff09;_蓝桥杯嵌入式第六届真题-CSDN博客 一、分析功能 RTC 定时 1&#xff09;时间初始化 2&#xff09;定时上报电压时间 ADC测量 采集电位器的输出电压信号。 串行功能 1&#xff09;传送要设置…

为什么要将项目部署到外部tomcat

一、是什么 指将你的Java Web应用程序&#xff08;如WAR包&#xff09;安装并运行在一个独立安装的、位于项目外部的Tomcat服务器上&#xff0c;而不是使用内嵌的或开发环境自带的服务器。 外部Tomcat 指独立安装的Tomcat服务器&#xff08;如从Apache官网下载的Tomcat&#…

企业级全栈开发终极指南:Spring Boot+Vue3+Kubernetes实战,从0到上线高并发系统

简介 本文以电商系统为例,完整呈现从需求分析到上线运维的企业级开发全流程。包含12个关键步骤、30+代码示例、5个架构设计图,以及完整的Docker/Kubernetes部署方案。所有代码均符合企业级规范,可直接用于生产环境。 企业级开发的终极挑战 行业痛点: 90%的开发者在企业级…

蓝桥杯嵌入式赛道复习笔记8(eeprom读写)

原理学习 自己看一下江科大的存储器的读取&#xff0c;原理是一样的。只是使用了IIC原理是不变的 代码 cubeMX的配置 代码 eeprom层代码的书写 #include "eeprom_display.h" uint8_t data; uint8_t eeprom_read(uint8_t addr){I2CStart();I2CSendByte(0xa0);I2…

IP数据报报文格式

一 概述 IP数据报由两部分组成&#xff1a;首部数据部分。首部的前一部分是固定长度&#xff0c;一共20字节大小&#xff0c;是所有IP数据报文必须具有的&#xff1b;固定部分后面是一些可选字段&#xff0c;其长度是可变的。 二 首部固定部分各字段意义 &#xff08;1&…

高光谱工业相机+LED光源系统助力材料分类和异物检测、实现高速在线检测

检测光源包括可见光&#xff0c;如红光、蓝光和绿光以及其他波长的光&#xff0c;如紫外和红外波长&#xff0c;可以选择与检测对象物相应的波长。但由于能够照射的波长较窄&#xff0c;例如受到同色异物混入或多个素材的材质分类等&#xff0c;可能需要使用可照射多种波长的光…

如何快速解决django存储session变量时出现的django.db.utils.DatabaseError错误

我们在学习django进行web编程的时候&#xff0c;有时需要将一些全局变量信息存储在session中&#xff0c;但使用过程中&#xff0c;却发现会引起数据库的报错。通过查看django源码信息&#xff0c;发现其对session信息进行了ORM映射&#xff0c;如果数据库中不存在对应的表信息…

kubeadm部署k8s-1.32版本集群(1个master,1个worker)

使用最新版的kubeadm部署一个最小版的k8s集群&#xff0c;只有一个master和1个worker&#xff0c;这种部署方式&#xff0c;不满足高可用&#xff0c;仅限于本地学习使用&#xff0c;不可以放到生产上用&#xff0c;先看一下文章的目录。 文章目录 1、基本信息1.1、服务器基本…

阀门流量控制系统MATLAB仿真PID

以下是一个基于MATLAB的PID控制仿真程序&#xff0c;用于模拟智能阀门流量控制系统。该程序包含系统模型、PID控制器以及饱和限制处理。 % 石油管道流量PID控制仿真 % 系统参数 valve_min 4; % 阀门最小电流 (mA) valve_max 25; % 阀门最大电流 (mA) max_flow 10…

UE4学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)

文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍&#xff0c;设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍&#xff0c;设置文本的名字和颜色在构造事件中&#xff0c;获取玩家…

机器学习——LightGBM

LightGBM(light gradient boosting machine&#xff0c;轻量梯度提升机)是对XGBoost进行改进的模型版本&#xff0c;其三者之间的演变关系为&#xff1a;GBDT-》XGBoost-》LightGBM&#xff0c;依次对性能进行优化&#xff0c;尽管XGBoost已经很高效了&#xff0c;但是仍然有缺…

什么是SQL作业

SQL作业是在数据库服务器上按特定时间或间隔自动执行的计划任务或流程&#xff0c;这些作业由Microsoft SQL Server中的SQL Server代理管理&#xff0c;对于自动执行日常任务&#xff08;如数据库系统中的备份、数据导入和报告生成&#xff09;以及确保及时准确地处理和更新数据…

小程序内表格合并功能实现—行合并

功能介绍&#xff1a;支付宝小程序手写表格实现行内合并&#xff0c;依据动态数据自动计算每次需求合并的值&#xff0c;本次记录行内合并&#xff0c;如果列内合并&#xff0c;同理即可实现 前端技术&#xff1a;grid布局 display&#xff1a;grid 先看实现效果: axml&…