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

news2025/1/13 19:52:15

目录

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;
    // Map
    private 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();
        // List
        System.out.print("称号:");
        for(String title : titles) {
            System.out.print(" " + title);
        }
        System.out.println();
        // Map
        Set<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.coloradmin.cn/o/1470963.html

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

相关文章

微信小程序02: 使用微信快速验证组件code获取手机号

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 微信小程序获取手机号2.1 业务场景(使用与充值)2.2 准备工作2.3 具体代码使用与注释如下2.3.1 代码解释(一)[无需复制]2.3.2 代码解释(二)[无需复制] 2.4 最后一步 获取手机号信息2.4.1 两行代…

电商评价分析:NLP信息抽取技术在用户评论中的应用与挖掘

一、引言 在2019年&#xff0c;电子商务的蓬勃发展不仅推动了消费市场的增长&#xff0c;也带来了海量的用户评价数据。这些数据&#xff0c;作为消费者对商品和服务直接反馈的载体&#xff0c;蕴含着巨大的价值。然而&#xff0c;由于其非结构化的特性&#xff0c;这些文本信息…

YOLOv8改进 | Conv篇 | 全新的SOATA轻量化下采样操作ADown(参数量下降百分之二十,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)…

半导体物理基础-笔记(续)

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 掺杂半导体的费米能级与温度及杂质浓度的关系图 在温度一定的条件下&#xff0c;施主杂质浓度越高&#xff0…

压力测试工具Jmeter的下载与使用

1、进入官网下载Jmeter https://jmeter.apache.org/ 国内镜像&#xff08;下载的慢的话可以用国内镜像下载&#xff09; https://mirrors.cloud.tencent.com/apache/jmeter/binaries/ 2、跳转到下载页面 3、根据不同系统下载相应版本的Jmeter压缩包&#xff0c;Linux系统下载…

Repeater:创建大量类似项

Repeater 类型用于创建大量类似项。与其它视图类型一样&#xff0c;Repeater有一个model和一个delegate。 首次创建Repeater时&#xff0c;会创建其所有delegate项。若存在大量delegate项&#xff0c;并且并非所有项都必须同时可见&#xff0c;则可能会降低效率。 有2种方式可…

2024年大路灯无广测评推荐:书客、柏曼、霍尼韦尔大路灯哪个品牌更好?

临近开学&#xff0c;护眼大路灯哪个品牌好的话题度在不断提高&#xff01; 有人说大路灯是“智商税”&#xff0c;但也有人说“学生党福音”、“照明神器”&#xff0c;吸引了大量人群的关注。在没用过大路灯之前我也很担心在担心是否是智商税的问题&#xff0c;直到我自己入…

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…

stable-diffusion-webui+sadTalker开启GFPGAN as Face enhancer

接上一篇&#xff1a;在autodl搭建stable-diffusion-webuisadTalker-CSDN博客 要开启sadTalker gfpgan as face enhancer&#xff0c; 需要将 1. stable-diffusion-webui/extensions/SadTalker/gfpgan/weights 目录下的文件拷贝到 :~/autodl-tmp/models/GFPGAN/目录下 2.将G…

探索创意的无尽宇宙——Photoshop 2020,你的视觉魔法棒

在数字艺术的广阔天地中&#xff0c;Photoshop 2020无疑是一颗璀璨的明星。这款由Adobe公司精心打造的图像处理软件&#xff0c;自推出以来&#xff0c;便以其强大的功能和卓越的性能&#xff0c;赢得了全球数百万设计师、摄影师和爱好者的青睐。无论是Mac还是Windows系统&…

冯诺依曼体系结构 与 操作系统

一、冯诺依曼体系结构 深入理解冯诺依曼体系结构 计算机的出现就是为了解决实际问题, 所以把问题交给计算机&#xff0c;计算机经过处理&#xff0c;得到一个结果反馈给我们&#xff0c;所以这中间就必然涉及到了输入设备&#xff0c;中央处理器(包括运算器和控制器)和输出设备…

Find My小风扇|苹果Find My技术与小风扇结合,智能防丢,全球定位

电风扇在我们的日常生活中也是经常会使用到的家电产品&#xff0c;尤其是在炎炎的夏日&#xff0c;风扇能给我们吹来清凉的凉风&#xff0c;如今随身携带的小风扇成为人们出门的必备物品&#xff0c;由于体积小方便经常会被人遗忘在某个地方导致丢失。 在智能化加持下&#x…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…

《Docker 简易速速上手小册》第9章 Docker 与持续集成(2024 最新版)

文章目录 9.1 持续集成的基本概念9.1.1 重点基础知识9.1.2 重点案例&#xff1a;Python Web 应用的 CI 流程9.1.3 拓展案例 1&#xff1a;Python 数据分析项目的 CI9.1.4 拓展案例 2&#xff1a;Python 微服务的 CI/CD 9.2 Docker 在 CI/CD 中的应用9.2.1 重点基础知识9.2.2 重…

MCU多核异构通信原理

摘要&#xff1a; 本文结合瑞萨RZ/G2L 多核处理器&#xff0c;给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展&#xff0c;以及市场需求的日益增长&#xff0c;嵌入式系统不仅要求执行复杂的控制任务&#xff0c;还需要实时地采集和处理数据。 为了满足这…

计算机网络:思科实验【4-生成树协议STP及虚拟局域网VLAN】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容交换机生成树协议**STP**虚拟局域网**VLAN…

[vue2] 使用provide和inject时,无法获取到实时更新的数据

一、场景 当vue文件中存在多级的父子组件传值&#xff08;即&#xff1a;祖先向下传递数据&#xff09;、多个子组件或孙子级组件都要使用顶级或父级的数据时&#xff0c;使用provide 和 inject 组合无疑是很方便的一种做法了&#xff0c;但如此只是注入的初始值&#xff0c;并…

解码云原生架构:应对变革的挑战

云原生是什么 每次听到这个名词&#xff0c;总是感觉既熟悉&#xff0c;又陌生&#xff0c;真的是很难受&#xff0c;盘他&#xff01; 云原生&#xff08;Cloud-Native&#xff09;是一种软件开发和部署的方法论&#xff0c;旨在利用云计算和云服务的优势来构建、部署和管理…

xss-跨站脚本攻击漏洞

前备知识&#xff1a; Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术&#xff0c;它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**&#xff1a; - Cookie是一种由服务器发送到客户端&#xff08;通常是用户的浏览器&#x…

皓学IT:WEB05-Servlet

一、Servlet 1.1.概述 Servlet是SUN公司提供的一套规范&#xff0c;名称就叫Servlet规范&#xff0c;它也是JavaEE规范之一。我们可以像学习Java基础一样&#xff0c;通过API来学习Servlet。这里需要注意的是&#xff0c;在我们之前JDK的API中是没有Servlet规范的相关内容&am…