JSP页面无法获取Servlet中setAttribute设置的属性(含Session问题)
以下是针对你遇到的问题的具体排查方向:
跳转方式错误导致request属性丢失
这是最常见的问题:如果Servlet中使用response.sendRedirect("weather.jsp")重定向到JSP,request作用域的属性会完全丢失——因为重定向是发起了一个全新的HTTP请求,和原Servlet的请求无关。必须使用请求转发才能传递request属性:// 正确的转发写法 request.getRequestDispatcher("/WEB-INF/weather.jsp").forward(request, response);属性设置时机或名称不匹配
确保request.setAttribute()是在转发之前执行的,且属性名称和JSP中使用的完全一致(Java大小写敏感):// Servlet中设置属性 String city = "北京"; // 假设从API获取到的城市名 request.setAttribute("city", city); // 属性名是"city" // 随后执行转发JSP中必须对应使用
${city}或者request.getAttribute("city"),不能写错成${City}或者${cityName}。EL表达式被禁用
若你的项目使用老旧的JSP或web.xml版本,EL表达式可能默认禁用:- 在JSP页面顶部添加指令开启EL:
<%@ page isELIgnored="false" %> - 检查web.xml的版本,确保是2.4及以上(比如2.5、3.0),旧版本(2.3及以下)会默认禁用EL:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
- 在JSP页面顶部添加指令开启EL:
Servlet逻辑异常导致属性未被设置
检查OpenWeatherMap API调用是否成功,是否有异常抛出导致request.setAttribute()代码未执行。可以在Servlet中添加日志或打印语句验证:try { // 调用API获取天气数据 String city = weatherApi.getCityName(); System.out.println("获取到的城市名:" + city); // 控制台查看是否有值 request.setAttribute("city", city); } catch (Exception e) { e.printStackTrace(); // 检查是否有异常中断了流程 }直接访问JSP而非通过Servlet触发请求
如果直接在浏览器输入JSP的URL(比如http://localhost:8080/weather.jsp),Servlet不会被执行,自然没有设置任何request属性。必须访问Servlet的映射路径(比如http://localhost:8080/getWeather),由Servlet处理后转发到JSP。
内容的提问来源于stack exchange,提问作者Ghost

