杰瑞科技汇

Java request如何获取参数?

下面我将从最基础的原生 Servlet 讲起,然后过渡到现代主流的 Spring 框架,并详细说明各种参数类型的获取方法。

Java request如何获取参数?-图1
(图片来源网络,侵删)

原生 Servlet 环境 (Java EE / Jakarta EE)

在原生 Servlet 中,我们通过 HttpServletRequest 对象来获取请求参数。

HttpServletRequest 对象

当一个请求到达时,Servlet 容器(如 Tomcat)会创建一个 HttpServletRequest 对象,并通过 service() 方法或 doGet()/doPost() 方法传递给我们的 Servlet,我们可以通过这个对象获取所有请求相关的信息。

主要获取参数的方法

HttpServletRequest 提供了几个核心方法来获取参数:

  1. String getParameter(String name)

    Java request如何获取参数?-图2
    (图片来源网络,侵删)
    • 用途:根据参数名获取单个参数值。
    • 特点:如果参数不存在,返回 null,如果参数存在但有多个值(例如复选框),它只返回第一个值。
    • 示例
      • 请求URL: http://example.com?name=Alice&age=25
      • 代码: String name = request.getParameter("name"); // 得到 "Alice"
  2. String[] getParameterValues(String name)

    • 用途:根据参数名获取一个参数值数组,主要用于获取一个参数名对应多个值的场景(如复选框、多选列表)。
    • 特点:如果参数不存在,返回 null
    • 示例
      • 请求URL: http://example.com?hobby=reading&hobby=music
      • 代码: String[] hobbies = request.getParameterValues("hobby"); // 得到 {"reading", "music"}
  3. Enumeration<String> getParameterNames()

    • 用途:获取所有参数名的枚举(Enumeration)。
    • 特点:可以遍历所有提交过来的参数名。
    • 示例
      Enumeration<String> parameterNames = request.getParameterNames();
      while (parameterNames.hasMoreElements()) {
          String paramName = parameterNames.nextElement();
          System.out.println("Parameter: " + paramName);
      }
  4. Map<String, String[]> getParameterMap()

    • 用途:获取一个包含所有参数的 Map,键是参数名,值是参数值数组。
    • 特点:这是最全面的获取所有参数的方式。
    • 示例
      Map<String, String[]> parameterMap = request.getParameterMap();
      for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
          System.out.println("Key: " + entry.getKey() + ", Values: " + Arrays.toString(entry.getValue()));
      }

代码示例 (Servlet)

假设有一个 HTML 表单:

Java request如何获取参数?-图3
(图片来源网络,侵删)
<form action="submit" method="post">
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    爱好:
    <input type="checkbox" name="hobby" value="reading"> 阅读
    <input type="checkbox" name="hobby" value="sports"> 运动<br>
    <input type="submit" value="提交">
</form>

对应的 SubmitServlet.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
@WebServlet("/submit")
public class SubmitServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 设置请求编码(非常重要,防止中文乱码)
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        // 2. 获取单个参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 3. 获取多选框参数
        String[] hobbies = request.getParameterValues("hobby");
        // 打印获取到的参数
        System.out.println("用户名: " + username);
        System.out.println("密码: " + password);
        System.out.println("爱好: " + (hobbies != null ? Arrays.toString(hobbies) : "无"));
        // ... 业务逻辑处理 ...
        response.getWriter().println("提交成功!");
    }
}

Spring MVC 环境

Spring MVC 通过将 HTTP 请求参数自动绑定到控制器方法的参数上,极大地简化了获取参数的过程,这是目前最主流、最方便的方式。

核心原理:@RequestParam

Spring 使用 @RequestParam 注解将请求中的参数绑定到控制器方法的形参上。

主要用法

获取单个参数

假设请求是 GET /user?name=Bob&id=123

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    // 简单映射,参数名与请求参数名一致
    @GetMapping("/user/simple")
    public String getSimpleUser(@RequestParam String name, @RequestParam int id) {
        return "用户: " + name + ", ID: " + id;
    }
    // 使用 @RequestParam 指定参数名,并提供默认值
    @GetMapping("/user")
    public String getUser(
            @RequestParam(value = "name", defaultValue = "Guest") String username,
            @RequestParam(value = "id", required = false) Long userId) {
        // required = false 表示该参数不是必需的,如果不存在则为 null
        return "用户: " + username + ", ID: " + (userId != null ? userId : "未提供");
    }
}
  • value: 指定请求参数的名称,如果形参名和请求参数名一致,可以省略。
  • required: 表示该参数是否必须存在,默认为 true,如果为 true 且参数不存在,会抛出 MissingServletRequestParameterException,如果为 false,参数不存在时,形参值为 null(对于基本类型会报错,所以基本类型不能设置为 required = false)。
  • defaultValue: 如果参数不存在或为空,则使用此默认值。

获取对象(自动封装)

这是 Spring MVC 最强大的功能之一,如果请求参数名和 Java 对象的属性名一致,Spring 会自动创建对象并封装属性。

// 1. 创建一个与参数对应的 POJO (Plain Old Java Object)
public class User {
    private String name;
    private int age;
    // 必须要有无参构造器
    public User() {}
    // Getter 和 Setter 方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}
// 2. 在 Controller 中直接使用该对象作为参数
@RestController
public class UserController {
    @GetMapping("/user/profile")
    public String getUserProfile(User user) {
        // Spring 会自动将 ?name=Alice&age=30 封装到 user 对象中
        return "获取到用户信息: " + user;
    }
}

获取 JSON 请求体

对于 POSTPUT 请求,数据通常以 JSON 格式放在请求体中,Spring Boot 会自动使用 Jackson 或 Gson 库来反序列化 JSON 字符串为 Java 对象。

前端发送 JSON:

{
    "name": "Charlie",
    "age": 28
}

Controller:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    // @RequestBody 注解告诉 Spring 将请求体内容映射到 user 对象
    @PostMapping("/user/create")
    public String createUser(@RequestBody User user) {
        // Spring 会自动将 JSON 请求体反序列化为 User 对象
        return "成功创建用户: " + user;
    }
}
  • @RequestBody: 用来获取请求体中的数据,并将其绑定到方法参数上,它通常用于处理 Content-Typeapplication/json 的请求。

Spring Boot 环境

Spring Boot 是对 Spring 的进一步封装和简化,在 Spring Boot 中,获取参数的方式和 Spring MVC 完全一样,只是配置更加自动化。

你不需要做任何特殊的配置,只需要:

  1. 添加 spring-boot-starter-web 依赖(这会自动包含 Spring MVC 和内嵌的 Tomcat 服务器)。
  2. 编写 Controller,使用 @RestController@Controller,并像上面 Spring MVC 示例那样编写方法即可。

Spring Boot 的自动配置(Auto-configuration)会帮你处理好一切,包括字符编码的默认设置(通常是 UTF-8),这解决了原生 Servlet 中最头疼的中文乱码问题。


总结与对比

场景 原生 Servlet Spring MVC / Spring Boot
获取单个参数 request.getParameter("name") public void method(@RequestParam String name)
获取多值参数 request.getParameterValues("hobbies") public void method(@RequestParam String[] hobbies)
获取所有参数 request.getParameterMap() 通常不需要,直接定义多个 @RequestParam 或接收一个 Map/MultiValueMap
获取参数对象 手动 new 对象,request.getParameter() 逐个赋值 直接在方法参数上定义 POJO,Spring 自动封装
获取 JSON 数据 需要手动解析流(如使用 Jackson 的 ObjectMapper public void method(@RequestBody User user),自动解析
中文乱码问题 需要手动 request.setCharacterEncoding("UTF-8") Spring Boot 默认配置好,基本无需处理
  • 对于学习或维护老旧项目,了解原生 Servlet 的获取方式是必要的。
  • 对于任何新项目,强烈推荐使用 Spring Boot,它通过 @RequestParam@RequestBody 等注解,让获取请求参数变得极其简单和优雅,是业界的事实标准。
分享:
扫描分享到社交APP
上一篇
下一篇