Integer.parseInt无法解析Servlet URL参数中的"id"字符串问题排查
解决更新员工时的NullPointerException问题
我来帮你排查这个空指针问题,核心原因是你的更新流程里ID参数没有正确传递到doPost方法,还有几处细节错误,具体问题和修复步骤如下:
问题分析
- ID参数未在请求间传递:
你的doGet方法获取到员工对象后,没有把它存入request域,导致updateemployee.jsp无法拿到原员工的ID和数据;同时表单也没有携带ID参数,doPost方法自然拿不到ID。 - 错误的参数获取方式:
doPost里用request.getAttribute("id")获取ID是错误的——getAttribute是获取存在request域中的属性,而表单提交的参数需要用request.getParameter()获取,这里拿到的是null,强转int就抛出了NullPointerException。 - 注册日期参数缺失:
表单里没有提交registration_date,但构造Employee时却尝试获取这个参数,这也会导致空指针或格式转换错误。 - DeleteServlet的隐藏错误:
顺便提一句,你的DeleteEmployeeServlet里用request.getAttribute("id")获取ID也是错的,URL参数应该用request.getParameter(),只是暂时没触发问题,建议一起修复。
修复步骤
1. 修改UpdateEmployeeServlet的doGet方法,存入员工对象
在doGet中获取员工后,把它放到request属性里,让JSP能拿到原数据:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int id = Integer.parseInt(request.getParameter("id")); Employee employee = EmployeeDAO.getEmployeeById(id); // 将员工对象存入request域,供JSP使用 request.setAttribute("employee", employee); request.getRequestDispatcher("updateemployee.jsp").forward(request, response); }
2. 完善updateemployee.jsp表单,添加隐藏字段并回显数据
表单添加隐藏的ID字段传递ID,同时回显原姓名和姓氏,保留注册日期(如果需要):
<form action="UpdateEmployeeServlet" method="post"> <!-- 隐藏字段传递员工ID --> <input type="hidden" name="id" value="<%= ((Employee)request.getAttribute("employee")).getId() %>"> <!-- 回显原姓名 --> Name <input type="text" name="name" value="<%= ((Employee)request.getAttribute("employee")).getName() %>"><br> <!-- 回显原姓氏 --> Surname <input type="text" name="surname" value="<%= ((Employee)request.getAttribute("employee")).getSurname() %>"/><br> <!-- 隐藏字段保留原注册日期 --> <input type="hidden" name="registration_date" value="<%= ((Employee)request.getAttribute("employee")).getRegistrationDate() %>"> <input type="submit" value="Save"> </form>
3. 修改UpdateEmployeeServlet的doPost方法,正确处理参数
现在可以通过request.getParameter()获取ID,同时添加异常处理避免崩溃,更新完成后用重定向代替forward(防止表单重复提交):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 从表单参数获取ID并转换 int id = Integer.parseInt(request.getParameter("id")); String name = request.getParameter("name"); String surname = request.getParameter("surname"); // 获取原注册日期 Date registrationDate = Date.valueOf(request.getParameter("registration_date")); Employee employee = new Employee(id, name, surname, registrationDate); EmployeeDAO.updateEmployee(employee); // 重定向到列表页,避免重复提交 response.sendRedirect("EmployeeServlet"); } catch (NumberFormatException e) { // 处理ID格式错误 e.printStackTrace(); response.sendRedirect("EmployeeServlet?error=invalid_id"); } catch (IllegalArgumentException e) { // 处理日期格式错误 e.printStackTrace(); response.sendRedirect("EmployeeServlet?error=invalid_date"); } }
4. 修复DeleteEmployeeServlet的doGet方法
把错误的getAttribute改成getParameter:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int id = Integer.parseInt(request.getParameter("id")); EmployeeDAO.deleteEmployee(id); response.sendRedirect("EmployeeServlet"); }
内容的提问来源于stack exchange,提问作者jimmyrap
相关产品推荐
相关产品推荐

