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

执行结果

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

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

相关文章

Spring Boot中实现列表数据导出为Excel文件

点击下载《Spring Boot中实现列表数据导出为Excel文件》 1. 前言 本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能&#xff0c;并解释其背后的原理、提供完整的流程和步骤&#xff0c;以及带有详细注释的代码示例。最…

个人博客系列-Django部署-nginx(3)

使用Nginx uwsgi进行部署django项目 一. 检查项目是否可以运行 启动项目 python manage.py runserver 0.0.0.0:8099输入ip:8099 查看启动页面 出现上述页面表示运行成功 二. 安装uwsgi并配置 2.1 下载uwsgi pip install uwsgi新建文件test.py写入内容&#xff0c;测试一…

Win UI3开发笔记(四)设置主题续

上文讲到过关于界面和标题栏以及普通文本的主题设置&#xff0c;这篇说一下关于对话框的主题设置。 我最终没找到办法&#xff0c;寻求办法的朋友可以不用接着看了&#xff0c;以下只是过程。 一个对话框包括标题部分、内容部分和按钮部分&#xff0c;其中&#xff0c;在Cont…

K8S常用kubectl命令汇总(持续更新中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C++ 反向迭代器的设计与实现

在本文开始之前&#xff0c;先明晰几个 关键词 的含义&#xff08;T : 模板参数&#xff09;&#xff1a; Ref : T& / const T&Ptr : T* / const T* 一、反向迭代器设计的上帝视角 我们希望将 反向迭代器 设计成一种适配器——传 list::iterator 得到 list 的反向迭代…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

数据库常见理论常见面试题(总结)

一、前言 这里呢&#xff0c;博主会介绍一些平时关于数据库的理论的问题&#xff0c;比如数据库的三级模式两级映射、触发器、范式、存储过程、视图等等概念知识&#xff0c;但是像索引、事务、锁等内容&#xff0c;之前的文章就讲解过了&#xff0c;这里就不作过多的介绍了&am…

【Git教程】(七)变基与拣取 —— 变基操作的概念、适用场景及其实现方式,拣取操作的实现 ~

Git教程 变基与拣取 1️⃣ 工作原理&#xff1a;复制提交2️⃣ 避免“钻石链”3️⃣ 什么情况下会遇到冲突4️⃣ 移植分支5️⃣ 执行变基后原提交的情况6️⃣ 提交的原件与副本存在于同一版本库中所带来的问题7️⃣ 捡取&#x1f33e; 总结 通常&#xff0c; 一段提交历史中往…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示&#xff0c;用户网络 1 通过 LSW1 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数&#xff0c;对 VLAN2 进…

77. 组合(力扣LeetCode)

文章目录 77. 组合题目描述回溯算法组合问题的剪枝操作 77. 组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4],…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

Matlab: Introduction to Hybrid Beamforming

文章目录 来源混合波束赋形的基本概念System Setup关键函数 来源 在matlab的命令行输入 doc hybrid beamforming 混合波束赋形的基本概念 混合波束形成简介 本例介绍了混合波束形成的基本概念&#xff0c;并说明了如何模拟这种系统。 现代无线通信系统使用空间复用来提高散…

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改&#xff0c;请关注博客哦 异常级别 ARMv8处理器支持4种异常等级&#xff08;Exception Level&#xff0c;EL&#xff09;。 EL0 为非特权模式&#xff0c;用于运行应用程序&#xff0c;其他资源访问受限&#xff0c;权限不够。 EL1 为特权模式&…

C++:常量表达式

C11开始constexpr作为一种声明&#xff0c;为编译器提供了在编译期间确认结果的优化建议&#xff0c;满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错&#xff0c;b的值在编译期间不能确定 const int size1…

电视盒子什么牌子好?老烧分享电视盒子品牌排行榜

多年前开始我就用电视盒子了至今已经七年&#xff0c;对各个品牌的电视盒子我都有详细深入的了解&#xff0c;看到网友们在讨论电视盒子什么牌子好&#xff0c;不知道如何挑选电视盒子的朋友们可以关注发烧友圈公认的电视盒子品牌排行榜&#xff0c;看看入围的都有哪些品牌吧。…

数据库之MVCC

1、什么是MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。MVCC使得大部分支持行锁的事务引擎&#xff0c;不再单纯的使用行锁来进行…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录 1 前言2 串口打印库函数版本3 串口打印寄存器版本3.1 配置时钟3.2 配置GPIO功能3.3 配置CR2寄存器3.4 配置CR1寄存器3.5 配置CR3寄存器 1 前言 我们在调试的过程中&#xff0c;都比较喜欢直观的数据&#xff0c;这时候我们可以使用芯片的串口功能&#xff0c;把数据打…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章&#xff0c;小编将深入为大家讲解开发智能扫码点餐系统的技术细节&#xff0c;从系统架构到关键功能实现&#xff0c;为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作&#xff0c;大大简化了点餐流程&#xff0c;提升了…