Java Servlet中如何通过路径参数获取URL参数?适配CRUD操作
在HttpServlet的doPut/doDelete方法中获取参数的方案
一、获取URL路径参数
如果你的请求URL是类似/users/123这种带路径参数的格式(123为用户ID),可以通过HttpServletRequest的getPathInfo()方法提取参数,步骤如下:
配置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>在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
相关产品推荐
相关产品推荐

