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
相关产品推荐
相关产品推荐

