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

原生 Servlet 环境 (Java EE / Jakarta EE)
在原生 Servlet 中,我们通过 HttpServletRequest 对象来获取请求参数。
HttpServletRequest 对象
当一个请求到达时,Servlet 容器(如 Tomcat)会创建一个 HttpServletRequest 对象,并通过 service() 方法或 doGet()/doPost() 方法传递给我们的 Servlet,我们可以通过这个对象获取所有请求相关的信息。
主要获取参数的方法
HttpServletRequest 提供了几个核心方法来获取参数:
-
String getParameter(String name)
(图片来源网络,侵删)- 用途:根据参数名获取单个参数值。
- 特点:如果参数不存在,返回
null,如果参数存在但有多个值(例如复选框),它只返回第一个值。 - 示例:
- 请求URL:
http://example.com?name=Alice&age=25 - 代码:
String name = request.getParameter("name");// 得到 "Alice"
- 请求URL:
-
String[] getParameterValues(String name)- 用途:根据参数名获取一个参数值数组,主要用于获取一个参数名对应多个值的场景(如复选框、多选列表)。
- 特点:如果参数不存在,返回
null。 - 示例:
- 请求URL:
http://example.com?hobby=reading&hobby=music - 代码:
String[] hobbies = request.getParameterValues("hobby");// 得到{"reading", "music"}
- 请求URL:
-
Enumeration<String> getParameterNames()- 用途:获取所有参数名的枚举(Enumeration)。
- 特点:可以遍历所有提交过来的参数名。
- 示例:
Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()) { String paramName = parameterNames.nextElement(); System.out.println("Parameter: " + paramName); }
-
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 表单:

<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 请求体
对于 POST 或 PUT 请求,数据通常以 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-Type为application/json的请求。
Spring Boot 环境
Spring Boot 是对 Spring 的进一步封装和简化,在 Spring Boot 中,获取参数的方式和 Spring MVC 完全一样,只是配置更加自动化。
你不需要做任何特殊的配置,只需要:
- 添加
spring-boot-starter-web依赖(这会自动包含 Spring MVC 和内嵌的 Tomcat 服务器)。 - 编写 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等注解,让获取请求参数变得极其简单和优雅,是业界的事实标准。
