Spring MVC: 请求参数的获取
Spring MVC
- 前言
- 通过 @RequestParam 注解获取请求参数
- @RequestParam
- 用法
- 通过 ServletAPI 获取请求参数
- 通过实体类对象获取请求参数
- 附
前言
在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调用相应的处理器 Controller 。那么,处理器 Controller 具体是如何实现获取请求参数的呢?
通过 @RequestParam 注解获取请求参数
@RequestParam
@RequestParam,用于在处理器 Controller 方法参数上获取 HTTP 请求参数的值。使用 @RequestParam 注解可以获取请求参数的值以及对请求参数进行类型转换或验证。
简单示例:
首先,创建一个 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><body><h2>Hello World</h2><form action="${pageContext.request.contextPath}/paramTest" method="post">账号:<input type="text" name="name" value="" /><br>密码:<input type="password" name="password" value="" /><br><input type="submit" value="提交"></form></body>
</html>
接着,创建一个 accessing.jsp
<%--Created by IntelliJ IDEA.User: dellDate: 2023/7/18Time: 12:54To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body><h2>提交成功!</h2>
</body>
</html>
然后,获取表单中 name 和 password 参数的值
package cn.edu.springmvcdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class ParamDemo {@RequestMapping("/index")public String index1(){return "index";}@RequestMapping("/paramTest")//@RequestParam 的 value 值需要与表单中的参数名字(name值)保持一致,而 paramTest() 方法中的参数名字(str1、str2)可以随机填写public String paramTest(@RequestParam(value = "name") int str1,@RequestParam(value = "password") String str2){System.out.println("账号 = " + str1);System.out.println("密码 = " + str2);return "accessing";}
}
注:当处理器 Controller 方法中的参数名字与表单中的参数名字不一致时,需要 @RequestParam 的 value 值指定参数名字
最后,测试结果
结果如图:
1.输入账号和密码,点击提交
2.成功提交,跳转到 accessing.jsp
3.获取到相应的参数值
用法
1. 在上面的示例中,Spring MVC 会自动根据参数名字来注入,所以 @RequestParam(value = " ") 的部分可以省略,但需要处理器 Controller 方法中的参数名字与表单中的参数名字(name值)保持一致。
如图:
或者
2. 在上面的示例中,name 为 int 类型,当输入为空时,数据赋值为 null ,页面会报错。
如图:
1.输入为空,直接点击提交
2.页面报错
解决:
1.使用 @RequestParam 注解的 defaultValue 属性设置数据默认值
2.使用 @RequestParam 注解的 required 属性设置值为 false(默认参数赋值为 null ),并将 int 类型改为 Integer 类型
通过 ServletAPI 获取请求参数
使用 ServletAPI 获取参数值
简单示例:
通过 HttpServletRequest 获取参数值
package cn.edu.springmvcdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;@Controller
public class ParamDemo {@RequestMapping("/index")public String index1(){return "index";}//1.使用 @RequestParam 注解获取参数值@RequestMapping("/paramTest")public String paramTest(@RequestParam(required = false) Integer name,@RequestParam String password){System.out.println("账号 = " + name);System.out.println("密码 = " + password);return "accessing";}//2.使用 HttpServletRequest 直接获取参数值@RequestMapping("/paramHSR")public String paramHSR(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {req.setCharacterEncoding("UTF-8");int name = Integer.parseInt(req.getParameter("name"));String password = req.getParameter("password");System.out.println("账号 = " + name);System.out.println("密码 = " + password);return "accessing";}
}
另外,index.jsp 中修改路径
结果如图:
通过实体类对象获取请求参数
使用普通 java 对象(POJO)获取参数值
简单示例:
首先,创建一个实体类 ParamUser ,定义账号和密码属性
package cn.edu.springmvcdemo.model;public class ParamUser {private int name;private String password;public ParamUser() {super();}public ParamUser(int name, String password) {this.name = name;this.password = password;}public int getName() {return name;}public String getPassword() {return password;}public void setName(int name) {this.name = name;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "ParamUser{" +"name=" + name +", password='" + password + '\'' +'}';}
}
接着,通过 ParamUser 对象来调用 get() 方法获取参数值
注:对象属性名字和请求参数名字需要保持一致
package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.ParamUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;@Controller
public class ParamDemo {@RequestMapping("/index")public String index1(){return "index";}//1.使用 @RequestParam 注解获取参数值@RequestMapping("/paramTest")public String paramTest(@RequestParam(required = false) Integer name,@RequestParam String password){System.out.println("账号 = " + name);System.out.println("密码 = " + password);return "accessing";}//2.使用 HttpServletRequest 直接获取参数值@RequestMapping("/paramHSR")public String paramHSR(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {req.setCharacterEncoding("UTF-8");int name = Integer.parseInt(req.getParameter("name"));String password = req.getParameter("password");System.out.println("账号 = " + name);System.out.println("密码 = " + password);return "accessing";}//3.POJO 传值方式获取参数值@RequestMapping("/paramUser")//设置实体类形参public String paramUser(ParamUser user){System.out.println("账号 = " + user.getName());System.out.println("密码 = " + user.getPassword());return "accessing";}
}
另外,index.jsp 中修改路径
结果如图:
附
下面简单介绍处理器 Controller 获取前端其他的请求信息的注解,了解即可。
@RequestHeader:用于将 HTTP 请求头中的参数值映射到处理器 Controller 方法参数中
- 常用属性如下:
– name:参数名称
– required:boolean类型,默认为true,即请求头中必须包含此参数
– defaultParameter:为请求头中的参数提供默认值
@CookieValue:用于从 HTTP 请求的 Cookie 中获取指定的值
- 常用属性如下:
– value:参数名称
– required:boolean类型,默认为true,即请求头中必须包含此参数
– defaultValue:设置 Cookie 的默认值
相关文章:

Spring MVC: 请求参数的获取
Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调…...

别再头疼反弹Shell失败了,这篇文章带你找到问题根源
别再头疼反弹Shell失败了,这篇文章带你找到问题根源 在渗透测试中,反弹shell失败的原因可以有多种。以下是一些常见的原因: **1.防火墙和网络过滤器:**目标系统可能配置了防火墙或网络过滤器,以限制对外部系统的连接…...

第五章 树与二叉树 四、线索树(手算与代码实现)
一、定义 1.线索树是一种二叉树,它在每个节点上增加了两个指针,分别指向其前驱和后继。 2.这些指针称为“线索”,因此线索树也叫做“线索化二叉树”。 3.在线索树中,所有的叶子节点都被线索化,使得遍历树的过程可以…...

服务器前后端学习理解
个人兴趣,突然想起来记录一下 1. 背景 想做一个最简单的网页,点击按钮后,访问服务器的redis数据库,读取一个为hello的值并显示 首先用js写了一个脚本,使用redis包,读取到了数据,并使用consol.l…...

python-数据分析-numpy、pandas、matplotlib的常用方法
一、numpy import numpy as np1.numpy 数组 和 list 的区别 输出方式不同 里面包含的元素类型 2.构造并访问二维数组 使用 索引/切片 访问ndarray元素 切片 左闭右开 np.array(list) 3.快捷构造高维数组 np.arange() np.random.randn() - - - 服从标准正态分布- - - …...

ChatGPT⼊门到精通(5):ChatGPT 和Claude区别
⼀、Claude介绍 Claude是Anthropic开发的⼀款⼈⼯智能助⼿。 官⽅⽹站: ⼆、Claude能做什么 它可以通过⾃然语⾔与您进⾏交互,理解您的问题并作出回复。Claude的主要功能包括: 1、问答功能 Claude可以解答⼴泛的常识问题与知识问题。⽆论是历史上的某个事件,理科…...

ChatGPT 总结数据分析的所有知识点
ChatGPT功能非常多,特别是对某个行业,某个方向,某个技术进行总结那是相当专业的。 如下图。 直接用一个指令便总结出来数据分析当中的所有知识点内容。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Ex…...

hadoop-HDFS
1.HDFS简介 2.1 Hadoop分布式文件系统-HDFS架构 2.2 HDFS组成角色及其功能 (1)Client:客户端 (2)NameNode (NN):元数据节点 管理文件系统的Namespace元数据 一个HDFS集群只有一个Active的NN ÿ…...

0202hdfs的shell操作-hadoop-大数据学习
文章目录 1 进程启停管理2 文件系统操作命令2.1 HDFS文件系统基本信息2.2 介绍2.3 创建文件夹2.4 查看指定文件夹下的内容2.5 上传文件到HDFS2.6 查看HDFS文件内容2.7 下载HDFS文件2.8 HDFS数据删除操作 3 HDFS客户端-jetbrians产品插件3.1 Big Data Tools 安装3.2 配置windows…...

生活小记-挂号信
"挂号信"通常指的是在邮寄过程中通过挂号邮寄服务寄送的信件,相对于普通信件有一些特殊的特点和服务。以下是挂号信与其他信件(例如普通信件)之间的区别: 跟踪和确认: 挂号信:通过挂号邮寄服务寄…...

3D点云处理:基于PCA的计算点云位姿(占位待整理)
文章目录 文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_...

本地私有仓库、harbor私有仓库部署与管理
本地私有仓库、harbor私有仓库部署与管理 一、本地私有仓库1.本地私有仓库简介2.搭建本地私有仓库3.容器重启策略介绍 二、harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3.Harbor的构成4.harbor部署及配置5.客户端测试 三、Harbor维护1.创建2.普通用户操作私有仓库3.日…...

尚硅谷SpringMVC (5-8)
五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页: Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…...

jupyter notebook中查看python版本的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

动态字符串 String (完整源码)
C自学精简教程 目录(必读) C数据结构与算法实现(目录) 本文的实现基本上和 动态数组 vector 是一样的。 因为大部分接口都一样。 所以,本文就直接给出全部的源码和运行结果。 //------下面的代码是用来测试你的代码有没有问题的辅助代码…...

【深度学习】实验05 构造神经网络示例
文章目录 构造神经网络1. 导入相关库2. 定义一个层3. 构造数据集4. 定义基本模型5. 变量初始化6. 开始训练 构造神经网络 注明:该代码用来训练一个神经网络,网络拟合y x^2-0.5noise,该神经网络的结构是输入层为一个神经元,隐藏层…...

用了这么久SpringBoot却还不知道的一个小技巧
前言 你可能调第三方接口喜欢启动application,修改,再启动,再修改,顺便还有个不喜欢写JUnitTest的习惯。 你可能有一天想要在SpringBoot启动后,立马想要干一些事情,现在没有可能是你还没遇到。 那么SpringB…...

Websocket、SessionCookie、前端基础知识
目录 1.Websocket Websocket与HTTP的介绍 不同使用场景 Websocket链接过程 2.Session&Cookie Cookie的工作原理 Session的工作原理 区别 3.前端基础知识 1.Websocket Websocket与HTTP的介绍 HTTP: 1.HTTP是单向的,客户端发送请求࿰…...

【云原生进阶之PaaS中间件】第一章Redis-2.4缓存更新机制
1 缓存和数据库的数据一致性分析 1.1 Redis 中如何保证缓存和数据库双写时的数据一致性? 无论先操作db还是cache,都会有各自的问题,根本原因是cache和db的更新不是一个原子操作,因此总会有不一致的问题。想要彻底解决这种问题必须…...

Qt——事件处理详解
Qt事件处理 一、事件基础 事件是Qt应用程序中的基本构建块,它们代表了一些特定的行为或状态变化。事件可以是鼠标点击、键盘输入、窗口大小改变、定时器事件等。每个事件都是一个对象,继承自QEvent类。 二、事件常见类型 Qt中的事件分为多种类型&…...

基于位置管理的企业员工考勤打卡系统设计 微信小程序
员工考勤打卡系统设计app是针对员工必不可少的一个部分。在公司发展的整个过程中,员工考勤打卡系统设计app担负着最重要的角色。为满足如今日益复杂的管理需求,各类员工考勤打卡系统设计app程序也在不断改进。本课题所设计的 MVC基于HBuilder X的员工考勤…...

adb 查找应用包名,应用 Activity 等信息
列出设备上的包 不使用参数:adb shell pm list packages,打印设备/模拟器上的所有软件包 根据包名查看应用的activity 命令: dumpsys package 包名 adb shell dumpsys package 包名 petrel-cv96d:/data/app # dumpsys package com.instal…...

八、SpringBoot集成Kafka
目录 一、添加依赖二、SpringBoot 生产者三、SpringBoot 消费者 一、添加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depend…...

联网智能实时监控静电离子风机的工作流程
联网智能实时监控静电离子风机是通过将静电离子风机与互联网连接,实现对其状态和性能的远程监控和管理。 具体实现该功能的方法可以包括以下几个步骤: 1. 传感器安装:在静电离子风机上安装适当的传感器,用于感知相关的参数&…...

第12章 微信支付
mini商城第12章 微信支付 一、课题 微信支付 二、回顾 1、分布式事务 2、分布式事务理论 3、掌握分布式事务解决方案模型 4、能基于Seata解决强一致性分布式事务 5、能基于RocketMQ解决柔性事务 三、目标 1、密码安全学 摘要加密 Base64 对称加密 2、微信支付 微信支…...

Java基础二十二(对集合元素排序比较)
对集合元素排序比较 1. 使用 Comparable 接口实现默认排序 Comparable 是 Java 中的一个接口,用于定义对象之间的排序规则。 实现了 Comparable 接口的类可以比较其对象的大小(包装类都实现了该接口),从而可以在集合类…...

(15)线程的实例认识:同步,异步,并发,并发回调,事件,异步线程,UI线程
参看:https://www.bilibili.com/video/BV1xA411671D/?spm_id_from333.880.my_history.page.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 下面是net framework版本 一、文件构成 1、界面如下。 (1)同步与异步有什么区别? …...

长胜证券:华为“黑科技”点燃A股炒作激情
8月29日,在未举行相关发布会的情况下,华为新款手机Mate60Pro悄然上线开售,并在一小时内售罄。 金融出资报记者注意到,跟着商场对新机重视的继续发酵,其中的各种技能打破也愈加受到重视,其影响很快扩散到资…...

Kubernetes(k8s)上部署redis5.0.14
Kubernetes上部署redis 环境准备创建命名空间 准备PV和PVC安装nfs准备PV准备PVC 部署redis创建redis的配置文件部署脚本挂载数据目录挂载配置文件通过指定的配置文件启动redis 集群内部访问外部链接Redis 环境准备 首先你需要一个Kubernetes环境,可参考我写的文章&…...

frida动态调试入门01——定位关键代码
说明 frida是一款Python工具可以方便对内存进行hook修改代码逻辑在移动端安全和逆向过程中常用到。 实战 嘟嘟牛登录页面hook 使用到的工具 1,jadx-gui 2,frida 定位关键代码 使用jadx-gui 进行模糊搜索,例如搜索encyrpt之类的加密关键…...