You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlet中如何通过路径参数获取URL参数?适配CRUD操作

在HttpServlet的doPut/doDelete方法中获取参数的方案

一、获取URL路径参数

如果你的请求URL是类似/users/123这种带路径参数的格式(123为用户ID),可以通过HttpServletRequest的getPathInfo()方法提取参数,步骤如下:

  1. 配置Servlet的URL映射时,使用通配符匹配路径:

    • 注解方式:
    @WebServlet("/users/*")
    public class UserServlet extends HttpServlet {
        // 重写doPut/doDelete方法
    }
    
    • web.xml配置方式:
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/users/*</url-pattern>
    </servlet-mapping>
    
  2. 在doPut/doDelete方法中解析路径参数:

@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 获取URL中Servlet映射之后的部分,比如请求/users/123时,返回"/123"
    String pathInfo = req.getPathInfo();
    
    // 校验参数是否存在
    if (pathInfo == null || pathInfo.length() <= 1) {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "缺少用户ID参数");
        return;
    }
    
    // 截取参数值(去掉开头的斜杠)
    String userId = pathInfo.substring(1);
    System.out.println("要删除的用户ID:" + userId);
    
    // 执行数据库删除逻辑...
    
    resp.setStatus(HttpServletResponse.SC_OK);
    resp.getWriter().write("用户ID " + userId + " 删除成功");
}

二、获取请求体中的参数

HttpServlet默认不会自动解析PUT/DELETE请求的请求体到参数Map中,需要手动读取并解析,常见两种格式的处理方式:

1. 处理表单格式参数(x-www-form-urlencoded)

@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 先获取路径参数(用户ID)
    String pathInfo = req.getPathInfo();
    if (pathInfo == null || pathInfo.length() <= 1) {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "缺少用户ID参数");
        return;
    }
    String userId = pathInfo.substring(1);
    
    // 读取请求体内容
    BufferedReader reader = req.getReader();
    String bodyContent = reader.lines().collect(Collectors.joining());
    
    // 解析表单参数
    Map<String, String> params = new HashMap<>();
    String[] paramPairs = bodyContent.split("&");
    for (String pair : paramPairs) {
        String[] keyValue = pair.split("=");
        if (keyValue.length == 2) {
            // 解码避免乱码
            String key = URLDecoder.decode(keyValue[0], StandardCharsets.UTF_8.name());
            String value = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8.name());
            params.put(key, value);
        }
    }
    
    // 获取具体参数
    String userName = params.get("name");
    String userEmail = params.get("email");
    
    // 执行数据库更新逻辑...
    
    resp.setStatus(HttpServletResponse.SC_OK);
    resp.getWriter().write("用户ID " + userId + " 更新成功,新名称:" + userName + ",新邮箱:" + userEmail);
}

2. 处理JSON格式参数

如果用Postman发送JSON格式请求体,需引入Jackson解析库,将请求体转为Java对象:

首先添加Jackson依赖(Maven示例):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

然后编写代码:

// 定义实体类
class User {
    private String name;
    private String email;
    
    // 必须提供无参构造器
    public User() {}
    
    // getter和setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

// 在doPut方法中解析JSON
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String pathInfo = req.getPathInfo();
    if (pathInfo == null || pathInfo.length() <= 1) {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "缺少用户ID参数");
        return;
    }
    String userId = pathInfo.substring(1);
    
    // 解析JSON请求体
    ObjectMapper objectMapper = new ObjectMapper();
    User user = objectMapper.readValue(req.getInputStream(), User.class);
    
    String userName = user.getName();
    String userEmail = user.getEmail();
    
    // 执行数据库更新逻辑...
    
    resp.setStatus(HttpServletResponse.SC_OK);
    resp.getWriter().write("用户ID " + userId + " 更新成功,新名称:" + userName + ",新邮箱:" + userEmail);
}

Postman使用注意事项

  • 路径参数直接拼在URL后,例如http://localhost:8080/your-app/users/123
  • 传递表单参数时,选择Body的x-www-form-urlencoded类型添加键值对
  • 传递JSON参数时,选择Body的raw类型、格式选JSON,同时设置请求头Content-Type: application/json

内容的提问来源于stack exchange,提问作者Sumit Negi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:54:18