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

JSP从HTML表单获取值存入MySQL数据库报错如何解决

问题原因

你遇到的报错是因为两个核心问题没有处理:

  • 没有为表单添加<form>标签,提交按钮点击后不会把用户填写的表单数据传递给后端
  • JSP中不能直接使用HTML表单的name属性值作为变量,你需要手动调用request.getParameter()方法获取表单提交的参数

解决步骤

  1. 给表格外增加<form>标签,指定提交方式为post,提交地址为当前页面即可
  2. 在执行数据库插入逻辑前,先获取表单提交的参数
  3. 增加判断逻辑,只有用户点击提交按钮后才执行数据库插入操作,避免页面刚加载就执行插入逻辑报错

修正后的完整代码

<%@ 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:03