SpringMVC(3)——SpringMVC注解实战
前言
SpringMVC(2)——controller方法参数与html表单对应(请求参数的绑定)
上篇博客我们提到了controller方法的参数与html表单之间的对应关系
但是这种对应关系有很多缺点:
- 传递参数只能放在request的body当中,url参数无法获取
- 传递参数无法设置哪些不可为空,哪些可以为空
SpringMVC为了简化这些繁琐的操作,为前后端字段的转换提供了一些很方便的注解
RequestParam注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default ValueConstants.DEFAULT_NONE;}
可以设置是否必传,默认值,还有对应前端的字段名
value/name属性
作用相同。指定前端form表单传递的参数的名称
required属性
默认true,表示必传,前端若想调用此controller的此方法,必须保证此字段有值
设置为false则表示可以不传
defaultValue属性
表示默认值,只有required属性为false时才会生效,而且只能指定为字符串类型
demo
@Controller
@RequestMapping("/paramAnno")
public class ParamAnnoController {@RequestMapping("/requestParam")public String requestParamAnno(@RequestParam(value = "name") String username,@RequestParam(required = false) Integer age,@RequestParam(value = "id") Long id) {System.out.println("@RequestParam注解使用生效!");System.out.println("name:" + username + ",age:" + age + ",id:" + id);return "suc";}
jsp页面的表单部分
<h3>@RequestParam测试</h3><form action="/paramAnno/requestParam" method="post">姓名:<input type="text" name="name"/><br/>年龄:<input type="text" name="age"/><br/>id:<input type="text" name="id"/><br/><input type="submit" value="提交"/>
</form>
@RequestBody注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {/*** Whether body content is required.* <p>Default is {@code true}, leading to an exception thrown in case* there is no body content. Switch this to {@code false} if you prefer* {@code null} to be passed when the body content is {@code null}.* @since 3.2*/boolean required() default true;}
只有一个required属性,表示可传可不传
表示前端传一个js对象给后端,js对象中可以包含各种属性
如果想要对应后端的实体类对象,需要前端使用js封装为js对象发送给后端,form表单做不到发送js对象
我们这里用String代替
@PostMapping(value = "/requestBody")public String requestBodyAnno(@RequestBody String body) {System.out.println("@RequestBody注解使用生效!");System.out.println(body);return "suc";}
<form action="/paramAnno/requestBody" method="post">f1:<input type="text" name="fun.f1"/><br/>f2:<input type="text" name="fun.f2"/><br/>f3:<input type="text" name="fun.f3"/><br/>list0.f1:<input type="text" name="list[0].f1"/><br/>list0.f2:<input type="text" name="list[0].f2"/><br/>list0.f3:<input type="text" name="list[0].f3"/><br/>list1.f1:<input type="text" name="list[1].f1"/><br/>list1.f2:<input type="text" name="list[1].f2"/><br/>list1.f3:<input type="text" name="list[1].f3"/><br/>birthday:<input type="text" name="birthday"/><br/>map.f1:<input type="text" name="map['fun'].f1"/><br/>map.f2:<input type="text" name="map['fun'].f2"/><br/>map.f3:<input type="text" name="map['fun'].f3"/><br/><input type="submit" value="提交"/>
</form>

@PathVariable注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {/*** Alias for {@link #name}.*/@AliasFor("name")String value() default "";/*** The name of the path variable to bind to.* @since 4.3.3*/@AliasFor("value")String name() default "";/*** Whether the path variable is required.* <p>Defaults to {@code true}, leading to an exception being thrown if the path* variable is missing in the incoming request. Switch this to {@code false} if* you prefer a {@code null} or Java 8 {@code java.util.Optional} in this case.* e.g. on a {@code ModelAttribute} method which serves for different requests.* @since 4.3.3*/boolean required() default true;}
属性作用同上,这里不再赘述
此注解适用于js基本类型,不适用于js对象
作用是直接在请求的url中拼接我们想要的内容,比如数字,字符串等
需要在@RequestMapping中添加{}指定拼接的位置进行使用
@PostMapping("/pathVariable/{id}")public String pathVariableAnno(@PathVariable Long id) {System.out.println("@PathVariable注解使用生效!");System.out.println(id);return "suc";}
<h3>@PathVariable测试</h3><form action="/paramAnno/pathVariable" method="post"><input type="submit" value="提交"/>
</form>

@RequestHeader
作用:获取指定请求头的值
请求头包含很多属性

@PostMapping(value = "/requestHeader")public String requestHeaderAnno(@RequestHeader(value = "content-type") String contentType,@RequestHeader("Accept") String accept) {System.out.println("@RequestHeader注解使用生效!");System.out.println(contentType);System.out.println(accept);return "suc";}
<h3>@RequestHeader测试</h3><form action="/paramAnno/requestHeader" method="post"><input type="submit" value="提交"/>
</form>

@CookieValue注解
后端获取前端指定cookie的值
@PostMapping("/cookieSession")public String cookieSessionAnno(@CookieValue(value = "JSESSIONID") String cookie) {System.out.println("@CookieValue注解使用生效!");System.out.println(cookie);return "suc";}
<h3>@CookieSession测试</h3><form action="/paramAnno/cookieSession" method="post"><input type="submit" value="提交"/>
</form>

JSESSIONID其实就是session,是一种标记http请求状态并且安全的浏览器存储
这里的数据都是经过加密的
相关文章:
SpringMVC(3)——SpringMVC注解实战
前言 SpringMVC(2)——controller方法参数与html表单对应(请求参数的绑定) 上篇博客我们提到了controller方法的参数与html表单之间的对应关系 但是这种对应关系有很多缺点: 传递参数只能放在request的body当中&am…...
统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法
原文链接:统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法 Hello,大家好啊!今天给大家带来一篇关于在统信UOS上批量安装惠普打印驱动后启动器没有设置图标的解决方法的文章。批量安装打印驱动是企业和个人用户常见的操作࿰…...
Python UDP编程之实时聊天与网络监控详解
概要 UDP(User Datagram Protocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例…...
LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索
LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索 1、用户管理1.1、添加用户1.2、关联通道1.3、重置密码1.4、编辑1.5、删除1.6、过滤搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、用户管理 1.1、添加用户 点击用户管理…...
SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目
前述: 本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目 使用 Docker Compose 支持部署 Docker 项…...
websocket中的STOMP 协议:sockjs-client 和 stompjs
文章目录 一、简介二、安装三、创建 webSocket.ts四、页面中使用一、简介 使用 WebSockets 进行实时通信时,一种常见的实现方式是使用 STOMP 协议。STOMP(Simple Text Oriented Messaging Protocol)是一种轻量级的协议,通常用于客户端和消息代理之间的通信,如 WebSockets…...
阿里云API安全2.0全新发布
阿里云安全发布API防护产品已将近三年,为客户提供API资产全生命周期监控管理,发现和管理业务中存在的全量API接口资产,并提升API接口在数据流转过程中的安全性,现已全面覆盖OWASP提出的API TOP 10安全风险。 近期,阿里…...
学习网络的第一步:全面解析OSI与TCP/IP模型
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…...
鸿蒙语言基础类库:【@ohos.util (util工具函数)】
util工具函数 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…...
CVPR`24 | 又快又好!渲染速度比ENeRF快30倍!4K4D:实时4K分辨率4D视图合成
文章链接:https://arxiv.org/pdf/2310.11448 git链接: https://zju3dv.github.io/4k4d/ 本文旨在实现动态3D场景在4K分辨率下的高保真和实时视图合成。最近,一些动态视图合成方法在渲染质量方面表现出色。然而,在渲染高分辨率图像…...
中关村软件园发布“数据合规与出境评估服务平台”
在2024中关村论坛年会期间,中关村软件园发布“数据合规与出境评估服务平台”。该平台是中关村软件园结合北京市“两区”建设,立足软件园国家数字服务出口基地和数字贸易港建设,围绕园区内外部企业用户的业务合作、科研创新、跨国运营等场景需…...
记一次若依框架和Springboot常见报错的实战漏洞挖掘
目录 前言 本次测实战利用图 1.判段系统框架 2.登录页面功能点测试 2.1 弱口令 2.2 webpack泄露信息判断 2.3 未授权接口信息发现 3.进一步测试发现新的若依测试点 3.1 默认弱口令 3.2 历史漏洞 4.访问8080端口发现spring经典爆粗 4.1 druid弱口令 4.2 SwaggerU…...
Idea合并Git分支信息
#git 的笔记 ##本篇文章是通过Idea 实现git 命令操作的代码的上传与合并。 1.合并分支 点击 Git 选择Merge 这里选择合并远程的分支...
【学习css2】grid布局-页面footer部分保持在网页底部
中间内容高度不够屏幕高度撑不开的页面时候,页面footer部分都能保持在网页页脚(最底部)的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…...
Django 表单
Django 表单 Django 表单是 Web 开发中不可或缺的一部分,它允许用户与网站进行交互,如提交数据、上传文件等。在 Django 框架中,表单功能非常强大,支持各种自定义和验证,使得开发者能够轻松地处理用户输入。本文将详细介绍 Django 表单的使用方法,包括创建表单、表单字段…...
【Linux网络】网络基础
本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1)协议的作用 2)协议栈 3)协议分层…...
Open3D 可视化点云配准中匹配点之间的连线
目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后的点云 一、概述 在点云配准的过程中,可视化匹配点之间的连线(匹配线)有助于更直观地理解配准结果和误差分布。以下是可视化匹配点之间连线的好处和作用: 1. 直观理…...
Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)
业精于勤荒于嬉,行成于思毁于随。 今天这篇算是Linux的正式学习,废话不多说,我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…...
【JavaSE复习】数据结构、集合
JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展(无规律数据) 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…...
Java版Flink使用指南——自定义无界流生成器
大纲 新建工程自定义无界流 使用打包、提交、运行工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们让外部组件RabbitMQ充当了无界流的数据源,使得Flink进行了流式处理。在《Java版Flink使用指南——将消息写入到RabbitMQ…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
