JSP无法从Servlet获取requestScope下的List<String>问题求助
排查Servlet传List到JSP无法获取的问题
嘿,我太懂你这种明明数据就在眼前,JSP却死活拿不到的挫败感了!控制台能打印List元素,说明数据本身没问题,问题大概率出在数据传递的环节或者JSP取值的姿势上。给你几个我踩过坑后总结的排查方向:
1. 先检查跳转方式是不是错了
如果你的Servlet用的是response.sendRedirect("xxx.jsp"),那request里的属性肯定拿不到!因为这是客户端跳转,相当于浏览器重新发了一次请求,原来的request对象早就被销毁了。
换成服务器端跳转就好:
// 先把List存到request里 request.setAttribute("hotelList", yourList); // 再用getRequestDispatcher转发 request.getRequestDispatcher("/targetPage.jsp").forward(request, response);
要是你存的是session,跳转方式不影响,但得确保session没被意外 invalidate 掉。
2. 核对JSP里的取值细节
- 变量名要完全匹配:Servlet里存的是
request.setAttribute("hotelList", list),JSP里就不能写成${hotelsList},大小写也不能错,EL表达式是区分大小写的。 - 确保EL表达式没被忽略:在JSP顶部加上
<%@ page isELIgnored="false" %>,要是这个属性设为true,EL会被当成普通字符串输出,自然拿不到数据。 - 取值范围别搞混:如果存的是requestScope,就别在JSP里用
${sessionScope.hotelList},直接写${hotelList}让容器自动从page→request→session→application里查找,更省心。
3. 检查代码执行顺序
别犯这种低级但容易踩的错:先跳转再存数据!比如你先调用了forward,再去setAttribute,那数据根本没存到当前请求里,JSP当然拿不到。正确顺序一定是:生成List → 存到request/session → 跳转页面。
4. 用JSTL遍历的话要引对标签库
如果你想用<c:forEach>遍历List,得在JSP顶部引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
不然标签会被当成普通文本,遍历逻辑根本不生效。
举个完整的正确示例:
Servlet代码片段
@WebServlet(name = "ValidaLoginHotelServlet", urlPatterns = {"/ValidaLoginHotelServlet"}) public class ValidaLoginHotelServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 生成你的List List<Hotel> hotelList = new ArrayList<>(); // 假设这里添加了元素,控制台能打印 hotelList.add(new Hotel("酒店A", "地址A")); System.out.println(hotelList.get(0).getName()); // 能正常输出 // 存到request request.setAttribute("hotelList", hotelList); // 服务器端跳转 request.getRequestDispatcher("/hotelList.jsp").forward(request, response); } }
JSP代码片段
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>酒店列表</title> </head> <body> <h3>酒店列表:</h3> <c:forEach items="${hotelList}" var="hotel"> <p>酒店名称:${hotel.name},地址:${hotel.address}</p> </c:forEach> </body> </html>
按照这些方向排查,应该能找到问题所在!
内容的提问来源于stack exchange,提问作者Bruna Zamith
相关产品推荐
相关产品推荐

