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

Servlet如何通过请求读取ArrayList?参数传递获空值问题求助

解决Servlet获取ArrayList参数返回null的问题

哎,你这是踩了一个很常见的坑哦!咱们一步步来捋清楚问题出在哪,以及怎么解决:

为什么你拿不到值?

首先得明确:你在URL里传的usersList是请求参数(Request Parameter),而你用request.getAttribute("usersList")获取的是请求属性(Request Attribute)——这俩根本不是一回事!

  • 请求参数:是客户端通过URL、表单提交的键值对,只能是字符串类型,要用request.getParameter()系列方法获取
  • 请求属性:是服务器端代码通过request.setAttribute()存入请求域的对象,通常用于请求转发时共享数据,只能用getAttribute()获取

所以你用错方法了,自然拿到null啦!

针对你的场景,有两种可行解决方案

方案1:用请求转发传递ArrayList(推荐,适合服务器内部跳转)

如果你的请求是从另一个Servlet/JSP转发过来的,那别直接在URL里传对象,而是先把ArrayList存入请求属性再转发:

// 转发前的代码(比如原Servlet或JSP)
ArrayList<User> usersList = new ArrayList<>();
// 这里填充你的usersList数据
request.setAttribute("usersList", usersList);

// 转发到目标Servlet
RequestDispatcher dispatcher = request.getRequestDispatcher("/AttendanceTrack/UserGroupController");
dispatcher.forward(request, response);

然后在目标Servlet里,你原来的代码ArrayList usersList = (ArrayList) request.getAttribute("usersList");就能正常拿到数据了!

方案2:把ArrayList转成字符串通过URL传递(适合GET请求直接跳转)

如果必须通过URL传递(比如从前端页面直接跳转),那得把ArrayList转换成可传递的字符串格式,再在Servlet端解析回来:

简单场景(比如存储的是ID/字符串列表)

把列表转成逗号分隔的字符串:

  • 发送方URL:http://192.168.1.xxx:8080/AttendanceTrack/UserGroupController?usersList=1,2,3,4
  • 接收方Servlet代码:
String usersStr = request.getParameter("usersList");
ArrayList<String> usersList = new ArrayList<>();
if (usersStr != null && !usersStr.isEmpty()) {
    usersList = new ArrayList<>(Arrays.asList(usersStr.split(",")));
    // 如果是用户对象,可以用这些ID去数据库查询对应的实体
}

复杂对象场景(比如存储的是自定义User对象)

推荐用JSON格式序列化后传递,记得要URL编码避免乱码:

  • 发送方示例(用Jackson序列化):
// 先把ArrayList转成JSON字符串
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(usersList);
// URL编码处理
String encodedJson = URLEncoder.encode(jsonStr, StandardCharsets.UTF_8.name());
// 拼接成URL
String targetUrl = "http://192.168.1.xxx:8080/AttendanceTrack/UserGroupController?usersList=" + encodedJson;
  • 接收方Servlet解析:
String encodedJson = request.getParameter("usersList");
ArrayList<User> usersList = new ArrayList<>();
if (encodedJson != null) {
    // 先解码
    String jsonStr = URLDecoder.decode(encodedJson, StandardCharsets.UTF_8.name());
    // 反序列化成ArrayList
    ObjectMapper mapper = new ObjectMapper();
    usersList = mapper.readValue(jsonStr, new TypeReference<ArrayList<User>>() {});
}

最后再划个重点

别再把请求参数和请求属性搞混啦!复杂对象优先用请求转发传递属性,简单数据才用URL参数~

内容的提问来源于stack exchange,提问作者Bright Varghese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:40:02