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


相关文章
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
145 1
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
19天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
17天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
49 1
Spring MVC——获取参数和响应
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
35 2
|
1月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
41 3
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
41 2