使用Java Servlet存储HTML日期值到MySQL时出现NullPointerException
你遇到的NullPointerException根源在于HTML表单的日期输入框没有name属性,导致Servlet无法通过request.getParameter("datedd")获取到值,date变量为null,调用SimpleDateFormat.parse(null)时就抛出了空指针异常。除此之外,还有几个需要修正的细节,我一步步给你说明:
1. 修复表单输入的name属性问题
HTML表单提交参数是通过name属性识别的,而不是id。你的日期输入框只有id="datedd",缺少name="datedd",所以提交时这个参数根本不会被发送到后端。修改HTML代码:
<input style="color: gray;" type="date" id="datedd" name="datedd" class="form-control">
另外注意:你Servlet里还获取了fueltype和liters参数,但当前HTML代码里没有对应的输入框,这两个参数也会是null,后续插入数据库可能报错,记得补充对应的带name属性的输入控件。
2. 修正日期解析的格式问题
HTML5的type="date"输入框提交的日期格式是ISO标准格式:yyyy-MM-dd,而你代码里用的是SimpleDateFormat("MM/dd/yyyy")来解析,就算拿到了日期值,也会抛出ParseException。
更简单且可靠的方式是直接使用java.sql.Date.valueOf(String)方法,它正好支持yyyy-MM-dd格式的字符串,不需要手动解析:
// 替换原来的日期解析代码 String date = request.getParameter("datedd"); if(date != null) { java.sql.Date sqlDate = java.sql.Date.valueOf(date); ps.setDate(3, sqlDate); }
3. 完善代码的资源管理
你的Servlet代码里没有关闭Connection、PreparedStatement等资源,这会导致数据库连接泄漏。建议用try-with-resources语法自动关闭资源:
try { Class.forName("com.mysql.jdbc.Driver"); // 使用try-with-resources自动关闭连接和语句 try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Vehicle", "root", ""); PreparedStatement ps = con.prepareStatement("INSERT INTO fuel(fueltype,liters,date) VALUES(?,?,?)")) { String fuelType = request.getParameter("fueltype"); String liters = request.getParameter("liters"); String date = request.getParameter("datedd"); ps.setString(1, fuelType); ps.setString(2, liters); if(date != null) { ps.setDate(3, java.sql.Date.valueOf(date)); } else { // 处理日期为空的情况,比如设置默认值或者返回错误提示 ps.setNull(3, java.sql.Types.DATE); } int i = ps.executeUpdate(); if (i > 0) { System.out.println("Success"); // 可以在这里给前端返回成功提示,比如重定向到成功页面 response.sendRedirect("success.jsp"); } else { System.out.println("not success"); response.sendRedirect("error.jsp"); } } } catch (ClassNotFoundException | SQLException ex) { Logger.getLogger(FillTanks.class.getName()).log(Level.SEVERE, null, ex); }
4. 额外建议
- 在前端给表单做基本校验,确保日期输入框不为空后再提交,比如修改
showAlert()函数,检查datedd的值是否存在。 - 检查数据库表
fuel的字段是否允许为空,如果date字段是必填的,那必须确保前端提交了有效值,后端也要做非空校验。
内容的提问来源于stack exchange,提问作者Jananath Banuka

