在 jsp 页面中给用户输入之前获取 SQLexception 错误

Get SQLexception error before giving the user input in jsp page

我想创建一个注册表单,用户可以在其中注册他或她的数据,给定的数据将保存在数据库中。我使用 mysql workbench 8.0 创建了一个数据库 HospitalM。我 运行 项目,jsp 文件用于在 Tomcat 服务器上创建表单。 pid 是数据库 HospitalM.

中名为 patient 的 table 中的主键

当我 运行 服务器上的表单生成时,表单没有等待输入数据并抛出消息 SQLException caught: Column 'pid' cannot be null

我将在下面分享我的代码和表格。谁能给我一些提示,为什么它不起作用?

JSP 代码:(jsp 文件的名称 insert.jsp)

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@ page import="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 <table>
<tr><td>Pid</td><td><input type="text" name="pid" required /></td></tr>
<tr><td>Name</td><td><input type="text" name="patientname" required /></td></tr>
<tr><td>Address</td><td><input type="text" name="patientaddress" ></td></tr>
<tr><td>Phone number</td><td><input type="number" name="Ph" required /></td></tr>
<tr><td>Email</td><td><input type="email" name="email" required /></td></tr>
<tr><td>Type</td><td><input type="text" name="patienttype" ></td></tr>
<tr><td></td><td><input type="submit" name="submit" value="register"></td></tr>

</table>

<%
  
  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);
    statement.setString(1, request.getParameter("pid"));
    statement.setString(2, request.getParameter("pname"));
    statement.setString(3, request.getParameter("address"));
    statement.setString(4, request.getParameter("phone"));
    statement.setString(5, request.getParameter("email_id"));
    statement.setString(6,request.getParameter("ptype"));
    int row = statement.executeUpdate();
    if (row > 0) {
        System.out.println("One row inserted.");
    }
  }
  catch(SQLException e) {
    out.println("SQLException caught: " +e.getMessage());
  }


%>
</body>
</html>

患者 table 的 sql 查询:

create table patient(pid varchar(10),
                    pname varchar(40) not null,
                    address varchar(10),
                    phone numeric(10,0) not null,
                    email_id varchar(20) not null,
                    ptype varchar(2),
                    primary key(pid),
                    check(email_id like '%_@__%.__%'));

我得到的输出

这里的问题是,当您第一次访问该页面时,所有的代码都会执行,但没有要处理的请求。

因此,在第一次访问期间,所有这些请求参数都为空。

根据 Piotr 的建议,您可以使用请求方法来获取它是 GET 还是 POST,并且只执行 POST 上的代码。

正确的答案更深入地探讨了如何构建这些类型的内容以及页面工作流程,但这是一个更深入的主题,需要进入此处。

现在,简单的问题是在第一次访问时没有参数,所以您实际上是在尝试:

statement.setString(1, null);

这是非法的(要在 JDBC 中将列设置为显式 SQL NULL 值,您使用 statement.setNull(1) 方法)。