You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联4个Java对象与JSP文件以正常运行Web项目?

问题:JSP无法获取Servlet中的对象数据,调用<%=js.getName()%>触发空指针异常

核心问题排查

  • Servlet未将实例化对象存入request域:Servlet中创建了Student、Program、Address、Family对象,但未通过request.setAttribute()将这些对象绑定到request属性中,导致JSP调用request.getAttribute("student")返回null,后续调用js.getName()时触发空指针异常。
  • Servlet提前写入响应内容:response.getWriter().append("Served at: ").append(request.getContextPath());会提前向响应流写入内容,而后续请求转发要求响应未被提交,这一写法可能引发IllegalStateException。

修正方案

1. 修改Servlet代码,将对象存入request属性

在实例化所有对象后、转发前,添加request.setAttribute()绑定对象:

package control;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

import objects.Address;
import objects.Family;
import objects.Program;
import objects.Student;

public class ControllerKo extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public ControllerKo() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 移除提前写入响应的代码,避免响应提交冲突
        // response.getWriter().append("Served at: ").append(request.getContextPath());
        
        request.setAttribute("pogi", "Institute of Technology");
        
        Student js = new Student();
        js.setName("Martin Parma");
        js.setAge("19 years old");
        js.setcivilStatus("Single");
        js.setGender("Male");
        js.setcontactNumber("09513300384");
        request.setAttribute("student", js);
        
        Program add = new Program();
        add.setdegree("Diploma in COmputer Engineering");
        add.setregIreg("Regular");
        add.setSem("2nd Sem");
        add.setyearLevel("2nd Year");
        request.setAttribute("program", add);
        
        Address in = new Address();
        in.setCity("Caloocan City");
        in.setBrgy("176");
        in.setBlkNumber("Block 28 Lot Excess");
        in.setRegion("NCR");
        in.setPostalCode("1428");
        request.setAttribute("address", in);
        
        Family me = new Family();
        me.setfatherName("Renee");
        me.setmotherName("Thelma");
        me.setSiblings("one");
        me.setfamilySize("4");
        request.setAttribute("family", me);
        
        RequestDispatcher rd=request.getRequestDispatcher("index.jsp");
        rd.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

2. 优化JSP代码,添加空值判断(可选)

为避免后续空指针异常,在调用对象方法前添加空值检查:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page import="objects.Student"%>     
 <%@ page import="objects.Address"%>  
 <%@ page import="objects.Program"%>  
 <%@ page import="objects.Family"%>      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <h1> Testing by DCPET 2-2</h1>
 <h2> Welcome to Web Systems </h2>
 <h3><%=request.getAttribute("pogi")%></h3>
 
 <%
 Student js = (Student)request.getAttribute("student");
 Address in = (Address)request.getAttribute("address");
 Program add = (Program)request.getAttribute("program");
 Family me = (Family)request.getAttribute("family");
 %>
 
 <table border="1">
 <tr>
  <td>First Name</td>
  <td>
  <% if(js != null) { %>
      <%=js.getName()%>
  <% } else { %>
      无数据
  <% } %>
  </td>
 </tr>
 </table>
</body>
</html>

3. 可选:修正JavaBean规范问题(提升代码规范性)

对象类的setter/getter方法建议遵循JavaBean规范,比如setcivilStatus改为setCivilStatus,getcivilStatus改为getCivilStatus,字段名也建议使用小驼峰命名(如Fname改为fname),这能避免后续使用EL表达式等场景出现问题。

内容的提问来源于stack exchange,提问作者MartinCannotCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:49:57