参数解密:揭示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。


相关文章
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
188 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
119 62
|
3天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
108 0
|
10天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
24 4
|
24天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
52 14
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
218 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
22天前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
53 2
|
1月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
74 8
|
28天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
107 2
|
29天前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
43 1