JSP从HTML表单获取值存入MySQL数据库报错如何解决
问题原因
你遇到的报错是因为两个核心问题没有处理:
- 没有为表单添加
<form>标签,提交按钮点击后不会把用户填写的表单数据传递给后端 - JSP中不能直接使用HTML表单的
name属性值作为变量,你需要手动调用request.getParameter()方法获取表单提交的参数
解决步骤
- 给表格外增加
<form>标签,指定提交方式为post,提交地址为当前页面即可 - 在执行数据库插入逻辑前,先获取表单提交的参数
- 增加判断逻辑,只有用户点击提交按钮后才执行数据库插入操作,避免页面刚加载就执行插入逻辑报错
修正后的完整代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>患者信息录入</title> </head> <body> <!-- 新增form标签 --> <form method="post" action=""> <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> </form> <% // 判断用户是否点击了提交按钮,只有提交后才执行插入逻辑 if(request.getParameter("submit") != null){ // 先获取表单提交的所有参数 String pid = request.getParameter("pid"); String patientname = request.getParameter("patientname"); String patientaddress = request.getParameter("patientaddress"); String phone = request.getParameter("Ph"); String email = request.getParameter("email"); String patienttype = request.getParameter("patienttype"); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospitalm?useUnicode=true&characterEncoding=utf8","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, pid); statement.setString(2, patientname); statement.setString(3, patientaddress); // 把手机号转成数字类型,避免类型报错 statement.setDouble(4, Double.parseDouble(phone)); statement.setString(5, email); statement.setString(6,patienttype); int row = statement.executeUpdate(); if (row > 0) { out.println("一条患者信息已成功插入。"); } // 用完关闭资源,避免连接泄漏 statement.close(); con.close(); } catch(Exception e) { out.println("操作出错: " +e.getMessage()); } } %> </body> </html>
额外优化提示
- 把原来的ISO-8859-1编码改成UTF-8,避免存入中文出现乱码,数据库连接地址也加上了编码参数
- 现在所有字段都会取用户填写的表单内容,不再写死固定值
- 增加了数据库资源关闭逻辑,避免长时间运行出现连接耗尽的问题
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

