#mysql #jsp #tomcat #jsp-tags #sqlexception
Вопрос:
Мне нравится создавать регистрационную форму, в которой пользователь может зарегистрировать свои данные, и данные будут сохранены в базе данных. Я создал базу данных Hospital, используя mysql workbench 8.0. Я запустил проект, файл jsp для создания формы на сервере Tomcat. Pid-это первичный ключ в таблице под названием пациент в базе данных HospitalM.
Когда я запускаю форму на сервере, создается форма, но форма не ожидает ввода данных и выдает сообщение SQLException caught: Column 'pid' cannot be null
.
Я поделюсь своим кодом и формой ниже. Может ли кто-нибудь дать мне несколько советов, почему это не сработало?
Код JSP: (имя файла jsp insert.jsp)
lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%gt; lt;%@ page import="java.sql.*"%gt; lt;!DOCTYPE htmlgt; lt;htmlgt; lt;headgt; lt;meta charset="ISO-8859-1"gt; lt;titlegt;Insert title herelt;/titlegt; lt;/headgt; lt;bodygt; lt;tablegt; lt;trgt;lt;tdgt;Pidlt;/tdgt;lt;tdgt;lt;input type="text" name="pid" required /gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Namelt;/tdgt;lt;tdgt;lt;input type="text" name="patientname" required /gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Addresslt;/tdgt;lt;tdgt;lt;input type="text" name="patientaddress" gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Phone numberlt;/tdgt;lt;tdgt;lt;input type="number" name="Ph" required /gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Emaillt;/tdgt;lt;tdgt;lt;input type="email" name="email" required /gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Typelt;/tdgt;lt;tdgt;lt;input type="text" name="patienttype" gt;lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;lt;/tdgt;lt;tdgt;lt;input type="submit" name="submit" value="register"gt;lt;/tdgt;lt;/trgt; lt;/tablegt; lt;% 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 gt; 0) { System.out.println("One row inserted."); } } catch(SQLException e) { out.println("SQLException caught: " e.getMessage()); } %gt; lt;/bodygt; lt;/htmlgt;
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 '%_@__%.__%'));
Результат, который я получил
Комментарии:
1. Отправка данных-это двухэтапный процесс: сначала вы отображаете HTML-форму, а затем вставляете данные в базу данных. Вы можете различить две фазы с помощью метода HTTP (
request.getMethod()
):GET
для фазы 1,POST
для фазы 2.
Ответ №1:
Проблема здесь в том, что при первом доступе к странице весь этот код выполняется, но запроса на обработку не было.
Таким образом, во время первого доступа все эти параметры запроса равны нулю.
Как предложил Петр, вы могли бы использовать метод запроса , чтобы узнать, является ли это a GET
или a POST
, и выполнить код только на POST
.
Правильный ответ на этот вопрос гораздо глубже касается того, как такие вещи проектируются вместе с рабочим процессом страницы, но это гораздо более глубокая тема, к которой мы здесь перейдем.
На данный момент простая проблема заключается в том, что при первом доступе нет параметров, поэтому вы, по сути, пытаетесь сделать:
statement.setString(1, null);
Что является незаконным (чтобы задать столбцу явное значение SQL NULL в JDBC, вы используете statement.setNull(1)
метод).