参数解密:揭示Spring MVC请求参数处理的实际应用指南

简介: 参数解密:揭示Spring MVC请求参数处理的实际应用指南

处理中文乱码

配置 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 引入 DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- 指定 Spring MVC 配置文件位置 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
        <!-- 设置此 Servlet 在 Tomcat 启动的时候创建 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
  
    <!-- POST 中文乱码 -->
    <servlet>
        <servlet-name>characterEncodingFilter</servlet-name>
        <servlet-class>org.springframework.web.filter.CharacterEncodingFilter</servlet-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>characterEncodingFilter</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

HttpServletRequest

/**
 * 发送Get请求
 * http://localhost:8080/api1?username=XW&password=123456
 */
@RequestMapping("/api1")
public String api1(HttpServletRequest request) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username = " + username + ", password = " + password);
    return "index";
}

简单变量

/**
 * 发送Get请求
 * http://localhost:8080/api2?username=XW&password=123456&age=10
 */
@RequestMapping("/api2")
public String api2(String username, String password, Integer age) {
    System.out.println("username = " + username + ", password = " + password + ", age = " + age);
    return "index";
}
  • 对于常用的类型变量(八大基本数据类型 + String),SpringMVC 会对自动进行类型的转换。
  • 在定义参数的时候使用基本数据类型的包装器。

基于 POJO 的请求传参

package world.xuewei.entity;
/**
 * 用户实体
 *
 * @author 薛伟
 * @since 2023/10/30 16:18
 */
public class User {
    private String username;
    private String password;
    private Integer age;
    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 Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
/**
 * 发送Get请求
 * http://localhost:8080/api3?username=XW&password=123456&age=10
 */
@RequestMapping("/api3")
public String api3(User user) {
    System.out.println(user);
    return "index";
}
  • 当接口的参数列表为 String api3(String username, User user) 时,简单变量和 POJO 对象都可以接收到参数的值。

简单变量数组

/**
 * 发送Get请求
 * http://localhost:8080/api4?ids=1&ids=2&ids=3
 */
@RequestMapping("/api4")
public String api4(Integer[] ids) {
    System.out.println(Arrays.toString(ids));
    return "index";
}

注意:这种情况不可以使用 List 来接受参数。

原因是 SpringMVC 在做参数赋值的时候先去判断是否为简单对象,如果不是简单对象,那么会去创建定义的参数的对象,然后调用 set 方法进行属性的赋值。对于这个场景而言,首先 List 是接口,无法创建对象,程序将抛出异常,若将 List 改为 ArrayList,那么虽然可以创建对象,但是 ArrayList 中并没有 ids 的属性,所以无法进行赋值。

接收一组 POJO 对象

接收一组 POJO 就需要定义一个 DTO,在 DTO 中创建对应的属性,完成属性的赋值。

package world.xuewei.entity;
import java.util.List;
/**
 * 用户传输对象
 *
 * @author 薛伟
 * @since 2023/10/30 16:18
 */
public class UserDTO {
    
    List<User> users;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
}
/**
 * 发送POST请求
 */
@RequestMapping("/api5")
public String api5(UserDTO dto) {
    System.out.println(dto.getUsers());
    return "index";
}

@RequestParam注解

在 Spring 框架中,@RequestParam 注解用于将请求中的参数绑定到方法的参数上。它可以被用于处理 GET 或 POST 请求中的查询字符串参数或表单参数。

使用 @RequestParam 注解时,你需要指定参数的名称,该名称与请求中的参数名称一致。如果请求中的参数与方法参数的名称相同,可以省略 @RequestParam 注解中的 value 属性。

@RequestParam 注解提供了一些可选属性,让你可以更好地控制参数的行为:

  1. value:指定请求参数的名称,如果省略,则默认使用参数名作为请求参数的名称。
  2. required:指定该参数是否为必需的,默认为 true,表示请求中必须包含该参数,否则将抛出异常。如果设置为 false,则表示该参数是可选的。
  3. defaultValue:指定当请求中没有指定该参数时的默认值。如果请求中存在该参数,则使用请求中的值,否则使用默认值。

下面是一个使用 @RequestParam 注解的示例:

@RequestMapping(value = "/example")
public String exampleMethod(@RequestParam(value = "n", required = true) String name,
                            @RequestParam(value = "age", required = false, defaultValue = "0") int age) {
    // 方法体
}

POJO 类型的形参,不能使用此注解,不然会报错 400。

接收Map数据

单值动态参数

package world.xuewei.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
import java.util.Objects;
/**
 * 第一个控制器
 *
 * @author 薛伟
 * @since 2023/10/30 16:18
 */
@Controller
public class MapController {
    @RequestMapping("/map")
    public String map(@RequestParam Map<String, Object> map) {
        System.out.println(map);
        return "index";
    }
}

http://localhost:8080/map?name=xw&age=25

注意:必须使用 @RequestParam 注解

多值动态参数

package world.xuewei.controller;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * 第一个控制器
 *
 * @author 薛伟
 * @since 2023/10/30 16:18
 */
@Controller
public class MapController {
    @RequestMapping("/map")
    public String map(@RequestParam MultiValueMap<String, String> map) {
        System.out.println(map);
        return "index";
    }
}

http://localhost:8080/map?name=xw&name=zs&name=li

注意:此处使用 MultiValueMap 接口参数,每个 key 对应的值都是一个 List。


相关文章
|
19小时前
|
Cloud Native Java 关系型数据库
【阿里云云原生专栏】构建云原生应用:基于Spring Boot与阿里云服务的全栈指南
【5月更文挑战第21天】构建云原生应用是企业数字化转型的关键,本文提供了一份基于Spring Boot和阿里云的全栈指南。涵盖从阿里云账号注册、ECS与Docker搭建,到Spring Boot项目创建、业务代码编写和部署。此外,还介绍了如何集成阿里云OSS存储、RDS数据库服务以及ACK容器服务,助力打造高效、可扩展和易管理的云原生应用。
78 3
|
4天前
|
前端开发 Java 关系型数据库
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
|
5天前
|
前端开发 JavaScript 开发者
深入理解MVC和MVVM:构建现代Web应用的利器
深入理解MVC和MVVM:构建现代Web应用的利器
|
6天前
|
Java 关系型数据库 MySQL
【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制
【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制
9 0
|
6天前
|
JSON 前端开发 Java
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解(下)
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解
7 0
|
6天前
|
JSON 前端开发 Java
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解(上)
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解
7 0
|
6天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
293 3
|
6天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
18 2
|
6天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
33 3
|
6天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
16 1