当前位置: 首页 > news >正文

Spring MVC 框架:构建高效 Java Web 应用的利器


Java学习资料

Java学习资料

Java学习资料


一、引言

在 Java Web 开发领域,Spring MVC 框架是一颗耀眼的明星。它作为 Spring 框架家族的重要成员,为开发者提供了一套强大而灵活的解决方案,用于构建 Web 应用程序。Spring MVC 遵循模型 - 视图 - 控制器(MVC)设计模式,将业务逻辑、数据展示和用户交互进行了有效的分离,使得代码结构清晰、易于维护和扩展。

二、MVC 设计模式概述

2.1 基本概念

MVC 设计模式将一个应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。

模型(Model):负责处理应用程序的数据和业务逻辑。它可以是一个 JavaBean,也可以是与数据库交互的 DAO(数据访问对象)或服务层组件。模型封装了应用程序的状态和行为,为视图提供数据支持。

视图(View):负责将模型中的数据呈现给用户。常见的视图技术包括 JSP、Thymeleaf、FreeMarker 等。视图只关注数据的展示,不涉及业务逻辑的处理。

控制器(Controller):负责接收用户的请求,调用相应的模型进行业务处理,并将处理结果传递给合适的视图进行展示。控制器起到了协调模型和视图的作用,是整个应用程序的核心调度者。

2.2 优势

MVC 设计模式的主要优势在于提高了代码的可维护性、可测试性和可扩展性。通过将不同的功能模块分离,各个部分可以独立开发、测试和维护,降低了代码之间的耦合度。

三、Spring MVC 框架架构

3.1 核心组件

Spring MVC 框架的核心组件包括:

DispatcherServlet:作为前端控制器,是整个 Spring MVC 框架的核心。它负责接收所有的 HTTP 请求,并将请求分发给合适的处理器进行处理。

HandlerMapping:根据请求的 URL 路径,将请求映射到相应的处理器(Controller)。Spring MVC 提供了多种 HandlerMapping 实现,如 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping 等。

Controller:负责处理具体的业务逻辑。它接收请求参数,调用模型进行业务处理,并返回处理结果。在 Spring MVC 中,Controller 通常是一个带有 @Controller 注解的 Java 类。

ModelAndView:用于封装处理结果和视图信息。它包含了模型数据和要使用的视图名称,DispatcherServlet 根据这些信息选择合适的视图进行渲染。

ViewResolver:根据视图名称解析出具体的视图对象。Spring MVC 支持多种视图技术,如 JSP、Thymeleaf 等,ViewResolver 负责将视图名称转换为对应的视图实现。

3.2 请求处理流程

客户端发送 HTTP 请求到 DispatcherServlet。

DispatcherServlet 接收到请求后,通过 HandlerMapping 查找合适的处理器(Controller)。

DispatcherServlet 将请求发送给找到的处理器进行处理。

处理器处理请求,调用模型进行业务逻辑处理,并返回一个 ModelAndView 对象。

DispatcherServlet 接收到 ModelAndView 对象后,通过 ViewResolver 解析出具体的视图对象。

视图对象根据 ModelAndView 中的模型数据进行渲染,并将渲染结果返回给客户端。

四、Spring MVC 框架的配置与使用

4.1 配置 DispatcherServlet

在 web.xml 文件中配置 DispatcherServlet:

<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

4.2 配置 Spring MVC 上下文

在 spring-mvc.xml 文件中进行 Spring MVC 的配置,包括视图解析器、处理器映射器等:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解驱动 --><mvc:annotation-driven/><!-- 扫描控制器所在的包 --><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>

4.3 创建控制器

创建一个带有 @Controller 注解的控制器类:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HelloController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Hello, Spring MVC!");return "hello";}
}

4.4 创建视图

在 /WEB-INF/views 目录下创建 hello.jsp 文件:

<!DOCTYPE html>
<html>
<head><title>Hello Spring MVC</title>
</head>
<body><h1>${message}</h1>
</body>
</html>

五、Spring MVC 的常用注解

5.1 @Controller

用于标记一个类为控制器类,Spring MVC 会自动扫描带有该注解的类,并将其注册为控制器。

5.2 @RequestMapping

用于将请求映射到控制器的方法上。可以指定请求的 URL 路径、请求方法(如 GET、POST)等。例如:

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/list", method = RequestMethod.GET)public String listUsers(Model model) {// 处理用户列表请求return "userList";}
}

5.3 @RequestParam

用于获取请求参数。例如:

@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword, Model model) {// 根据关键字进行搜索return "searchResult";
}

5.4 @ModelAttribute

用于将请求参数绑定到模型对象上,或者将模型对象添加到模型中。例如:

@PostMapping("/save")
public String saveUser(@ModelAttribute("user") User user) {// 保存用户信息return "redirect:/user/list";
}

六、Spring MVC 的数据绑定与验证

6.1 数据绑定

Spring MVC 提供了强大的数据绑定功能,能够将请求参数自动绑定到 Java 对象上。例如,当表单提交的数据与 JavaBean 的属性名相匹配时,Spring MVC 会自动将表单数据绑定到 JavaBean 对象中。

6.2 数据验证

Spring MVC 支持使用 JSR - 303 验证规范进行数据验证。通过在 JavaBean 的属性上添加验证注解(如 @NotNull、@Size 等),可以对输入数据进行验证。例如:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;public class User {@NotNull(message = "用户名不能为空")@Size(min = 3, max = 20, message = "用户名长度必须在 3 到 20 之间")private String username;// 其他属性和方法
}

在控制器方法中,可以使用 BindingResult 对象来获取验证结果:

import org.springframework.validation.BindingResult;
import javax.validation.Valid;@PostMapping("/register")
public String register(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "register";}// 保存用户信息return "redirect:/login";
}

七、总结

Spring MVC 框架以其遵循 MVC 设计模式的特性,为 Java Web 开发带来了高效、灵活和可维护的开发体验。通过合理配置核心组件、运用常用注解、实现数据绑定与验证等功能,开发者能够快速搭建出高质量的 Web 应用程序。无论是小型项目还是大型企业级应用,Spring MVC 都能展现出其强大的优势,是 Java Web 开发者不可或缺的工具之一。随着技术的不断发展,Spring MVC 也在持续进化,与其他优秀的技术和框架相结合,为开发者提供更完善的解决方案。

相关文章:

Spring MVC 框架:构建高效 Java Web 应用的利器

Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java Web 开发领域&#xff0c;Spring MVC 框架是一颗耀眼的明星。它作为 Spring 框架家族的重要成员&#xff0c;为开发者提供了一套强大而灵活的解决方案&#xff0c;用于构建 Web 应用程序。Spring MVC 遵循模型 - 视…...

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天&#xff0c;开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型&#xff0c;就在刚刚&#xff0c;凭一己之力让英伟达大跌18%&#xff0c;纳斯达克大跌3.7%&#xff0c;足足是给中国AI产…...

Linux_线程同步生产者消费者模型

同步的相关概念 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免饥饿问题&#xff0c;叫做同步竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常&#xff0c;我们称之为竞态条件。 同步的…...

Origami Agents:通过AI驱动的研究工具提升B2B销售效率

在当今竞争激烈的商业环境中,B2B销售团队面临着巨大的挑战,如何高效地发现潜在客户并进行精准的外展活动成为关键。Origami Agents通过其创新的AI驱动研究工具,正在彻底改变这一过程。本文将深入探讨Origami Agents的产品特性、技术架构以及其快速增长背后的成功因素。 一、…...

linux的/proc 和 /sys目录差异

/proc 和 /sys 都是Linux系统中用于提供系统信息和进行系统配置的虚拟文件系统&#xff0c;但它们的原理并不完全一样&#xff0c;以下是具体分析&#xff1a; 目的与功能 /proc &#xff1a;主要用于提供系统进程相关信息以及内核运行时的一些参数等&#xff0c;可让用户和程…...

AIGC时代的Vue或React前端开发

在AIGC&#xff08;人工智能生成内容&#xff09;时代&#xff0c;Vue开发正经历着深刻的变革。以下是对AIGC时代Vue开发的详细分析&#xff1a; 一、AIGC技术对Vue开发的影响 代码生成与自动化 AIGC技术使得开发者能够借助智能工具快速生成和优化Vue代码。例如&#xff0c;通…...

代码随想录算法训练营第三十九天-动态规划-337. 打家劫舍 III

老师讲这是树形dp的入门题目解题思路是以二叉树的遍历&#xff08;递归三部曲&#xff09;再结合动规五部曲dp数组如何定义&#xff1a;只需要定义一个二个元素的数组&#xff0c;dp[0]与dp[1] dp[0]表示不偷当前节点的最大价值dp[1]表示偷当前节点后的最大价值这样可以把每个节…...

Java线程认识和Object的一些方法

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…...

【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题

目录 1.A星算法原理2.蚁群算法原理3.结果展示4.代码获取 1.A星算法原理 A*算法是一种基于图搜索的智能启发式算法&#xff0c;它具有高稳定性和高节点搜索效率。主要原理为&#xff1a;以起点作为初始节点&#xff0c;将其加入开放列表。从开放列表中选择具有最小总代价值 f (…...

电梯系统的UML文档14

对于 HallButtonControl&#xff0c;我们有二个状态: "门厅灯开 " 和 " 门厅灯关"。 从给出的初始信息&#xff0c;初始的状态应该是"门厅灯关"。行为定义&#xff1a; " 当 HallCall[f&#xff0c;d]是真&#xff0c;则指令 HallLight[f&…...

一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例

论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…...

[250130] VirtualBox 7.1.6 维护版本发布 | Anthropic API 推出全新引用功能

目录 VirtualBox 7.1.6 维护版本发布⚙️ 功能改进&#x1f6e0;️ Bug 修复 Anthropic API 推出全新引用功能&#xff0c;让 Claude 的回答更可信 VirtualBox 7.1.6 维护版本发布 VirtualBox 7.1.6 现已发布&#xff0c;这是一个维护版本&#xff0c;主要修复了一些错误并进行…...

JVM_类的加载、链接、初始化、卸载、主动使用、被动使用

①. 说说类加载分几步&#xff1f; ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…...

2025最新版MySQL安装使用指南

2025最新版MySQL安装使用指南 The Installation and Usage Guide of the Latest Version of Oracle MySQL in 2025 By JacksonML 1. 获取MySQL 打开Chrome浏览器&#xff0c;访问官网链接&#xff1a;https://www.mysql.com/ &#xff0c;随即打开MySQL官网主页面&#xff…...

MIMIC IV数据库中mimiciv_hosp的transfers表的careunit分析

以下是MIMIC IV数据库中mimiciv_hosp的transfers表的careunit的所有值&#xff0c;从医学专业角度分析&#xff0c;下面哪些科室会有实施心脏或神经手术&#xff1f; Cardiac Surgery Cardiac Vascular Intensive Care Unit (CVICU) Cardiology Cardiology Surgery Intermediat…...

AI学习指南HuggingFace篇-Hugging Face 的环境搭建

一、引言 Hugging Face作为自然语言处理(NLP)领域的强大工具,提供了丰富的预训练模型和数据集,极大地简化了开发流程。本文将详细介绍如何搭建适合Hugging Face开发的环境,包括Python环境配置、依赖安装以及推荐的开发工具,帮助读者准备好开发环境。 二、Python环境配置…...

白嫖DeepSeek:一分钟完成本地部署AI

1. 必备软件 LM-Studio 大模型客户端DeepSeek-R1 模型文件 LM-Studio 是一个支持众多流行模型的AI客户端&#xff0c;DeepSeek是最新流行的堪比GPT-o1的开源AI大模型。 2. 下载软件和模型文件 2.1 下载LM-Studio 官方网址&#xff1a;https://lmstudio.ai 打开官网&#x…...

C# dataGridView1获取选中行的名字

在视觉项目中编写的框架需要能够选择产品或复制产品等方便后续换型&#xff0c;视觉调试仅需调试相机图像、调试视觉相关参数、标定&#xff0c;再试跑调试优化参数。 C# dataGridView1 鼠标点击某一行能够计算出是那一行 使用CellMouseClick事件 首先&#xff0c;在Form的构造…...

Day28(补)-【AI思考】-AI会不会考虑自己的需求?

文章目录 AI会不会考虑自己的需求&#xff1f;一、**技术本质&#xff1a;深度≠理解**二、**传播机制&#xff1a;热搜如何制造幻觉**三、**伦理考量&#xff1a;为何必须"撇清"**关键结论 AI会不会考虑自己的需求&#xff1f; 让思想碎片重焕生机的灵魂&#xff1a…...

幸运数字——蓝桥杯

1.问题描述 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10mod(126)0&#xff1b;126 也是八进制下的哈沙德数&#xff0c;因为 (126)10(176)8&#xff0c;(126)10​mod(176)…...

快速提升网站收录:避免常见SEO误区

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/26.html 在快速提升网站收录的过程中&#xff0c;避免常见的SEO误区是至关重要的。以下是一些常见的SEO误区及相应的避免策略&#xff1a; 一、关键词堆砌误区 误区描述&#xff1a; 很多…...

[Java]泛型(二)泛型方法

1.定义 在 Java 中&#xff0c;泛型方法是指在方法声明中使用泛型类型参数的一种方法。它使得方法能够处理不同类型的对象&#xff0c;而不需要为每种类型写多个方法&#xff0c;从而提高代码的重用性。 泛型方法与泛型类不同&#xff0c;泛型方法的类型参数仅仅存在于方法的…...

如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。

在Ubuntu系统中&#xff0c;可以通过编写脚本结合cron或systemd来监控程序的运行状态&#xff0c;并在程序异常时自动重启。以下是具体步骤&#xff1a; 方法一&#xff1a;使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行&#xff0c;并在程序异常时重…...

UE学习日志#15 C++笔记#1 基础复习

1.C20的import 看看梦开始的地方&#xff1a; import <iostream>;int main() {std::cout << "Hello World!\n"; } 经过不仔细观察发现梦开始的好像不太一样&#xff0c;这个import是C20的模块特性 如果是在VS里编写的话&#xff0c;要用这个功能需要新…...

CSS:跑马灯

<div class"swiper-container"><div class"swiper-wrapper"><!-- 第一组 --><div class"item" v-for"item in cardList" :key"first-item.id"><img :src"item.image" alt""…...

rust 自定义错误(十二)

错误定义&#xff1a; let file_content parse_file("test.txt");if let Err(e) file_content {println!("Error: {:?}", e);}let file_content parse_file2("test.txt");if let Err(e) file_content {match e {ParseFileError::File > …...

EWM 变更库存类型

目录 1 简介 2 配置 3 业务操作 1 简介 一般情况下 EWM 标准收货流程是 ROD&#xff08;Ready on Dock&#xff09; --> AFS&#xff08;Avaiable for Sale&#xff09;&#xff0c;对应 AG 001 --> AG 002&#xff0c;对应库存类型 F1 --> F2。 因业务需要反向进…...

AI大模型开发原理篇-9:GPT模型的概念和基本结构

基本概念 生成式预训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型 是由 OpenAI 开发的基于 Transformer 架构的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;专门用于文本生成任务。它的设计理念在于通过大规模的预训练来学习语言模…...

MySQL数据库(二)

一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 1 所有数据库&#xff1a; show databases; 2 查询当前数据库&#xff1a; select database(); 2 创建-数据库 可以定义数据库的编码方式 create database if not exists ax1; create database ax2…...

从0到1:C++ 开启游戏开发奇幻之旅(二)

目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能&#xff08;AI&#xff09; 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例&#xff1a;开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…...