核心方法
HttpServletRequest 接口提供了几个主要的方法来获取请求参数,这些方法主要处理的是 URL 查询字符串( 后面的部分)或 POST 请求的请求体(application/x-www-form-urlencoded 格式)中的数据。

getParameter(String name)
- 用途:根据参数名获取单个参数值。
- 返回值:参数的字符串值,如果参数不存在,返回
null。 - 特点:如果同一个参数名有多个值(
?name=Tom&name=Jerry),它只会返回第一个值。
String username = request.getParameter("username");
getParameterValues(String name)
- 用途:当一个参数名对应多个值时使用(例如复选框、多选列表)。
- 返回值:一个字符串数组,包含该参数名对应的所有值,如果参数不存在,返回
null。
// 假设前端有多个 hobby 参数: ?hobby=reading&hobby=music
String[] hobbies = request.getParameterValues("hobby");
if (hobbies != null) {
for (String hobby : hobbies) {
System.out.println(hobby);
}
}
getParameterMap()
- 用途:获取一个包含所有参数的
Map。 - 返回值:一个
Map<String, String[]>,key是参数名,value是参数值数组。 - 特点:这是获取所有参数最全面的方法,特别适合通用处理逻辑(如将请求参数自动绑定到 Java 对象)。
Map<String, String[]> parameterMap = request.getParameterMap();
// 遍历 Map
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String name = entry.getKey();
String[] values = entry.getValue();
System.out.println("Parameter: " + name);
System.out.println("Values: " + Arrays.toString(values));
}
完整示例代码
下面是一个完整的 Servlet 示例,演示了如何在一个 Web 应用中获取和显示所有请求参数。
web.xml 配置 (传统方式)
如果你使用较老的 Java Web 项目,可能需要一个 web.xml 文件来映射 Servlet。
<?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">
<servlet>
<servlet-name>ParameterServlet</servlet-name>
<servlet-class>com.example.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParameterServlet</servlet-name>
<url-pattern>/getParams</url-pattern>
</servlet-mapping>
</web-app>
ParameterServlet.java 代码
package com.example;
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.io.PrintWriter;
import java.util.Arrays;
import java.util.Map;
@WebServlet("/getParams") // 使用注解方式映射,可以省略 web.xml
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 设置响应内容类型和字符编码,防止中文乱码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 2. 获取单个参数
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("<h2>单个参数获取</h2>");
out.println("<p>用户名: " + (username != null ? username : "未提供") + "</p>");
out.println("<p>密码: " + (password != null ? password : "未提供") + "</p>");
out.println("<hr>");
// 3. 获取多值参数
String[] hobbies = request.getParameterValues("hobby");
out.println("<h2>多值参数获取 (例如复选框)</h2>");
if (hobbies != null && hobbies.length > 0) {
out.println("<p>您的爱好是: " + Arrays.toString(hobbies) + "</p>");
} else {
out.println("<p>您没有选择任何爱好。</p>");
}
out.println("<hr>");
// 4. 获取所有参数
Map<String, String[]> parameterMap = request.getParameterMap();
out.println("<h2>获取所有参数 (使用 getParameterMap)</h2>");
out.println("<table border='1'>");
out.println("<tr><th>参数名</th><th>参数值</th></tr>");
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String name = entry.getKey();
String[] values = entry.getValue();
out.println("<tr>");
out.println("<td>" + name + "</td>");
// 如果只有一个值,直接显示;如果有多个值,用逗号连接显示
out.println("<td>" + String.join(", ", values) + "</td>");
out.println("</tr>");
}
out.println("</table>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 请求获取参数的方式和 GET 完全一样
// 但为了防止中文乱码,通常需要设置请求体的编码
request.setCharacterEncoding("UTF-8");
doGet(request, response); // 复用 doGet 的逻辑
}
}
测试 index.html
创建一个简单的 HTML 表单来测试这个 Servlet。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">参数提交测试</title>
</head>
<body>
<h1>GET 请求测试</h1>
<form action="getParams" method="get">
用户名: <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="music"> 音乐
<input type="checkbox" name="hobby" value="sports"> 运动<br>
<input type="submit" value="GET 提交">
</form>
<hr>
<h1>POST 请求测试</h1>
<form action="getParams" 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="music"> 音乐
<input type="checkbox" name="hobby" value="sports"> 运动<br>
<input type="submit" value="POST 提交">
</form>
</body>
</html>
重要注意事项
请求方法 (GET vs. POST)
- GET 请求:参数在 URL 中( 之后),长度有限制,且会暴露在浏览器地址栏和历史记录中。
- POST 请求:参数在请求体中,理论上可以传输更大的数据,且对用户更隐蔽。
获取参数的 Java 代码对于这两种方式是相同的,但处理逻辑上可能有区别(doPost 中通常需要设置字符编码)。

中文乱码问题
这是 Web 开发中最常见的问题之一。
- GET 请求乱码:通常由服务器(如 Tomcat)的
URIEncoding配置导致,在 Tomcat 的conf/server.xml中,为<Connector>标签添加URIEncoding="UTF-8"。<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- POST 请求乱码:需要在读取参数之前,手动设置请求体的编码。
// 在 doPost 方法的开头调用 request.setCharacterEncoding("UTF-8");
其他类型的请求体 (JSON, XML)
getParameter 系列方法只能处理 application/x-www-form-urlencoded 和 multipart/form-data(文件上传)格式的数据。
如果客户端发送的是 JSON 格式的数据(这在 RESTful API 中非常普遍),你需要:
- 从请求体中读取原始的流数据。
- 使用 JSON 库(如 Jackson, Gson)将其解析成 Java 对象。
示例:接收 JSON 数据

假设前端发送一个 POST 请求,Content-Type 为 application/json,数据为 {"name":"John", "age":30}。
// 在你的 Servlet 或 Controller 中
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String jsonPayload = sb.toString();
// 使用 Jackson 库解析
ObjectMapper mapper = new ObjectMapper();
try {
User user = mapper.readValue(jsonPayload, User.class);
System.out.println("User name: " + user.getName());
System.out.println("User age: " + user.getAge());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
使用框架 (Spring Boot)
在现代 Java Web 开发中,我们通常使用 Spring Boot 等框架,它们极大地简化了参数获取的过程。
Spring Boot 示例
- 接收单个参数:
@GetMapping("/user") public String getUser(@RequestParam("name") String username) { return "Hello, " + username; } - 接收多值参数:
@GetMapping("/hobbies") public String getHobbies(@RequestParam("hobby") List<String> hobbies) { return "Your hobbies are: " + hobbies; } - 接收 JSON 对象:
@PostMapping("/user") public String createUser(@RequestBody User user) { // Spring 会自动将 JSON 请求体解析成 User 对象 return "Created user: " + user.getName(); }
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 传统 Servlet | request.getParameter(name) |
获取单个值。 |
request.getParameterValues(name) |
获取多值(如复选框)。 | |
request.getParameterMap() |
获取所有参数的 Map。 | |
| JSON 数据 | request.getReader() + Jackson/Gson |
手动读取请求体并解析。 |
| Spring Boot | @RequestParam |
绑定表单或查询参数。 |
@RequestBody |
绑定 JSON/XML 请求体到 Java 对象。 |
