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)

<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 方法省略
}

执行结果

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

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

相关文章

js:通过input标签或Drag拖拽文件实现浏览器文件上传获取File文件对象

文档 https://developer.mozilla.org/zh-CN/docs/Web/API/Filehttps://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/drag_event 通过读取文件可以获取File对象的信息 lastModified: 1707210706000 lastModifiedDate: Tue Feb 06 2024 17:11:46 GMT0800 (中国标准…

力扣--动态规划1027.最长等差数列

思路分析&#xff1a; 使用动态规划的思想&#xff0c;定义二维数组dp&#xff0c;其中dp[i][j]表示以nums[i]为结尾&#xff0c;公差为(j-1000)的等差数列长度。为了适应负数的情况&#xff0c;将公差的范围设为[-1000, 1000]&#xff0c;并且加上1000作为数组索引。 初始化r…

2.23 Day05

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//居中ui->label02->setAlignment(Qt::AlignCenter);ui->Edit1->setAlignment(Qt::Alig…

【Flink精讲】Flink性能调优:内存调优

内存调优 内存模型 JVM 特定内存 JVM 本身使用的内存&#xff0c;包含 JVM 的 metaspace 和 over-head 1&#xff09; JVM metaspace&#xff1a; JVM 元空间 taskmanager.memory.jvm-metaspace.size&#xff0c;默认 256mb 2&#xff09; JVM over-head 执行开销&#xff1…

springboot219基于SpringBoot的网络海鲜市场系统的设计与实现

网络海鲜市场系统的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

【数据结构和算法初阶(C语言)】空间复杂度(例题剖析一起探究空间如何评价算法)

目录 1.衔接前言-时间复杂度的回顾 2.关于算法复杂度 3.本文主角-空间复杂度 3.1大O的渐进表示方法 4.空间复杂度例题----实际感受空间复杂度 4.1冒泡排序的空间复杂度 4.2计算递归函数的空间复杂度 4.3动态开辟内存版本求斐波那契数列的空间复杂度 4.4&#xff08;…

TMGM外汇开户需要提供以下材料:

TMGM外汇开户需要提供以下材料&#xff1a; 身份证明&#xff1a;通常需要提供有效的身份证明文件&#xff0c;如身份证、护照或驾驶执照等。 居住证明&#xff1a;您需要提供能够证明您居住地址的文件&#xff0c;如水电费账单、房屋租赁合同、居住证明信等。 银行账户信息&a…

【MySQL】探索表结构、数据类型和基本操作

表、记录、字段 数据库的E-R&#xff08;entity-relationship&#xff0c;实体-关系&#xff09;模型中有三个主要概念&#xff1a; 实体集 、 属性 、 关系集 。 一个实体集对应于数据库中的一个表&#xff0c;一个实体则对应于数据库表 中的一行&#xff0c;也称为一条记录。…

数字电路 第三章—第三节(加法器)

一、二进制数的算术运算 1、两数绝对值之间的运算 &#xff08;1&#xff09;二进制数的加减乘除等算术运算的规则和十进制数类似&#xff0c;只是加法运算的规则为“逢二进一”&#xff0c;减法运算的规则为“借一当二”。 &#xff08;2&#xff09;二进制加法&#xff1a…

2024022201-并发控制

并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行&#xff0c;其他事务必须等到这个事务结束以后方能运行不能充分利用系统资源&#xff0c;发挥数据库共享资源的特点 (2)交叉并发方式&#xff08;interleaved concurrency&#xff09; 事务的并行执行是…

JDK8新特性全解析:Java8变革之旅

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

go环境安装-基于vscode的Windows安装

1、vscode安装 官网链接&#xff1a;https://code.visualstudio.com/ 选择相应的版本&#xff0c;这里选择Windows下的 下载得到一个VSCodeUserSetUp-x64的可执行文件&#xff0c;双击执行&#xff0c;选择要安装的路径&#xff0c;下一步。 2、go语言安装 官网链接&#x…

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…

react中修改state中的值无效?

// 初始化state state {personArr:[{name:张三,id:1},{name:李四,id:2},{name:王五,id:3}] }componentDidMount(){const newName 赵六const indexUpdate 1const newArr this.state.personArr.map((item,index)>{if(indexUpdate index){return {...item,name:newName}}e…

【Java程序员面试专栏 算法思维】五 高频面试算法题:贪心算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊贪心算法,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间买卖股票的最佳时机 II贪心算法遍历整个股票交易日价格列表 price,并执行贪心策…

机器学习——CBOW基于矩阵(手动实操)

基于矩阵的CBOW基础算法&#xff0c;其实是负采样的前提算法。 主要是根据 预测准确率为22%左右 说实话。。。我已经很满意了&#xff0c;至少这个东西是可以去预测的&#xff0c;至于预测为什么不正确&#xff0c;我目前猜测主要还是跟词频有关。 在结果中&#xff0c;an…

LeetCode--代码详解 235.二叉搜索树得最近公共祖先

235.二叉搜索树得最近公共祖先 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可…

为什么AI越来越像玄学

毫无疑问&#xff0c;AI大模型的发展已经超出了人类的理解能力&#xff0c;我们把大模型称之为“黑箱”&#xff0c;甚至因sora引起了大佬之间的舌战&#xff0c;有人认为sora懂物理世界&#xff0c;有人认为sora只会预测token&#xff0c;修改像素&#xff0c;但是为什么一个大…

算法练习-组合总和【回溯算法】(思路+流程图+代码)

难度参考 难度&#xff1a;困难 分类&#xff1a;回溯算法 难度与分类由我所参与的培训课程提供&#xff0c;但需 要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0…

软件测试人员的基本功包括些什么?

软件测试人员的基本功包括哪些呢&#xff1f;接下来该问题的阐述结构如下&#xff1a; 1、一看软件测试基本流程 2、明确软件测试的基本功有哪些 3、如何牢固掌握这些基本功 软件测试基本流程 上图就是软件测试的基本流程 1&#xff09;需求评审 2&#xff09;计划编写 …