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

SpringMVC 学习(四)之获取请求参数

目录

1 通过 HttpServletRequest 获取请求参数

2 通过控制器方法的形参获取请求参数

3 通过 POJO 获取请求参数(重点)


1 通过 HttpServletRequest 获取请求参数

 public String handler1(HttpServletRequest request)

<form action="${pageContext.request.contextPath}/login/test1" method="get">用户名: <input type="text" name="username"/> <br>密 码: <input type="password" name="password"/> <br><input type="submit" />
</form>@Controller
@RequestMapping("/login")
public class MyController {@RequestMapping(value = "/?est1")public String handler1(HttpServletRequest request) {System.out.println("处理器1");// 通过 HttpServletRequest 获取请求参数String username= request.getParameter("username");String password = request.getParameter("password");System.out.println("username:" + username + " password:" + password);return "success";}
}

2 通过控制器方法的形参获取请求参数

public String handler1(String username, String password)

<input type="text" name="username"/>
<input type="password" name="password"/>

控制器方法的形参必须和前端 name 的属性值一致,如控制器方法的形参 username 和 password 要和 input 标签中的 name 属性值 username 和 password 一致

<form action="${pageContext.request.contextPath}/login/test1" method="get">用户名: <input type="text" name="username"/> <br>密 码: <input type="password" name="password"/> <br><input type="submit" />
</form>@Controller
@RequestMapping("/login")
public class MyController {@RequestMapping(value = "/?est1")// 通过 形参 获取请求参数public String handler1(String username, String password) {System.out.println("处理器1");System.out.println("username:" + username + " password:" + password);return "success";}
}

        @RequestParam 注解用于将请求参数的数据映射到 Handler 方法(控制器方法)的形参上,相当于给请求参数重命名。如有时有一些特殊情况,前端的 name 属性值与后端 Handler 方法中的形参不一致,这个时候就可以通过 @RequestParam 注解来解决。

语法:@RequestParam(value=”参数名”,required=”true|false”,defaultValue=””)

  • value:请求中传入参数的名称
  • required:该参数是否为必传项,默认为 true,表示该请求路径中必须包含该参数,如果不包含就报错;若设置为 false,则表示该请求路径中不必包含该参数,若没有传输该参数,则注解所标识的形参的值为 null
  • defaultValue:设置默认参数值,如果设置了该值,required=true 将失效,自动为 false,如果没有传该参数,就使用默认值
<form action="${pageContext.request.contextPath}/login/test1" method="get">密 码: <input type="password" name="password"/> <br><input type="submit" />
</form>@Controller
@RequestMapping("/login")
public class MyController {@RequestMapping(value = "/?est1")// 通过 形参 获取请求参数public String handler1(@RequestParam(value = "name", required = true, defaultValue = "赵飞燕") String username,String password) {System.out.println("处理器1");System.out.println("username:" + username + " password:" + password);return "success";}
}

        上述代码中,请求路径中没有请求参数 name,但是 @RequestParam(value = "name", required = true, defaultValue = "赵飞燕") String username,会将默认值 "赵飞燕" 赋值给 username,最终输出 username:赵飞燕 password=123

运行结果

补充:

@RequestHeader 注解

  • @RequestHeader 注解是将请求头信息和控制器方法的形参创建映射关系
  • @RequestHeader 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam 注​​​v

@CookieValue 注解

  • @CookieValue 注解是将 cookie 数据和控制器方法的形参创建映射关系
  • @CookieValue 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam 注解

3 通过 POJO 获取请求参数(重点)

        POJO 全称“Plain Old Java Object”,意思是“简单 Java 对象”。POJO 的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的 Java 对象。

        可以在控制器方法的形参位置设置一个实体类类型的形参,若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

测试案例:用请求参数为以下 User 类中的属性赋值,具体用法请看代码

    // 普通数据
    private String username;
    // 对象
    private UserInfo userInfo;
    // 数组
    private String hobbys[];
    // 列表
    private List<String> titles;
    // Map
    private Map<String, Company> companys

login.jsp

提示:以下代码中 userInfo 是对象,age、height 是它的属性。 hobbys 可以是 hobbsy[0],指定在数组中存放的位置。同理,titles[0] 可以为 titles,不指定在列表中存放的位置,按照请求参数的顺序来。此外,可以不按照顺序来,如第一个 hobbys[0],下一个为 hobbys[2],中间的 hobbys[1] 没有,默认为 null。对于 companys['公司1'].companyName / values,根据 private Map<String, Company> companys,'公司' 是 key,companys['公司1'] 为 value,也就是 Company 对象,companyName、values 是它的属性。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body><form action="${pageContext.request.contextPath}/login/test1" method="get">用户名: <input type="text" name="username" value="赵飞燕"/> <br>年龄: <input type="text" name="userInfo.age" value="18"/> <br>身高: <input type="text" name="userInfo.height" value="168"/> <br>爱好: <input type="checkbox" name="hobbys" value="追剧" checked="checked">追剧<input type="checkbox" name="hobbys" value="画画" checked="checked">画画<input type="checkbox" name="hobbys" value="健身" checked="checked">健身<br>头衔1: <input type="text" name="titles[0]" value="智慧女神"/> <br>头衔2: <input type="text" name="titles[1]" value="幸运之神"/> <br>公司1名称: <input type="text" name="companys['公司1'].companyName" value="肯德基"/> <br>公司1市值: <input type="text" name="companys['公司1'].values" value="12亿"/> <br>公司2名称: <input type="text" name="companys['公司2'].companyName" value="黑马"/> <br>公司2市值: <input type="text" name="companys['公司2'].values" value="15亿"/> <br><input type="submit" /></form>
</body>

User 类

public class User {// 普通数据private String username;// 对象private UserInfo userInfo;// 数组private String hobbys[];// 列表private List<String> titles;// Mapprivate Map<String, Company> companys;// setter、getter 方法省略
}

控制器 MyController

@Controller
@RequestMapping("/login")
public class MyController {@RequestMapping(value = "/?est1")// 通过 形参 获取请求参数public String handler1(User user) {String username = user.getUsername();int age = user.getUserInfo().getAge();int height = user.getUserInfo().getHeight();String hobbys[] = user.getHobbys();List<String> titles = user.getTitles();Map<String, Company> companys = user.getCompanys();// 普通参数System.out.println("用户姓名:" + username);// 对象System.out.println("用户年龄:" + age);System.out.println("用户身高:" + height);// 数组System.out.print("用户爱好:");for(String hobby : hobbys) {System.out.print(" " + hobby);}System.out.println();// ListSystem.out.print("称号:");for(String title : titles) {System.out.print(" " + title);}System.out.println();// MapSet<Map.Entry<String, Company>> entries = companys.entrySet();for (Map.Entry<String, Company> entry : entries) {System.out.println(entry.getKey() + ":" + entry.getValue().getCompanyName() + "市值:" + entry.getValue().getValues());}return "success";}
}

company 类

public class Company {private String companyName;private String values;// setter、getter 方法省略
}

Userinfo 类

public class UserInfo {private int age;private int height;// setter、getter 方法省略
}

执行结果

相关文章:

SpringMVC 学习(四)之获取请求参数

目录 1 通过 HttpServletRequest 获取请求参数 2 通过控制器方法的形参获取请求参数 3 通过 POJO 获取请求参数&#xff08;重点&#xff09; 1 通过 HttpServletRequest 获取请求参数 public String handler1(HttpServletRequest request) <form action"${pageCont…...

多模态表征—CLIP及中文版Chinese-CLIP:理论讲解、代码微调与论文阅读

我之前一直在使用CLIP/Chinese-CLIP&#xff0c;但并未进行过系统的疏导。这次正好可以详细解释一下。相比于CLIP模型&#xff0c;Chinese-CLIP更适合我们的应用和微调&#xff0c;因为原始的CLIP模型只支持英文&#xff0c;对于我们的中文应用来说不够友好。Chinese-CLIP很好地…...

Git本地分支关联远程分支

Git本地分支关联远程分支 本地分支相关操作 查看本地分支 git branch新建本地分支 git branch name切换本地分支 git checkout name新建本地分支并切换到该分支 git checkout -b name #或 git branch name删除本地分支 git branch -d name git branch -D name #强制删除远程分…...

[FT]chatglm2微调

1.准备工作 显卡一张&#xff1a;A卡&#xff0c;H卡都可以&#xff0c;微调需要一张&#xff0c;大概显存得30~40G吧环境安装&#xff1a; 尽量在虚拟环境安装&#xff1a;参见&#xff0c;https://blog.csdn.net/u010212101/article/details/103351853环境安装参见&#xff…...

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手&#xff1a;以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作&#xff0c;包括编写复杂的SQL语句、分析性能指标和解决各种…...

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…...

AD9226 65M采样 模数转换

目录 AD9220_ReadTEST AD9220_ReadModule AD9226_TEST_tb 自己再写个 260M的时钟&#xff0c;四分频来提供65M的时钟。 用 vivado 写的 AD9226_ReadTEST module AD9226_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数…...

远程控制桌面,让电脑办公更简单

随着科技的不断发展&#xff0c;远程办公已经成为了越来得越多企业和个人的选择。远程控制电脑办公&#xff0c;仅需1款软件即可轻松get&#xff01; 1.绿虫电脑管理软件 是一款功能强大的办公电脑管理软件&#xff0c;仅需安装在被控端电脑&#xff0c;主控端通过网页登录后…...

猫头虎分享已解决Bug || 网络连接问题:NetworkError: Failed to fetch

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

Layer1 明星项目 Partisia Blockchain 何以打造互操作、可创新的数字经济网络

我们的目标是创建一个以用户为中心的全新数字经济网络&#xff1a;在去信任化和公平透明的环境下&#xff0c;所有的隐私数据都能够得到天然保障&#xff0c;企业、用户等各角色的协作与共享将会更顺利地进行。 —— Partisia Blockchain 团队 作为一个以 Web3 安全为技术方向的…...

用CSS制作弧形卡片的三种创意方法!

在平时开发中&#xff0c;有时候会碰到下面这种“弧形”样式&#xff0c;主要分为“内凹”和“外凸”两种类型&#xff0c;如下 该如何实现呢&#xff1f;或者想一下&#xff0c;有哪些 CSS 属性和“弧形”有关&#xff1f;下面介绍 3 种方式&#xff0c;一起看看吧 一、borde…...

守护健康之光 —— 小脑萎缩患者的生活指南

生活中&#xff0c;我们或许会遇到一些特殊的挑战&#xff0c;而面对这些挑战时&#xff0c;了解和掌握正确的应对策略至关重要。今天&#xff0c;我们要聊一聊一个较为少见却不容忽视的话题——小脑萎缩。这不仅是患者的战役&#xff0c;也是家人和社会共同的关怀课题。下面&a…...

CSS选择器:让样式精确命中目标

CSS选择器&#xff1a;让样式精确命中目标 在网页开发中&#xff0c;CSS选择器是一种强大的工具&#xff0c;它可以帮助我们精确地定位HTML元素&#xff0c;以便为它们应用样式。在这篇博客中&#xff0c;我们将探讨一些常见的CSS选择器&#xff0c;了解它们的功能和使用方法。…...

前端不传被删记录的id怎么删除记录,或子表如何删除记录

1.删除主表相关子表所有记录 2.再保存一次前端传来的记录 3.如果子表是通过先生成空记录&#xff0c;再put修改模式&#xff0c;可以在执行1和2两步后再拿模板集合和当前现有子表集合套两个for循环对比判断&#xff0c;count记录模板记录和子表记录每次循环重合次数&#xff…...

axios的基本特性用法

1. axios的基本特性 axios 是一个基于Promise用于浏览器和node.js的HTTP客户端。 它具有以下特征&#xff1a; 支持浏览器和node.js支持promiseAPI自动转换JSON数据能拦截请求和响应请求转换请求数据和响应数据&#xff08;请求是可以加密&#xff0c;在返回时也可进行解密&…...

打印水仙花数---c语言刷题

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 题述 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#…...

springboot基础(82):分布式定时任务解决方案shedlock

文章目录 前言简介shedlock dbSchedulerLock注解说明 shedlock redis遇到的问题1.配置shedlock不生效2.报错net/javacrumbs/shedlock/core/LockProvider shedlock升级高版本同名定时任务 前言 多节点或者多服务器拥有相同的定时任务&#xff0c;这种情况下&#xff0c;不同节…...

【Golang】Gorm乐观锁optimisticlock的使用

在数据库操作中&#xff0c;为了保证数据的一致性和完整性&#xff0c;常常需要采取一些措施来防止并发操作导致的数据冲突。悲观锁和乐观锁是两种常见的并发控制机制。 悲观锁&#xff08;Pessimistic Lock&#xff09; 悲观锁的基本假设是&#xff0c;数据在并发访问时很可能…...

Apache Doris 发展历程、技术特性及云原生时代的未来规划

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…...

2024-02-26(Spark,kafka)

1.Spark SQL是Spark的一个模块&#xff0c;用于处理海量结构化数据 限定&#xff1a;结构化数据处理 RDD的数据开发中&#xff0c;结构化&#xff0c;非结构化&#xff0c;半结构化数据都能处理。 2.为什么要学习SparkSQL SparkSQL是非常成熟的海量结构化数据处理框架。 学…...

手把手教你排查ROS Noetic下的TF_REPEATED_DATA警告:从roswtf工具到源码定位

深度解析ROS Noetic中TF_REPEATED_DATA警告的排查与修复 当你在Ubuntu 20.04上运行ROS Noetic时&#xff0c;突然发现终端不断刷出"TF_REPEATED_DATA ignoring data with redundant timestamp for frame"的警告信息&#xff0c;同时Rviz中的机器人模型出现异常抖动—…...

别再只看额定电流了!拆解一个日本进口漏电断路器,聊聊型号里那些容易忽略的关键参数

日本进口漏电断路器深度解析&#xff1a;隐藏在型号铭牌中的安全密码 当你从工具箱里取出那台日本进口的NV125-SV漏电断路器时&#xff0c;是否曾对着面板上密密麻麻的参数符号陷入沉思&#xff1f;在电气安全领域&#xff0c;每个字母和数字都是工程师精心设计的安全密码。今天…...

硬件实战手记:MOSFET损耗分析与选型避坑指南

1. MOSFET损耗的三大元凶 MOSFET在电路中的损耗主要来自三个方面&#xff1a;导通损耗、开关损耗和续流损耗。先说导通损耗&#xff0c;这是最好理解的——当MOSFET完全导通时&#xff0c;DS之间就像一个可变电阻&#xff0c;这个电阻就是Rdson。我实测过几十种MOSFET&#xff…...

猫抓浏览器扩展:从网页资源嗅探到流媒体下载的全能解决方案

猫抓浏览器扩展&#xff1a;从网页资源嗅探到流媒体下载的全能解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经在浏览网页时&am…...

基于LangChain构建定制知识库聊天机器人的实践指南

1. 项目概述&#xff1a;定制知识库聊天机器人的核心价值在信息爆炸的时代&#xff0c;如何让AI系统精准掌握特定领域的专业知识&#xff0c;一直是企业级应用的核心痛点。传统聊天机器人要么泛泛而谈&#xff0c;要么需要耗费巨资训练专用模型。而基于LangChain构建的定制知识…...

Loom响应式转型不是选择题:2024年高并发Java系统必须完成的3项技术对齐(附迁移ROI测算表)

第一章&#xff1a;Loom响应式转型不是选择题&#xff1a;2024年高并发Java系统必须完成的3项技术对齐&#xff08;附迁移ROI测算表&#xff09; Java Loom 项目已随 JDK 21 正式进入生产就绪阶段&#xff0c;其虚拟线程&#xff08;Virtual Threads&#xff09;与结构化并发&a…...

开源数据集TN3K实测:手把手复现甲状腺结节分割SOTA模型(附避坑指南)

TN3K数据集实战&#xff1a;从零构建甲状腺结节分割多任务模型 医疗影像分析领域近年来迎来爆发式增长&#xff0c;其中甲状腺结节自动分割技术因其在癌症早期筛查中的关键作用备受关注。去年发布的TN3K开源数据集为研究者提供了宝贵资源&#xff0c;但实际应用时仍面临数据异构…...

别再乱用OneHot编码了!用Pandas的get_dummies处理分类变量,这3个参数能帮你避开90%的坑

别再乱用OneHot编码了&#xff01;用Pandas的get_dummies处理分类变量&#xff0c;这3个参数能帮你避开90%的坑 在数据科学项目中&#xff0c;分类变量的编码是特征工程中最容易被低估的环节之一。许多从业者习惯性地使用OneHotEncoder或简单调用pd.get_dummies()&#xff0c;却…...

Labelme标注踩过的坑:中文标签、复杂遮挡、数据集划分,一个脚本全搞定

Labelme高级标注实战&#xff1a;破解中文标签、复杂遮挡与数据集划分难题 在计算机视觉项目中&#xff0c;数据标注质量直接决定模型性能上限。作为最受欢迎的标注工具之一&#xff0c;Labelme凭借其灵活性和开源特性成为众多研究团队的首选。但当项目规模扩大、场景复杂度提升…...

从助听器到嫦娥四号:聊聊通用技术里那些‘活’的考点,帮你轻松搞定高考选择题

从助听器到嫦娥四号&#xff1a;技术考点背后的思维跃迁 高考通用技术科目中&#xff0c;"技术的性质"这一考点常常让考生感到抽象难懂。但如果我们把课本上的六个性质——目的性、创新性、综合性、两面性、专利性和相关性——与现代科技发展的鲜活案例结合起来&…...