SpringMVC的数据获取问题

news/2024/7/4 10:09:06/文章来源:https://www.cnblogs.com/bobospace/p/18278101

在传统的javaweb中我们获取数据是通过HttpServletRequest中的getParameter或者getHeader等方法来获取相关的信息。由此我们引出了以下问题:

在SpringMVC中应该如何获取请求提交的数据呢?
在SpringMVC中又应该如何获取请求头信息呢?
在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

接下来我们将逐一解释上面的三个问题。我们使用idea进行开发。在进行解释之前我们需要准备一个`Register.html`的页面。方便进行表单的提交。`Register.html`代码如下:



问题1 如何获取请求提交的数据?

1.1使用Servlet原生api获取

 //方式一采用原生请求方式@PostMapping(value = "/register")public String register(HttpServletRequest req){String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username: "+username+" send a request");return "success";}

如果 System.out.println("username: "+username+" send a request");语句输出成功,并且浏览器跳转到success.html页面即为测试成功。

测试结果:



页面跳转:



控制台输出:

1.2采用RequestMapping的Param参数

1.2.1基本使用:
   //采用params参数@PostMapping(value = "/register")public String register(@RequestParam("username")String Username,@RequestParam("password")String password){System.out.println("Username: "+Username+" Password: "+password);return "success";}

##### 测试结果:


1.2.2 添加require属性

在注解中添加required属性并且设置为true表示请求必须携带该参数,否则无法使用

   //采用params参数@PostMapping(value = "/register")public String register(@RequestParam(value = "username" ,required = false)String Username,@RequestParam("password")String password,@RequestParam("sex",required = true)String sex){System.out.println("Username: "+Username+" Password: "+password);return "success";}
1.2.3 defaultValue属性

defaultValue属性用来设置形参的默认值,当没有提供对应的请求参数或者请求参数的值是空字符串""的时候,方法的形参会采用默认值。

@PostMapping(value = "/register")public String register(@RequestParam(value = "username" ,required = false)String Username,@RequestParam("password")String password,@RequestParam("sex")String sex,@RequestParam(value = "hobby" ,required = false ,defaultValue = "未知")String hobby){System.out.println("Username: "+Username+" Password: "+password);return "success";}

1.3 依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。

但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数'-parameter',配置如下:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.12.1</version><configuration><source>21</source><target>21</target><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin></plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!

@PostMapping(value="/register")
public String register(String username, String password, String sex, ){System.out.println(username + "," + password + "," + sex  );return "success";
}

1.4 POJO类/JavaBean接收请求参数(重要)

在我之前的《SpringMVC框架和Servlet开发有啥子区别?》一文中我提到了 SpringMVC架构相对于传统原生的Servlet多了一个使用POJO类/JavaBean接收请求参数。为我们开发提供极大的简便。


当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。SpringMvC底层会使用反射机制创建对象并且调用对象的set方法给User对象的属性赋值。提供以下的JavaBean:

ublic class User {private Long id;private String username;private String password;private String sex;private String[] hobby;private String intro;public User() {}public User(Long id, String username, String password, String sex, String[] hobby, String intro) {this.id = id;this.username = username;this.password = password;this.sex = sex;this.hobby = hobby;this.intro = intro;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String getIntro() {return intro;}public void setIntro(String intro) {this.intro = intro;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", hobby=" + Arrays.toString(hobby) +", intro='" + intro + '\'' +'}';}
}

问题二:在SpringMVC中又应该如何获取请求头信息呢?

通过RequestHeader注解可以拿到请求头信息。请求头信息的形式也是key:value的键值对形式。该注解的作用是:将请求头信息映射到方法的形参上。和RequestParam注解功能相似,RequestParam注解的作用:将请求参数映射到方法的形参上。当然,对于RequestHeader注解来说,也有三个属性:value、required、defaultValue,和RequestParam一样。

@PostMapping("/register")
public String register(User user, @RequestHeader(value="Referer", required = false, defaultValue = "") String referer){System.out.println(user);System.out.println(referer);return "success";
}

问题三:在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

我们可以通过CookieValue注解来获取Cookie信息。该注解的作用:将请求提交的Cookie数据映射到方法形参上。该注解同样是有三个属性:value、required、defaultValue。

前端代码:

<script type="text/javascript">function sendCookie(){document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";document.location = "/springmvc/register";}
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>

后端接收代码

    @GetMapping("/register")public String register(User user,@RequestHeader(value="Referer", required = false, defaultValue = "")String referer,@CookieValue(value="id", required = false, defaultValue = "2222222222")String id){System.out.println(user);System.out.println(referer);System.out.println(id);return "success";}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql用户

一、数据库用户管理 DCL:数据控制语言,用于设置或者更改数据库用户或角色权限 1.新建用户create user 用户名@源地址 identified by 密码;用户名 指定将创建的用户名来源地址 指定新创建的用户可在哪些主机上登录 可使用IP地址、网段、主机名的形式 本地用户可用localhost …

可视化

D3.js绘制柱形图 <!DOCTYPE html><html lang="en"><head><title>bar example</title><script src="d3.min.js"></script></head><body><div id="barchart"></div><script…

【0基础学爬虫】爬虫基础之scrapy的使用

【0基础学爬虫】爬虫基础之scrapy的使用大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速…

springboot使用itextpdf+jfreechart制作PDF文档

1. springboot引入的依赖组件 项目中需要引入itextpdf和jfreechart两个组件,版本根据项目所需进行引入,maven组件版本查询可根据如下地址进行查询:maven组件查询<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId&g…

spring趣玩

自定义banner 先上图片,替换spring启动标志;或者也可以在启动类代码设置Banner也可以通过设置springApplication.setBannerMode(Banner.Mode.OFF);关闭打印横幅ApplicationRunner和@PostConstruct ApplicationRunner 是一种灵活的机制,可以用来执行数据库迁移、预加载数据、…

图论初步与可视化

本讲将简要介绍图论中的基本概念,并主要讲解图论中的最短路径问题。以及如何将图论可视化 目录一、图论的概念二、在线作图网站1.index介绍2.Node Count介绍3.Graph data三、Matlab作无向图1.无权图(每条边的权重默认为1)2.利用字符串做无权图3.有权图四、Matlab作有向图 一…

使用不同函数打印torch.nn模型——print(model),named_children(),named_modules():

创建一个具有三级嵌套的模型,结构如图:import torch import torch.nn as nn# 定义子子模块 class SubSubModule(nn.Module):def __init__(self):super(SubSubModule, self).__init__()self.conv = nn.Conv2d(3, 3, kernel_size=3, padding=1)def forward(self, x):return sel…

[LeetCode] 189. Rotate Array

无敌的切片他又来了。 class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""#0if k ==0:pass#elselenn = len(nums)k = k % lennnums[:] =nums[lenn -k:] + nums…

Centos双网卡冗余绑定

1. 前言 关于双网卡绑定,前前后后踩过不少的坑,虽然这是 RHCE 中的一道题,但是在实践中碰到问题也够喝一壶的。 在实践中,虚拟机、物理机都做过,但是不尽相同,大部分的坑也集中在这里,本文长期更新关于网卡绑定中遇到的问题及处理方法。 现在的服务器默认都配备 4 张 千…

Java 将Markdown文件转换为Word和PDF文档

Markdown 凭借其简洁易用的特性,成为创建和编辑纯文本文档的常用选择。但某些时候我们需要更加精致的展示效果,例如在专业分享文档或打印成离线使用的纸质版时,就需要将Markdown文件以其他固定的文档格式呈现。通过将 Markdown 转换为 Word 和 PDF 格式,可以得到更多的格式…

k8s-09-Deployment

Deployment微服务化:将一个大规模系统拆分成各个独立运行的组件更新 pod:直接删除所有现有的 pod, 然后创建新的 pod。 先创建新的 pod, 并等待它们成功运行之后, 再删除旧的 pod。 按顺序创建新的 pod, 然后逐渐删除旧的 pod。第 1 种会导致应用程序在一定的时间内不可用。…

IOT2050基本使用和指令集

安装系统镜像 -- debianIOT镜像地址下载及镜像版本说明Win32 disk Imager下载,用于SD卡安装镜像文件使用win32磁盘映像工具镜像操作如下:如果需要把SD卡中的镜像写入到eMMC卡:将烧录好的SD卡插入设备,修改SD卡启动顺序为默认启动设备。 如果已经存在emmc系统,则先格式化em…

K8S学习教程(一):使用PetaExpress云服务器安装Minikube 集群

什么是MinikubeMinikube是一款工具,主要用于在本地运行 Kubernetes 集群。Kubernetes 开源的平台,用于自动化容器化应用的部署、扩展和管理,而Minikube 使得开发人员能够在本地机器上轻松创建一个单节点的 Kubernetes 集群,从而方便开发、测试和学习 Kubernetes。我们看下如…

蓝牙芯片认证

前言: BLE产品工作在2.4G频段。产品具有蓝牙功能并且在产品外观上标明蓝牙标志,则必须通过认证。 各个国家的认证标准不同,但是大同小异。例如FCC/MIC/CE/BQB等。具体需要过某个认证可以查看出口国家。 认证可以分为传导和空气耦合。传导是测试芯片发射信号的波形;耦合是测…

Linux下二进制可执行文件分析 (nm,readelf,objdump 命令使用)

最近在调试一些问题,发现几个命令很实用,记录一下。 一 背景也许大家都遇到过这种场景,就是有二进制代码,比如深度分析下此文件到底是什么格式的图片等,这篇文章就记录我分析下二进制可执行文件的过程,已经自己读写二进制文件的一些坑。分析的二进制执行文件为linux下的可…

hypernetwork在SD中是怎么工作的

大家在stable diffusion webUI中可能看到过hypernetwork这个词,那么hypernetwork到底是做什么用的呢?大家在stable diffusion webUI中可能看到过hypernetwork这个词,那么hypernetwork到底是做什么用的呢? 简单点说,hypernetwork模型是用于修改样式的小型神经网络。 什么是…

使用 ROS2的多机器人探索

原文链接:https://www.youtube.com/watch?v=J0RZP_xJ3XA This video shows a demonstration of the SOS project, dedicated to forest fire detection using a fleet of robots. Several important issues are addressed. 这段视频展示了SOS项目的演示,该项目致力于使用机…

企业生产环境Nacos集群部署示例

Nacos运行环境需要jdk环境,集群各节点服务器需安装jdk1.8: jdk-8u341-linux-x64.tar 第一步:上次安装包 第二步:解压 sudo tar -zxvf jdk-8u341-linux-x64.tar.gz 第三步: 配置环境变量sudo vim /etc/profile 第四步:添加以下内容 export JAVA_HOME=/usr/local/jdk1.8.0…

Identity-aware Graph Neural Networks

目录概ID-GNNYou J., Gomoes-Selman J., Ying R. and Leskovec J. Identity-aware graph neural networks. AAAI, 2021.概 提出了一种能够超越 1-WL-Test 的 GNN. ID-GNNID-GNN 的 motivation 主要如下:主要到, 传统的 MPNN, 即第 \(k\) 层: \[\mathbf{m}_u^{(k)} = \text{MSG}…