SpringMVC(3)——SpringMVC注解实战

news2024/9/20 10:45:52

前言

SpringMVC(2)——controller方法参数与html表单对应(请求参数的绑定)

上篇博客我们提到了controller方法的参数与html表单之间的对应关系

但是这种对应关系有很多缺点:

  1. 传递参数只能放在request的body当中,url参数无法获取
  2. 传递参数无法设置哪些不可为空,哪些可以为空

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请求状态并且安全的浏览器存储

这里的数据都是经过加密的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW与ABB工业机器人据监控

​1. 前言 随着工业自动化的发展&#xff0c;工业机器人在制造业中的应用越来越广泛。为了实现对工业机器人的高效监控和控制&#xff0c;本文介绍了利用OPC&#xff08;OLE for Process Control&#xff09;服务器将ABB工业机器人与LabVIEW连接起来的解决方案。通过OPC服务器…

Python——使用Seaborn钻石数据可视化分析(1)

目录 🧾 1、数据集(部分数据) ✏️ 2、导入数据集与必要模块 1️⃣ 导入数据 📍 通过info函数查看所有列数据的类型信息 2️⃣ 导入Seaborn工具包 📍 set_context 设置图形绘制时的上下文参数 📍 set_style 设置绘图风格 📍 set_palette 设置图标全局颜色…

数智驱动丨zAIoT 连续落地军工、科研院所和机械制造场景,推动数智化转型升级...

引言 在这个万物互联的时代&#xff0c;科技的进步正以不可阻挡之势&#xff0c;深刻地影响并重塑我们的生产和生活方式。数智化转型升级在各个领域展现出强大的动力&#xff0c;已经成为推动社会向前发展的关键力量。 最近&#xff0c;云和恩墨自主研发的数据智能分析处理平台…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

从小主机到第一台自组装NAS:升级与优化记录

目录 前言硬件系统安装的波折过程问题解决系统安装 套件/dockerjellyfin 功耗测试刚安装好系统插上缓存盘且运行了更多的套件和 docker 容器之后 温度场景一场景二场景三 后记参考 在使用了一年的小主机 NAS 后&#xff0c;我决定自己组装并安装新 NAS。本文详细记录了硬件选择…

Audio Toolbox 框架简介

Audio Toolbox 框架简介 Audio Toolbox 框架简介Audio Unit播放和录制音频文件和格式 Audio Toolbox 框架简介 AudioToolbox 框架为录制、播放和流解析提供了接口。在 iOS 中&#xff0c;该框架为管理音频会话提供了额外的接口。 AudioToolbox 框架的基本情况&#xff1a; Au…

海狐外卖O2O商城系统:技术架构与运营模式的深度解析

摘要&#xff1a; 本文深入探讨了海狐外卖O2O商城系统的技术架构、功能特性以及运营模式。海狐外卖作为一款专注于细分市场领域的外卖餐饮解决方案&#xff0c;不仅拥有先进的技术栈支持&#xff0c;还通过丰富的系统插件和灵活的运营模式&#xff0c;为商户和用户提供高效、便…

scratch3编程05-画笔绘制圆及与圆相关的图形

目录 一&#xff0c;圆 1&#xff0c;空心圆 2&#xff0c;实心圆 3&#xff0c;嵌套在一起的圆 4&#xff0c;圆环 二&#xff0c;五角星 1&#xff0c;空心五角星 1&#xff09;思路 2&#xff09;完整的程序 2&#xff0c;实心五角星 1&#xff09;思路 2&…

14-62 剑和诗人36 - 混合专家 (MoE) 扩展 AI 视野

了解混合专家 (MoE) 混合专家 (MoE) 是一种机器学习技术&#xff0c;它将多个“专家”神经网络模型组合成一个更大的模型。MoE 的目标是通过组合专业专家&#xff08;每个专家专注于不同的子领域&#xff09;来提高 AI 系统的准确性和能力。 MoE 模型的一些关键特征&#xff1…

C. Earning on Bets

题目 个人补充&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long longconst int maxn 1e6 5, in…

打印任务无法删除怎么办?

在删除打印任务的时候&#xff0c;你可能会遇到这样的情况&#xff0c;当我们想把打印任务取消的时候&#xff0c;却一直显示正在删除&#xff0c;而过了很久还没有取消掉&#xff0c;下面就分享一下处理这个问题的方法。 1、停止打印服务&#xff0c;按WinR键打开运行对话框&a…

项目进度管理(5-1)常见的缓冲区监控方法

缓冲区监控是一种项目管理技术&#xff0c;主要用于关键链项目管理系统&#xff08;Critical Chain Project Management, CCPM&#xff09;中。它的核心理念是识别和管理项目中的不确定性和依赖性&#xff0c;以提高项目完成的可靠性。 缓冲区监控方法主要是针对项目进度计划执…

Java面试八股之Redis有哪些数据类型?底层实现分别是什么

Redis有哪些数据类型&#xff1f;底层实现分别是什么 Redis数据类型概述 Redis作为一款键值存储系统&#xff0c;提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途&#xff1a; String&#xff08;字符串&#xff09; 存储单个键…

Python | Leetcode Python题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsNearbyAlmostDuplicate(self, nums, k, t):from sortedcontainers import SortedSetst SortedSet()left, right 0, 0res 0while right < len(nums):if right - left > k:st.remove(nums[left]…

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

攻防世界 Web_python_template_injection(flask模版注入)

学习文章&#xff1a;https://www.freebuf.com/column/187845.html https://blog.csdn.net/weixin_54515836/article/details/113778233 flask的渲染方法有render_template和render_template_string两种。 render_template()是用来渲染一个指定的文件的。使用如下 return re…

时序分解 | Matlab基于ESMD极点对称模态分解

时序分解 | Matlab基于ESMD极点对称模态分解 目录 时序分解 | Matlab基于ESMD极点对称模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ESMD&#xff08;Extreme-point Symmetric Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;用于提取信号中的模…

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

2-30 基于matlab的神经网路下身份证号码识别算法

基于matlab的神经网路下身份证号码识别算法&#xff0c;二值化、膨胀处理、边界区域划分、身份证字符分割&#xff0c;字符识别算法&#xff0c;输出识别结果。并保存识别结果。程序已调通&#xff0c;可直接运行。 2-30 神经网络 身份证识别 图像处理 - 小红书 (xiaohongshu.c…

Python强大的数据转换功能库之awswrangler使用详解

概要 在现代数据工程和数据科学领域,AWS(亚马逊云服务)是一个非常重要的平台。它提供了丰富的服务,包括S3、Glue、Redshift等,这些服务在数据存储、处理和分析中发挥了关键作用。Python的awswrangler库是一个强大的工具,旨在简化与AWS服务的交互。awswrangler库提供了一…