JSP运行未等待用户输入就抛出SQLException:pid列不能为空问题求助
问题原因
页面加载就直接执行插入逻辑,未判断是否为表单提交请求
你把表单渲染和数据插入的逻辑写在了同一个JSP文件中,用户第一次访问页面时还没有提交任何表单数据,request.getParameter()获取到的所有参数都是null,此时直接执行INSERT语句,自然会触发主键pid不能为null的报错。缺少form表单标签
你当前的表单代码没有嵌套在<form>标签中,既没有指定提交方法(POST/GET),也没有指定提交地址,就算用户填完数据点击注册按钮,也无法正常把参数提交到后台。表单input的name属性和后台取值的参数名不匹配
表单中各个输入框的name和你代码里request.getParameter()的参数名完全对不上,就算后续能正常提交,也获取不到用户填写的值:
- 姓名:表单name为
patientname,后台取参用了pname,不匹配 - 地址:表单name为
patientaddress,后台取参用了address,不匹配 - 手机号:表单name为
Ph,后台取参用了phone,不匹配 - 邮箱:表单name为
email,后台取参用了email_id,不匹配 - 患者类型:表单name为
patienttype,后台取参用了ptype,不匹配
修复方案
- 首先给表单加上
<form>标签,指定提交方法为post,提交地址还是当前的insert.jsp即可:
<form action="insert.jsp" method="post"> <!-- 把你现有的table表单代码放在这里 --> </form>
- 在执行插入逻辑前先判断是否是表单提交请求,比如判断提交按钮的参数是否存在,同时修正参数名不匹配的问题:
<% // 只有点击了注册提交按钮才执行插入逻辑 if(request.getParameter("submit") != null){ try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospitalm","root","1234"); out.println ("database successfully opened."); String sql = "INSERT INTO patient (pid, pname, address, phone, email_id,ptype) values (?, ?, ?,?,?,?)"; PreparedStatement statement = con.prepareStatement(sql); // 和表单input的name属性对应取值 statement.setString(1, request.getParameter("pid")); statement.setString(2, request.getParameter("patientname")); statement.setString(3, request.getParameter("patientaddress")); statement.setString(4, request.getParameter("Ph")); statement.setString(5, request.getParameter("email")); statement.setString(6,request.getParameter("patienttype")); int row = statement.executeUpdate(); if (row > 0) { out.println("一条数据插入成功"); } con.close(); // 操作完成后关闭数据库连接,避免资源泄漏 } catch(SQLException e) { out.println("SQLException caught: " +e.getMessage()); } catch (ClassNotFoundException e) { out.println("驱动加载失败:"+e.getMessage()); } } %>
- 优化建议:后续业务逻辑尽量不要直接写在JSP中,最好单独抽成Servlet处理,避免视图层和业务逻辑耦合。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

