
Servlet 接收表单数据总拿不到 request.getParameter("content")?
不是代码写错了,大概率是表单提交方式和 Servlet 处理逻辑没对齐。HTML 表单默认是 GET,但留言内容含中文或较长文本时,必须用 POST;而 Servlet 里如果只写了 doGet(),POST 请求根本进不去,自然取不到参数。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- HTML 表单显式声明
<form method="post"></form> - Servlet 中重写
doPost(),别只写doGet() - 在
doPost()开头加一句request.setCharacterEncoding("UTF-8");,否则中文会乱码 - 检查浏览器开发者工具 Network 标签页,确认请求方法确实是
POST,且请求体(Request Payload)里有字段值
JDBC 插入留言时抛出 java.sql.SQLException: No suitable driver found
这是 JDBC 4.0+ 的经典“找不到驱动”错误,不是驱动没下载,而是没被加载。MySQL 8.0+ 的驱动类名从 com.mysql.jdbc.Driver 改成了 com.mysql.cj.jdbc.Driver,旧写法在新版本里直接失效。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Maven 依赖用最新稳定版,比如
mysql:mysql-connector-java:8.0.33 - 加载驱动别手动
Class.forName("com.mysql.jdbc.Driver")—— JDBC 4.0+ 自动服务发现,删掉这行 - 数据库 URL 必须带时区参数,例如
jdbc:mysql://localhost:3306/leaveboard?serverTimezone=Asia/Shanghai&useSSL=false,缺了serverTimezone也会报连接异常 - 确保
WEB-INF/lib/下真有 jar 包(如果是传统 WAR 部署),IDE 里没配对 Maven 依赖范围也容易漏
查出来的留言列表中文显示成问号或方块?
这不是 Java 或 JSP 的问题,是 MySQL 服务端、数据库、表、连接四层编码没统一。哪怕你 Java 里设了 UTF-8,只要其中一层是 latin1,存进去就是乱码,读出来也只能是乱码。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 登录 MySQL,执行
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_server和collation_server,如果不是utf8mb4,改配置文件my.cnf加default-character-set = utf8mb4 - 建库时明确指定:
CREATE DATABASE leaveboard CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 建表时也带上:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - JDBC URL 最后补上
&characterEncoding=utf8mb4,和前面的serverTimezone用&连接
每次刷新页面就重复插入同一条留言?
这是典型的表单重复提交问题。用户点一次“提交”,Servlet 插入成功,然后返回 JSP 显示列表——但这个响应是 HTTP GET 吗?不是,它是 POST 响应后的页面渲染。用户一按 F5,浏览器会重发上次的 POST 请求,留言就又插一遍。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Servlet 插入成功后,别直接
request.getRequestDispatcher("list.jsp").forward(...),改用重定向:response.sendRedirect("ListServlet"); -
ListServlet是个新的 GET 请求处理器,只负责查数据、跳转到 list.jsp,这样 F5 刷的是 GET,不会重复插入 - 前端也可以加按钮置灰 + JS 防重复点击,但服务端重定向才是根本解法










