Servlet-JSP MVC架构Web应用空指针异常问题求助
NullPointerException问题 咱们一步步拆解你遇到的这个问题——重定向到JSP时抛出org.apache.jasper.JasperException: java.lang.NullPointerException,核心原因大概率和重定向的特性以及数据传递方式有关,下面是具体的排查和修复方案:
1. 先揪出最常见的坑:重定向会丢失Request域数据
重定向是客户端跳转,Servlet里存在HttpServletRequest域的对象,是不会被带到重定向后的JSP页面的。如果你的Servlet代码是这么写的,那百分百会出问题:
// 错误示例:重定向时用Request传数据 Persona persona = new Persona(); persona.setNombre(request.getParameter("nombre")); persona.setApellido(request.getParameter("apellido")); request.setAttribute("persona", persona); // 数据存在Request域 response.sendRedirect("Resultados.jsp"); // 重定向后Request域清空
这种情况下,JSP里尝试获取persona对象时,拿到的就是null,调用它的属性(比如nombre)自然就会抛出NullPointerException,被Jasper引擎包装成你看到的异常。
修复方案二选一:
- 改用请求转发(Forward):这是服务器端跳转,Request域数据会完整保留:
// 正确的转发写法 request.setAttribute("persona", persona); request.getRequestDispatcher("Resultados.jsp").forward(request, response);
- 必须用重定向的话,用Session存数据:把对象放到会话里,JSP取到后记得及时移除(避免会话冗余):
// 重定向时用Session传数据 request.getSession().setAttribute("persona", persona); response.sendRedirect("Resultados.jsp");
然后在Resultados.jsp里处理:
<% Persona persona = (Persona) session.getAttribute("persona"); if(persona != null) { // 展示姓名姓氏逻辑 session.removeAttribute("persona"); // 用完就删,避免会话污染 } %>
2. 排查JSP里的null引用问题
检查你的Resultados.jsp有没有直接引用可能为null的对象属性,比如没做判断就强转或调用方法:
错误示例:
<% // 没有判断persona是否为null就强转调用方法 Persona p = (Persona) request.getAttribute("persona"); out.println(p.getNombre()); %>
修复方式:加null判断,或者用EL的空安全语法(支持EL 2.2+):
<% Persona p = (Persona) request.getAttribute("persona"); if(p != null) { out.println(p.getNombre()); } else { out.println("暂无用户数据"); } %> <!-- 或者用EL的空处理 --> <p>姓名:${persona?.nombre ?: '未填写'}</p> <p>姓氏:${persona?.apellido ?: '未填写'}</p>
3. 检查Persona模型的JavaBean规范
确认你的Persona类属性的getter/setter方法是否符合规范:比如属性是private String nombre;,对应的getter必须是public String getNombre()(首字母大写),如果写成getnombre(),EL表达式会找不到方法,导致取值为null,后续操作也可能触发NPE。
4. 核对表单参数名是否一致
检查index.html的表单输入框name属性,和Servlet里request.getParameter()的参数名是否完全匹配:比如表单里是<input type="text" name="nombre">,Servlet里就不能写成request.getParameter("name"),否则参数值会是null,设置到Persona对象后,JSP展示时也可能引发异常。
内容的提问来源于stack exchange,提问作者G. Tary




