Servlet向JavaScript传值始终为null,求问题排查方案
看起来你遇到了Servlet往JavaScript传值一直拿到null的问题,我帮你分析下代码里的几个关键点,以及对应的解决办法:
1. 根源可能是session.getAttribute("uname")本身就是null
你在Servlet里获取requester的代码是:
String requester=(String) session.getAttribute("uname"); session.setAttribute("passingv", requester);
如果当前session里根本没有uname这个属性,那requester就是null,存到passingv里自然也是null,后面不管怎么传都是空。
解决办法:
先在Servlet里加个调试输出,确认requester的值:
System.out.println("当前requester的值:" + requester);
如果输出是null,那得回头检查登录逻辑,确保用户登录成功后,session.setAttribute("uname", 用户名)这行代码确实被执行了,而且用户名没有为空。
2. 验证失败时的sendRedirect和out.println混用导致响应异常
当用户验证失败时,你先通过out.println输出alert脚本,然后调用response.sendRedirect("main.jsp")。这里有个严重问题:out.println会往响应里写内容,此时响应的头信息可能已经被提交,再调用sendRedirect会触发IllegalStateException(因为响应已经提交,不能再修改头信息),导致跳转失效或者页面异常,进而影响session属性的读取。
解决办法:
别混用输出内容和重定向,改成下面两种方式之一:
方式一:用服务器内部跳转(forward),把错误信息放到request里,在main.jsp里显示alert:
Servlet代码修改:else { request.setAttribute("errorMsg", "User does not exist"); request.getRequestDispatcher("main.jsp").forward(request, response); }main.jsp里添加:
<% if(request.getAttribute("errorMsg") != null) { %> <script>alert('<%= request.getAttribute("errorMsg") %>');</script> <% } %>方式二:一定要用重定向的话,把错误信息放到session里,在main.jsp读取后移除:
Servlet代码修改:else { session.setAttribute("errorMsg", "User does not exist"); response.sendRedirect(request.getContextPath() + "/main.jsp"); }main.jsp里添加:
<% if(session.getAttribute("errorMsg") != null) { %> <script>alert('<%= session.getAttribute("errorMsg") %>');</script> <% session.removeAttribute("errorMsg"); %> <%-- 避免刷新页面重复弹出 --%> <% } %>
3. JavaScript获取值的逻辑没处理null的情况
你的main.js代码是:
var test = '<%=(String)session.getAttribute("passingv")%>'; console.log(test);
如果passingv是null,JSP会输出字符串"null",所以test会是'null'(字符串类型),而不是JavaScript的null值。如果你的业务逻辑把这个字符串当成了JS的null,就会出现“拿到null”的错觉(或者不符合预期的行为)。
解决办法:
修改JS代码,把字符串"null"转换成JS的null:
var test = '<%=(String)session.getAttribute("passingv")%>'; test = test === 'null' ? null : test; console.log(test);
或者在JSP层面直接处理,输出符合JS语法的内容:
var test = <%= session.getAttribute("passingv") == null ? "null" : "'" + session.getAttribute("passingv") + "'" %>; console.log(test);
这样如果passingv是null,JS代码会变成var test = null;,完全符合预期。
4. 跳转路径可能不正确
如果你的Web应用有上下文路径(比如部署在http://localhost:8080/yourApp/),直接写response.sendRedirect("main.jsp")可能会跳转到错误的地址(比如http://localhost:8080/main.jsp,而不是你的应用下的main.jsp),导致页面加载异常,自然拿不到session里的值。
解决办法:
用上下文路径拼接跳转地址:
response.sendRedirect(request.getContextPath() + "/main.jsp");
这样能确保跳转到正确的页面。
内容的提问来源于stack exchange,提问作者gopal krishna mareti

