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

目录

[1 通过 HttpServletRequest 获取请求参数](#1 通过 HttpServletRequest 获取请求参数)

[2 通过控制器方法的形参获取请求参数](#2 通过控制器方法的形参获取请求参数)

[3 通过 POJO 获取请求参数(重点)](#3 通过 POJO 获取请求参数(重点))


1 通过 HttpServletRequest 获取请求参数

public String handler1(HttpServletRequest request)

java 复制代码
<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 一致

java 复制代码
<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,如果没有传该参数,就使用默认值
java 复制代码
<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 可以是 hobbsy0,指定在数组中存放的位置。同理,titles0 可以为 titles,不指定在列表中存放的位置,按照请求参数的顺序来。此外,可以不按照顺序来,如第一个 hobbys0,下一个为 hobbys2,中间的 hobbys1 没有,默认为 null。对于 companys'公司1'.companyName / values,根据 private Map<String, Company> companys,'公司' 是 key,companys'公司1' 为 value,也就是 Company 对象,companyName、values 是它的属性。

java 复制代码
<%@ 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 类

java 复制代码
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

java 复制代码
@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 类

java 复制代码
public class Company {
    private String companyName;
    private String values;
    
    // setter、getter 方法省略
}

Userinfo 类

java 复制代码
public class UserInfo {
    private int age;
    private int height;

    // setter、getter 方法省略
}

执行结果

相关推荐
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO8 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆8 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光8 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林8 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu9 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
圆奋奋10 小时前
FreeRTOS学习(三)- 任务调度模块
学习·开源·freertos
AI人工智能+电脑小能手10 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官10 小时前
Sa-Token和Spring Security对比
java·后端·spring
吃着火锅x唱着歌10 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习