杰瑞科技汇

java 获取request参数

核心方法

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

java 获取request参数-图1
(图片来源网络,侵删)

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 中通常需要设置字符编码)。

java 获取request参数-图2
(图片来源网络,侵删)

中文乱码问题

这是 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-urlencodedmultipart/form-data(文件上传)格式的数据。

如果客户端发送的是 JSON 格式的数据(这在 RESTful API 中非常普遍),你需要:

  1. 从请求体中读取原始的流数据。
  2. 使用 JSON 库(如 Jackson, Gson)将其解析成 Java 对象。

示例:接收 JSON 数据

java 获取request参数-图3
(图片来源网络,侵删)

假设前端发送一个 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 对象。
分享:
扫描分享到社交APP
上一篇
下一篇