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

JSP运行未等待用户输入就抛出SQLException:pid列不能为空问题求助

问题原因

  1. 页面加载就直接执行插入逻辑,未判断是否为表单提交请求
    你把表单渲染和数据插入的逻辑写在了同一个JSP文件中,用户第一次访问页面时还没有提交任何表单数据,request.getParameter()获取到的所有参数都是null,此时直接执行INSERT语句,自然会触发主键pid不能为null的报错。

  2. 缺少form表单标签
    你当前的表单代码没有嵌套在<form>标签中,既没有指定提交方法(POST/GET),也没有指定提交地址,就算用户填完数据点击注册按钮,也无法正常把参数提交到后台。

  3. 表单input的name属性和后台取值的参数名不匹配
    表单中各个输入框的name和你代码里request.getParameter()的参数名完全对不上,就算后续能正常提交,也获取不到用户填写的值:

  • 姓名:表单name为patientname,后台取参用了pname,不匹配
  • 地址:表单name为patientaddress,后台取参用了address,不匹配
  • 手机号:表单name为Ph,后台取参用了phone,不匹配
  • 邮箱:表单name为email,后台取参用了email_id,不匹配
  • 患者类型:表单name为patienttype,后台取参用了ptype,不匹配

修复方案

  1. 首先给表单加上<form>标签,指定提交方法为post,提交地址还是当前的insert.jsp即可:
<form action="insert.jsp" method="post">
<!-- 把你现有的table表单代码放在这里 -->
</form>
  1. 在执行插入逻辑前先判断是否是表单提交请求,比如判断提交按钮的参数是否存在,同时修正参数名不匹配的问题:
<%
// 只有点击了注册提交按钮才执行插入逻辑
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());
  }
}
%>
  1. 优化建议:后续业务逻辑尽量不要直接写在JSP中,最好单独抽成Servlet处理,避免视图层和业务逻辑耦合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:10