如何关联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
相关产品推荐
相关产品推荐

