深入理解Spring MVC下
上一篇博客从理论概念上来梳理Spring MVC相关知识,此篇博客将通过spring官网提供showcase代码为例子,详细介绍showcase代码中包含的各个例子是如何实现的。官网的showcase代码包含的主要例子包括,Demo地址:
Mapping Requests:请求匹配
Obtaining Request Data:请求中包含各种参数
Generating Responses:生成response
Message Converters:消息转换
Rendering Views:渲染view下面的js文件
Type Conversion:类型转换
Validation:对象严重
Forms:表单处理
File Upload:上传文件
Exception Handling:异常处理
下载代码,执行“mvn jetty:run”,启动应用,访问“http://localhost:8080/spring-mvc-showcase/”,会看到如下界面,每个tab按钮包含一种类型的demo例子。

查看代码目录,在config目录下的WebMvcConfig class文件里面进行了spring mvc相关的配置,通过添加@EnableWebMvc开启了spring mvc相关的自动配置,再通过@Override对部分配置进行自定义,例如自定义静态资源的存放位置,定义Resolver中的jsp文件目录和后缀等,定义了"/"目录下的viewname是home,所以打开上面地址后,实际mapping到的是home.jsp文件。

Views的例子
上面的showcase中例子很多,这里会抽取一部分例子进行讲解,首先来看看views目录下的代码,定义了一个JavaBean对象,定义了一个ViewsController,以下图的controller为例,返回的视图名称是“views/html”,因为配置文件中定义了registry.jsp的路径是“/WEB-INF/views/",所以,mapping出来的jsp文件路是“/WEB-INF/views/views/html.jsp"文件,在浏览器中访问这个controller定义的路径,实际显示的就是html.jsp文件中的内容。另外,在controller中通过model.addAttribute(virableName,value)设置属性,在home.js文件中,通过${virableName}引用属性的值。

Validation的例子
如下图所示,在对象中可以添加各种限制条件,例如@NotNull,@Future等,对象中添加限制条件后,在controller中天际@Valid注解,如果传入的对象值不符合限制条件,则会报错。

Response的例子
如下图所示,使用 ResponseEntity 可以灵活地控制 HTTP 响应的各个方面。例如,您可以设置状态码、响应头和响应体。通过设置响应体,您可以返回一个对象或一个集合,并自动将其转换为 JSON 格式或其他格式。

上面的例子ResponseEntity的body是String类型,实际项目中更多的是返回一个Java对象,例如下面的例子返回从数据库查询得到的User对象。

Redirect的例子
在 Spring MVC 中,重定向可以使用 redirect: 前缀来实现。如果需要在重定向请求中传递参数,可以使用 RedirectAttributes。例子如下图所示,需要注意一点:重定向返回的是一个字符串,而不是 ModelAndView 对象或 ResponseEntity 对象。

showcase的例子中,通过不同的方式将url重定向到了/redirect/{account},mapping过去,渲染显示的文件是/WEB-INF/views/redirect/redirectResults.jsp文件。
Message Convert例子
在上一篇博客中列举了spring mvc提供的Message Convert组件,这些组件无需程序员显式配置,因为Spring MVC默认提供的Message Converter组件,在初始化时自动注册到应用程序上下文中。Spring MVC能根据header中设置的消息的格式,自动选择合理的消息转换器将对象转换成期望的格式,并显示在前端页面上。
在showcase的例子中,message convert例子中以读写xml格式和json格式为例子,返回都是JavaBean对象,这是因为请求或者响应的content-Type在home.jsp文件中进行了设置,所以,能按照例子说明的格式返回期望格式的信息,关键代码片断如下所示:

FileUpload例子
MultipartFile是Spring MVC中用于处理文件上传的类,它可以将上传的文件封装成MultipartFile对象并进行处理。下面的例子中通过@RequestParam注解将上传的文件封装成MultipartFile对象。在处理上传文件之前,首先判断文件是否为空,然后获取文件的原始名称、大小和类型等信息,最后使用MultipartFile的transferTo方法将文件保存到本地磁盘上。注意,上述代码中的路径D:\upload\是一个本地路径,需要根据实际情况进行修改。此外,还需要在Spring MVC的配置文件中配置MultipartResolver,以便正确处理文件上传请求。

Ajax使用说明
在处理上传文件的例子中,实际还使用了Ajax,所以这里对Ajax相关的内容进行补充说明。Ajax(Asynchronous JavaScript and XML)实际是一种在Web应用程序中使用的技术,它可以通过异步方式向服务器发送请求并获取响应,而不需要重新加载整个页面。而jQuery是一个非常流行的JavaScript库,其中包含了许多简化DOM操作和Ajax请求的方法,因此通常被用于实现Ajax请求。
下面是一段用Ajax写的Demo代码。在Controller中定义好get/post方法,在html.jsp页面上添加调用Ajax的代码。在下面的代码中,首先引入了jQuery库,并在页面加载完成后使用$函数进行初始化。然后,通过click事件监听提交按钮的点击,并在点击事件中使用$.ajax方法向服务器发送Ajax请求。在Ajax请求中,设置了请求的URL、请求类型、请求数据和回调函数等参数。最后,使用一个<div>元素来显示服务器返回的响应数据。
<!DOCTYPE html>
<html>
<head><title>Ajax Demo</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script><script>$(function() {$('#submit-btn').click(function() {var message = $('#message').val();$.ajax({url: '/ajax/echo',type: 'POST',data: {msg: message},success: function(data) {$('#result').text(data);},error: function() {$('#result').text('Error!');}});});});</script>
</head>
<body><input type="text" id="message" placeholder="请输入消息" /><button id="submit-btn">提交</button><div id="result"></div>
</body>
</html>查看spring-mvc-showcase的home.jsp文件,里面有有大量ajax的请求调用,部分代码截图如下所示:可以看到在<script>标签下有很多监听click,submit的function(),function()里面实际调用的就是ajax请求,ajax请求调用的就是controller中定义的get/post等方法。

相关文章:
深入理解Spring MVC下
上一篇博客从理论概念上来梳理Spring MVC相关知识,此篇博客将通过spring官网提供showcase代码为例子,详细介绍showcase代码中包含的各个例子是如何实现的。官网的showcase代码包含的主要例子包括,Demo地址:Mapping Requests&#…...
【Linux】ssh-keygen不需要回车,自动生成密钥,批量免密操作!
使用命令ssh-keygen 需要手动敲击回车,才会生成密钥,如下代码所示 [rootlocalhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase):…...
C/C++开发,无可避免的内存管理(篇四)-智能指针备选
一、智能指针 采用C/C开发堆内存管理无论是底层开发还是上层应用,无论是开发新手,还是多年的老手,都会不自觉中招,尤其是那些不是自己一手经历的代码,要追溯问题出在哪里更是个麻烦事。C/C程序常常会遇到程序突然退出&…...
VMware ESXi给虚拟机扩容
用ESXi管理的虚拟机硬盘空间不够了,讲一下如何进行扩容。 一、查看现状 通过如下三个命令,可以查看硬盘情况,可以看到只有500G,已经用了45%。这次我们再扩容500G。 df -Th lsblk fdisk -lIDE磁盘的文件名为 /de…...
认识STM32和如何构建STM32工程
STM32介绍什么是单片机单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种/0口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电…...
RabbitMQ延迟队列
目录 一、概念 二、使用场景 三、RabbitMQ 中的 TTL (一)队列设置 TTL (二)消息设置 TTL (三)两者的区别 四、整合SpringBoot实现延迟队列 (一)创建项目 (二&am…...
Java中常用的七种队列你了解多少?
文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用?添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用?1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…...
<Java获取时间日期工具类>常见八种场景(一)
一:自定义时间日期工具类常用的八种方式(整理): 0,getTimeSecondNum:时间日期转成秒数,常用于大小比较 1,getLastYearMonthLastDay:获取去年当月最后一天的时间日期 2,getLastYearM…...
接上一篇 对多个模型环形旋转进行优化 指定旋转位置
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class ModelAnimal : MonoBehaviour { //记录鼠标滑动 public Vector2 lastPos;//鼠标上次位置 Vector2 currPos;//鼠标当前位置 Vector2 offset;//两次位置的偏移…...
Unity中获取地形的法线
序之前,生成了地形图:(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末,地形的法线贴图怎么获取?大概分为两个部分吧,先拿到法线数据,再画到纹理中去。关于法线计算Unity - Scripting API: M…...
模型解释性:PFI、PDP、ICE等包的用法
本篇主要介绍几种其他较常用的模型解释性方法。 1. Permutation Feature Importance(PFI) 1.1 算法原理 置换特征重要性(Permutation Feature Importance)的概念很简单,其衡量特征重要性的方法如下:计算特征改变后模型预测误差的增加。如果打乱该特征的…...
spring常见面试题(2023最新)
目录前言1.spring是什么2.spring的设计核心是什么3.IOC和AOP面试题4.spring的优点和缺点5.spring中bean的作用域6.spring中bean的注入方式7.BeanFactory 和 ApplicationContext有什么区别?8.循环依赖的情况,怎么解决?9.spring中单例Bean是线程…...
华为OD机试题,用 Java 解【压缩报文还原】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
机器学习-BM-FKNCN、BM-FKNN等分类器对比实验
目录 一、简介和环境准备 二、算法简介 2.1四种方法类: 2.1.1FKNN 2.1.2FKNCN 2.1.3BM-FKNN 2.1.3BM-FKNCN 2.2数据预处理 2.3输出视图 2.4调用各种方法看准确率 2.4.1BM-FKNCN 2.4.2BM-FKNN 2.4.3FKNCN 2.4.4FKNN 2.4.5KNN 一、简介和环境准备 k…...
ChatGPT火了,对话式人工智能还能干嘛?
身兼数职的ChatGPT 从2022火到了2023 连日来一直是各大平台的热议对象 其实除了写诗、敲代码、处理文档 以ChatGPT为代表的 对话式人工智能 还有更重要的工作要做 对话式AI与聊天机器人 相信大多数人…...
十一、操作数栈的特点(Operand Sstack)
1.每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以称之为表达式栈。 2.操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据,或提取数据,即入栈ÿ…...
拆解瑞幸新用户激活流程,如何让用户“动”起来?
Aha时刻 一个产品的拉新环节,是多种方式并存的;新用户可能来自于商务搭建了新的渠道,运营策划了新的活动,企划发布了新的广告,销售谈下了新的客户,市场推广了新的群体,以及产品本身的口碑传播,功能更新带来的自然流量。 这是一个群策群力的环节,不同的团队背负不同的K…...
tkinter界面的TCP通信/开启线程等待接收数据
前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面,在测试的时候就利用TCP客户端来实验,文末会附上TCP客户端。本文分为三部分,第一部分是在界面向TCP发送数据,第二部分是接收…...
华为OD机试题,用 Java 解【任务混部】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
看linux内核启动流程需要的汇编指令解释
一、指令 0.MRS 和MSR MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。 MSR指令: 对状态寄存器CPSR和SPSR进行写操作。 1.adrp adrp x0, boot_args把boot_args的页基地址提取出来,放到x0中。 2.stp stp x21, x1, [x0]将 x21, x1 的值存入 x0寄存器记录的地址中…...
万物皆含意识:基于 OFIRM 框架下“信息闭合与自动确认”机制的本体论重构(声明:这是一个理论假说)
万物皆含意识:基于 OFIRM 框架下“信息闭合与自动确认”机制的本体论重构——对德布罗意物质波假说的对称性扩展与量子测量问题的去玄学化解作者:Haiting Allen Chen对应理论:本源场直觉共振模型 (OFIRM)___________________________________…...
Wan2.2-I2V-A14B极限测试:高分辨率与长视频生成的稳定性挑战
Wan2.2-I2V-A14B极限测试:高分辨率与长视频生成的稳定性挑战 1. 开场白:当AI视频生成遇上极限挑战 最近在测试Wan2.2-I2V-A14B模型时,我突发奇想:这个在常规场景下表现优秀的视频生成模型,如果被推到极限会怎样&…...
Beyond Compare 5密钥生成器:专业文件对比工具的永久激活方案
Beyond Compare 5密钥生成器:专业文件对比工具的永久激活方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否正在为Beyond Compare 5的30天评估期到期而烦恼?这款…...
MangoHud与Vulkan视频编码协议:AV1监控完全指南
MangoHud与Vulkan视频编码协议:AV1监控完全指南 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. Discord: https://discordapp.com/invite/Gj5YmBb 项目地址: https://gitcode.com/gh_mirrors/…...
毕设程序java师生交流系统的设计与实现 基于Java的师生互动教学平台设计与实现 基于SpringBoot的在线教育沟通系统开发
毕设程序java师生交流系统的设计与实现343xt8ar(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,传统的教育模式正在经历一场深刻的变革。互联…...
OpenClaw语音交互方案:Qwen3-32B镜像对接Whisper实时转写
OpenClaw语音交互方案:Qwen3-32B镜像对接Whisper实时转写 1. 为什么需要语音交互方案 作为一个长期与命令行打交道的开发者,我始终在寻找更自然的交互方式。键盘输入固然高效,但在某些场景下——比如双手被占用时调试代码、厨房里边做饭边查…...
深度技术解析:IDM激活脚本(IAS)的注册表锁定机制与长期试用方案
深度技术解析:IDM激活脚本(IAS)的注册表锁定机制与长期试用方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Dow…...
GLM-OCR技术解析专栏:在CSDN分享模型优化心得
GLM-OCR技术解析专栏:在CSDN分享模型优化心得 大家好,我是老张,一个在AI和计算机视觉领域摸爬滚打了十来年的工程师。最近几年,OCR(光学字符识别)技术发展得飞快,从过去只能识别清晰打印体&…...
macOS风格光标主题:从视觉革新到交互未来的全面探索
macOS风格光标主题:从视觉革新到交互未来的全面探索 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor 价值解析:重新定义数字交互的视觉语言 在当今多设备协同的…...
[特殊字符] Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程
Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程 1. 项目简介 Meixiong Niannian画图引擎是一款专为个人GPU设计的轻量化文本生成图像系统,基于Z-Image-Turbo底座和meixiong Niannian Turbo LoRA技术构建。这个引擎针对通用画图场景进…...
