You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Servlet-JSP MVC架构Web应用空指针异常问题求助

解决重定向JSP时的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

火山引擎 最新活动