Servlet转发至JSP时参数始终传递null值的问题排查
问题分析与解决方案
嘿,我看到你的问题了,这其实是一个很容易踩的小坑!你的代码里有一个关键错误导致JSP拿不到Servlet设置的参数:你在Servlet中不必要地获取并关闭了PrintWriter,这直接导致请求转发失效。
问题根源
你写的这段代码:
try (PrintWriter out = response.getWriter()) { request.setAttribute("name", new String("aa")); this.getServletContext().getRequestDispatcher("/index.jsp").forward(request,response); }
使用了try-with-resources语法,它会在代码块结束时自动关闭PrintWriter。而一旦关闭PrintWriter,HTTP响应的头部就会被提交给客户端,容器会认为整个响应已经完成,这时候再调用forward就不会生效了——你的JSP收到的其实是初始的请求,而不是Servlet设置完attribute后的转发请求,所以自然拿不到name的值,输出null。
而且你根本没用到这个PrintWriter来输出任何内容,完全是多余的操作。
修正后的代码
把多余的PrintWriter相关代码删掉就可以了,修改后的Servlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", "aa"); // 这里也不用new String("aa"),直接写字符串字面量就行 this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); }
额外小优化
你的JSP代码可以稍微简化一下,用EL表达式会更简洁易读,代替脚本片段:
${name}
EL表达式会自动从request、session等作用域中查找name属性,比Java脚本片段更符合现代JSP的写法。
这样修改之后,你再发起请求,JSP就能正确输出aa了!
内容的提问来源于stack exchange,提问作者Jane-Claire
相关产品推荐
相关产品推荐

