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

深入理解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相关知识&#xff0c;此篇博客将通过spring官网提供showcase代码为例子&#xff0c;详细介绍showcase代码中包含的各个例子是如何实现的。官网的showcase代码包含的主要例子包括&#xff0c;Demo地址&#xff1a;Mapping Requests&#…...

【Linux】ssh-keygen不需要回车,自动生成密钥,批量免密操作!

使用命令ssh-keygen 需要手动敲击回车&#xff0c;才会生成密钥&#xff0c;如下代码所示 [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开发堆内存管理无论是底层开发还是上层应用&#xff0c;无论是开发新手&#xff0c;还是多年的老手&#xff0c;都会不自觉中招&#xff0c;尤其是那些不是自己一手经历的代码&#xff0c;要追溯问题出在哪里更是个麻烦事。C/C程序常常会遇到程序突然退出&…...

VMware ESXi给虚拟机扩容

用ESXi管理的虚拟机硬盘空间不够了&#xff0c;讲一下如何进行扩容。 一、查看现状 通过如下三个命令&#xff0c;可以查看硬盘情况&#xff0c;可以看到只有500G&#xff0c;已经用了45%。这次我们再扩容500G。 df -Th lsblk fdisk -lIDE磁盘的文件名为        /de…...

认识STM32和如何构建STM32工程

STM32介绍什么是单片机单片机(Single-Chip Microcomputer)是一种集成电路芯片&#xff0c;把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种/0口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电…...

RabbitMQ延迟队列

目录 一、概念 二、使用场景 三、RabbitMQ 中的 TTL &#xff08;一&#xff09;队列设置 TTL &#xff08;二&#xff09;消息设置 TTL &#xff08;三&#xff09;两者的区别 四、整合SpringBoot实现延迟队列 &#xff08;一&#xff09;创建项目 &#xff08;二&am…...

Java中常用的七种队列你了解多少?

文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用&#xff1f;添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用&#xff1f;1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…...

<Java获取时间日期工具类>常见八种场景(一)

一:自定义时间日期工具类常用的八种方式&#xff08;整理&#xff09;: 0&#xff0c;getTimeSecondNum&#xff1a;时间日期转成秒数&#xff0c;常用于大小比较 1&#xff0c;getLastYearMonthLastDay&#xff1a;获取去年当月最后一天的时间日期 2&#xff0c;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中获取地形的法线

序之前&#xff0c;生成了地形图&#xff1a;(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末&#xff0c;地形的法线贴图怎么获取&#xff1f;大概分为两个部分吧&#xff0c;先拿到法线数据&#xff0c;再画到纹理中去。关于法线计算Unity - Scripting API: M…...

模型解释性:PFI、PDP、ICE等包的用法

本篇主要介绍几种其他较常用的模型解释性方法。 1. Permutation Feature Importance(PFI) 1.1 算法原理 置换特征重要性(Permutation Feature Importance)的概念很简单&#xff0c;其衡量特征重要性的方法如下&#xff1a;计算特征改变后模型预测误差的增加。如果打乱该特征的…...

spring常见面试题(2023最新)

目录前言1.spring是什么2.spring的设计核心是什么3.IOC和AOP面试题4.spring的优点和缺点5.spring中bean的作用域6.spring中bean的注入方式7.BeanFactory 和 ApplicationContext有什么区别&#xff1f;8.循环依赖的情况&#xff0c;怎么解决&#xff1f;9.spring中单例Bean是线程…...

华为OD机试题,用 Java 解【压缩报文还原】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

机器学习-BM-FKNCN、BM-FKNN等分类器对比实验

目录 一、简介和环境准备 二、算法简介 2.1四种方法类&#xff1a; 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.每一个独立的栈帧中除了包含局部变量表以外&#xff0c;还包含一个后进先出的操作数栈&#xff0c;也可以称之为表达式栈。 2.操作数栈&#xff0c;在方法执行过程中&#xff0c;根据字节码指令&#xff0c;往栈中写入数据&#xff0c;或提取数据&#xff0c;即入栈&#xff…...

拆解瑞幸新用户激活流程,如何让用户“动”起来?

Aha时刻 一个产品的拉新环节,是多种方式并存的;新用户可能来自于商务搭建了新的渠道,运营策划了新的活动,企划发布了新的广告,销售谈下了新的客户,市场推广了新的群体,以及产品本身的口碑传播,功能更新带来的自然流量。 这是一个群策群力的环节,不同的团队背负不同的K…...

tkinter界面的TCP通信/开启线程等待接收数据

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…...

华为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的页基地址提取出来&#xff0c;放到x0中。 2.stp stp x21, x1, [x0]将 x21, x1 的值存入 x0寄存器记录的地址中…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...