【Spring 篇】深入解析SpringMVC的组件魅力
SpringMVC,这个名字在Java Web开发者的耳边仿佛是一首动听的旋律,携着轻盈的氛围,带给我们一种愉悦的编程体验。但是,当我们深入探寻这个框架时,它的魅力远不止表面的简单,它由许多组件构成,每个组件都像乐章中的一段旋律,构筑出一幅和谐而富有层次的画卷。
控制器(Controller):引领交响乐的指挥者
在SpringMVC的舞台上,控制器是一位指挥者,负责协调整个交响乐的演奏。通过@Controller
注解,我们将一个普通的Java类标记为控制器,告诉SpringMVC这是一个可以接受用户请求的角色。下面是一个简单的控制器示例:
@Controller
@RequestMapping("/music")
public class MusicController {@GetMapping("/play")public String playMusic(Model model) {model.addAttribute("song", "Spring Symphony");return "music-player";}
}
在这个例子中,MusicController
被标记为@Controller
,而@RequestMapping("/music")
指定了该控制器处理的请求路径前缀。当用户请求/music/play
时,playMusic
方法将被调用,将音乐名传递给视图。
视图解析器(View Resolver):翩翩起舞的芭蕾演员
在交响乐的演奏过程中,芭蕾舞台上的演员在音乐的引导下翩翩起舞,而在SpringMVC的舞台上,视图解析器扮演了这个角色。它负责将控制器返回的逻辑视图名解析为实际的视图页面。在spring-mvc.xml
中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
</bean>
上述配置中,prefix
指定了视图页面的前缀,suffix
指定了视图页面的后缀。比如在前面的控制器例子中,return "music-player";
中的music-player
将被解析为/WEB-INF/views/music-player.jsp
。
模型(Model)和视图(View):交响乐团的演奏家
在交响乐团中,演奏家们各司其职,通过共同的努力演绎出一场精彩的音乐会。在SpringMVC中,模型和视图也是紧密合作的两个组件。控制器方法返回的ModelAndView
对象包含了模型和视图的信息。
@Controller
@RequestMapping("/orchestra")
public class OrchestraController {@GetMapping("/playConcert")public ModelAndView playConcert() {ModelAndView modelAndView = new ModelAndView("concert");modelAndView.addObject("musician", "Spring Orchestra");return modelAndView;}
}
在这个例子中,playConcert
方法返回了一个ModelAndView
对象,其中指定了视图名为"concert",并通过addObject
方法将乐团的名字传递给视图。
请求映射(Request Mapping):音符的节奏与和弦的和谐
在音乐中,每个音符都有其特定的节奏,而和弦的组合则创造出音乐的和谐。在SpringMVC中,@RequestMapping
注解就是控制器方法的节奏,定义了请求的映射关系。它可以设置在类级别,也可以设置在方法级别。
@Controller
@RequestMapping("/musician")
public class MusicianController {@RequestMapping(value = "/playNote", method = RequestMethod.GET)public String playNote() {// 演奏一个音符return "music-note";}
}
在这个例子中,类级别的@RequestMapping("/musician")
表示该控制器处理的请求路径前缀为"/musician",而方法级别的@RequestMapping(value = "/playNote", method = RequestMethod.GET)
则表示处理路径为"/musician/playNote"的GET请求。
视图页面:乐谱上的音符和符号
音乐的美妙在于乐谱上的音符和符号,而在SpringMVC中,视图页面就是呈现最终音乐的媒介。通常使用JSP、Thymeleaf等技术来编写视图页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Music Note</title>
</head>
<body><h1>Play a beautiful note!</h1>
</body>
</html>
在这个简单的JSP页面中,通过<h1>
标签展示了一段音符的文字。
请求参数和路径变量:交互中的对话
音乐会不仅仅是演奏者在台上的独奏,还包括与观众的互动。在SpringMVC中,请求参数和路径变量就是这场交互中的对话。
@Controller
@RequestMapping("/conversation")
public class ConversationController {@GetMapping("/talk")public String talk(@RequestParam(name = "topic", defaultValue = "Spring") String topic, Model model) {model.addAttribute("conversation", "Let's talk about " + topic + "!");return "talk";}
}
在这个例子中,talk
方法接受一个名为topic
的请求参数,如果请求中没有提供topic
参数,则默认值为"Spring"。通过@RequestParam
注解,SpringMVC将请求参数绑定到方法的参数上,并传递给视图。
表单处理:交互的演奏
音乐会中的互动不仅仅局限于对话,有时还需要观众参与演奏。在SpringMVC中,表单处理提供了强大的功能,使得用户能够向服务器提交数据。
@Controller
@RequestMapping("/audience")
public class AudienceController {@GetMapping("/joinOrchestra")public String joinOrchestraForm(Model model) {model.addAttribute("musician", new Musician());return "join-form";}@PostMapping("/processJoinForm")public String processJoinForm(@ModelAttribute("musician") Musician musician) {// 处理表单提交的参与乐团的音乐家信息return "joined-orchestra";}
}
在这个例子中,joinOrchestraForm
方法展示了一个加入乐团的表单,通过@ModelAttribute
注解,表单中的数据将被绑定到Musician
对象。而processJoinForm
方法则处理表单的提交。
拦截器(Interceptor):交响乐团的监察员
在音乐会上,总有监察员保证音乐会的正常进行,而在SpringMVC中,拦截器就是这样的监察员。拦截器可以在请求被处理前或处理后进行一些预处理或后处理。
public class ConcertInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理前执行return true; // 返回true表示继续执行,返回false表示中断执行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理后但在视图渲染前执行}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求完成后执行,包括视图渲染完成后}
}
在这个例子中,ConcertInterceptor
实现了HandlerInterceptor
接口,可以在preHandle
、postHandle
和afterCompletion
中执行相应的操作。在spring-mvc.xml
中配置拦截器:
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/secure/**" /><bean class="com.example.interceptor.ConcertInterceptor" /></mvc:interceptor>
</mvc:interceptors>
上述配置表示拦截路径为"/secure/**"的请求,并使用ConcertInterceptor
进行处理。
结语
SpringMVC的组件如同一场音乐会,控制器、视图解析器、模型和视图、请求映射、视图页面、请求参数和路径变量、表单处理以及拦截器,每个组件都有其独特的角色,共同协作,构建出一幅美妙的交响乐。这篇博客只是带你浏览了这个庞大而美丽的音乐会场,而深入学习每个组件将让你更好地驾驭SpringMVC的优雅之处。在这个音乐之旅中,让我们激发内心的热情,不断地学习、实践,去创造出属于自己的音乐之美。愿你的编程旅途如同一场动听的交响乐,充满激情与深度。
作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:

【Spring 篇】深入解析SpringMVC的组件魅力
SpringMVC,这个名字在Java Web开发者的耳边仿佛是一首动听的旋律,携着轻盈的氛围,带给我们一种愉悦的编程体验。但是,当我们深入探寻这个框架时,它的魅力远不止表面的简单,它由许多组件构成,每个…...
HPsocket 在 C# 中的运用:一款优秀的 socket 通信框架
摘要:本文将为您详细介绍 HPsocket,一款适用于 win32 平台的 socket 通信框架。同时,我们还将探讨如何在 C# 项目中使用 HPsocket,实现网络通信功能。通过本文,您将深入了解 HPsocket 的特点、优势以及在 C# 中的实际应…...
黑豹程序员-MyBatisPlus封装SQL的where条件的对象 QueryWrapper
说明 我们使用MybatisPlus时,我们可以不直接通过SQL操作数据库,而使用面向对象的方式。 其中遇到一个问题,就是如何用面向对象的方式实现 SQL中的where条件拼接。 MybatisPlus很体贴,它提供了一个QueryWrapper,查询包…...

每日一题——LeetCode1252.奇数值单元格的数目
进阶:你可以设计一个时间复杂度为 O(n m indices.length) 且仅用 O(n m) 额外空间的算法来解决此问题吗? 方法一 直接模拟: 创建一个n x m的矩阵,初始化所有元素为0,对于indices中的每一对[ri,ci],将矩…...
C#学习笔记3-函数与单元测试
现在开始参考书籍变为:《C# 12 and .NET 8 – Modern Cross-Platform Development.Mark Price》 函数 Writing, Debugging, and Testing Functions 写函数Debug运行时 logging单元测试 写函数 一个有着 XML 注释的函数 这里直接举一个例子: Numbe…...
osg屏幕事件处理器和状态集操控器学习
1 osgViewer::WindowSizeHandler 该事件处理器提供了对窗体屏幕的控制,功能如下: 按住或再次键盘f键,则三维窗体在全屏和退出全屏之间切换; 按住键盘>键,则屏幕分辨率增加; 按住键盘<键,则屏幕分辨率减小; 2 osgGA::StateSetManipulator 该事件处理器是状态集操…...

中国泛娱乐出海视频字幕解决方案
随着企业泛娱乐出海越来越成为热门,自动加载视频字幕需求变得越来越普遍,这能够为用户观众提供更好的视频体验。此次九河云为客户带来了aws视频字幕解决方案,满足客户视频字幕生成、翻译及后续编辑等完整工作流的需求。 客户价值:…...

iOS原生应用屏幕适配完整流程
1. 已iPhone 11 布局为设计布局,其他机型已这个来适配 2.变量与控件对应关系 txtViewer: txtAccount txtpwd seg btnOk 3.适配方法实现: //iOS屏幕适配 -(vo...

【征服redis8】Redis的AOF持久化
Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使…...

【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列
作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 二分查找 LeetCode730. 统计不同回文子序列 给你一个字符串 s ,返回 s 中不同的非空回文子序列个数 。由于答案可能很大,请返回对 109 7 取余 的结果。 字符串的子序列可以经由…...

android 和 opencv 开发环境搭建
本文详细说明给android项目添加opencv库的详细步骤,并通过实现图片灰度化来查看配置是否成功。 下载OPENCV ANDROID SDK 到官网下载 打开 https://opencv.org/releases/ 选择android,下载完成后解压出下面的文件: 安装android sdk 和 ndk …...

elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增)
elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增) 1、初始化 RestClient 在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为 RestHighLevelClient 的类中,必须先完成这个对象的初始化,…...
tp6框架中Http类 请求的header、body参数传参 及post、file格式
引入Http类: 在需要使用的地方引入Http类: use think\facade\Http; GET请求示例:$response Http::get(https://example.com/api/resource); 设置Header参数: $headers [ Authorization > Bearer YourAccessToken, Conte…...
基于极限学习机的图像处理,基于ELM的图像分割,基于极限学习机的细胞分割
目录 背影 极限学习机 基于极限学习机的图像,基于ELM的图像分割 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:基于极限学习机的图像,基于ELM的图像分割(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88759192 背…...

ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术
ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术 ... 代码。这些script会根据模块名字查找模块对应的模块声明文件,并根据该 ... 的地址,注册时需提供模块名和模块重定位表的地址。加 ... 。这个表的表项是“模块名”到“模块重定位表地址”…...
github clone Failed to connect to github.com port 443 after xxx ms
最近克隆github项目时老是报超时,可以尝试以下解决方法 如果本地开启了代理还是clone超时,可以尝试最后一种方式解决 1、把 https 换成 http,如: git clone http:xxx2、更新本地hosts配置,可以参考这篇文章获取最新的…...
ARM的一些基础知识
1.低功耗接口 P-CHANNEL和Q-CHANNEL AMBA低功耗接口(一)Q_Channel_q-channel p-channel-CSDN博客 AMBA低功耗接口(二)P_Channel_p channel-CSDN博客 2.WFI和WFE指令 ARM WFI和WFE指令 ARM hint instruction-WFI(Wait For In…...

零售的数字化转型,利用AWS云服务资源如何操作?
国内市场趋于饱满,各行各业的发展接近瓶颈,就连零售行业都竞争激烈,随处可见的零售小店也预示着需要投入大量的人力,而且由于消费者的行为和预期已经发生了根本性变化,这迫使零售商不得不加速整个价值链的数字化转型&a…...
【通知】我的教学文章《Rust跟我学》已全部上线
大家好,我是get_local_info开源库作者带剑书生,现在我的《Rust跟我学》专栏文章已全部上线,它记录了我在写库时获得的重要Rust经验和技巧,是不同于《Rust语言编程》等简单实践的书籍。为您节省了学习时间,让您可以快速…...

Docker安全基线检查需要修复的一些问题
一、可能出现的漏洞 限制容器之间的网络流量 限制容器的内存使用量 为Docker启用内容信任 将容器的根文件系统挂载为只读 审核Docker文件和目录 默认情况下,同一主机上的容器之间允许所有网络通信。 如果不需要,请限制所有容器间的通信。 将需要相互通…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...