【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文件和目录 默认情况下,同一主机上的容器之间允许所有网络通信。 如果不需要,请限制所有容器间的通信。 将需要相互通…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
