当前位置: 首页 > article >正文

从表单提交到数据入库:Servlet+JDBC构建经典Web交互闭环

1. 用户注册功能的全链路实现第一次接触Java Web开发时最让我困惑的就是前端页面、后端Servlet和数据库之间到底是怎么打配合的。后来做了几个实战项目才发现原来从表单提交到数据入库的完整流程就像快递配送一样环环相扣。下面我就用用户注册这个经典场景带你走通整个数据流转的闭环。想象你在电商网站注册账号填写表单相当于打包快递点击提交就是下单发货Servlet像物流中转站处理包裹JDBC则是最终把快递存进仓库。整个过程涉及三个关键环节前端HTML表单负责收集用户输入中间Servlet处理业务逻辑底层JDBC完成数据持久化这里有个容易踩坑的地方很多新手只关注单个环节忽略了各环节之间的衔接。比如表单的name属性要和Servlet的getParameter()对应Servlet的注解路径要和form的action一致。我在第一次实现时就因为路径写错折腾了半天404错误。2. 前端表单构建实战2.1 基础表单设计先来看最基础的注册表单HTML代码。关键点我都加了注释你可以直接复制到IDE里运行!DOCTYPE html html head meta charsetUTF-8 title用户注册/title /head body form action/register methodpost !-- 文本输入框 -- div label forusername用户名/label input typetext idusername nameusername required /div !-- 密码框 -- div label forpassword密码/label input typepassword idpassword namepassword required /div !-- 单选按钮组 -- div label性别/label input typeradio namegender valuemale checked 男 input typeradio namegender valuefemale 女 /div !-- 提交按钮 -- input typesubmit value立即注册 /form /body /html几个必须注意的细节action属性要指向后端Servlet的URL路径比如我这里写/register后面创建Servlet时要用WebServlet(/register)匹配method用post更安全特别是传输密码时每个输入字段都要有name属性这是后端获取数据的钥匙给密码框用typepassword会自动隐藏输入内容2.2 表单验证增强原始HTML5自带基础验证比如required属性会阻止空提交。但实际项目我们通常需要更复杂的验证规则。这是我常用的前端验证方案// 在form标签增加onsubmit事件 form onsubmitreturn validateForm() script function validateForm() { const password document.getElementById(password).value; // 密码强度校验 if(password.length 6) { alert(密码至少6位); return false; } // 更多业务规则校验... return true; // 通过校验才会提交表单 } /script注意这里的前端验证只是第一道防线后端必须做二次校验。我就遇到过有人直接发POST请求绕过前端验证所以Servlet里一定要再检查参数合法性。3. Servlet请求处理详解3.1 Servlet基础结构处理注册请求的Servlet核心结构如下。建议用IDEA生成Servlet模板避免手写基础代码WebServlet(/register) public class RegisterServlet extends HttpServlet { // 处理POST请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取表单参数 String username request.getParameter(username); String password request.getParameter(password); String gender request.getParameter(gender); // 2. 业务处理示例打印到控制台 System.out.println(注册用户 username); // 3. 返回响应 response.setContentType(text/html;charsetUTF-8); PrintWriter out response.getWriter(); out.print(h1注册成功/h1); } }开发时容易遇到的三个坑忘记加WebServlet注解导致404没有重写doPost方法如果用post提交响应中文乱码必须设置charsetUTF-83.2 参数接收的注意事项接收表单参数时有几个易错点需要特别注意// 错误示例直接使用参数不做校验 String username request.getParameter(username); // 正确做法判空处理 String username request.getParameter(username); if(username null || username.trim().isEmpty()) { response.sendError(400, 用户名不能为空); return; } // 多值参数处理如复选框 String[] hobbies request.getParameterValues(hobby);我建议封装一个参数校验工具类避免在每个Servlet重复写校验逻辑。比如public class ParamUtil { public static String getRequiredParam(HttpServletRequest request, String paramName) throws ServletException { String value request.getParameter(paramName); if(value null || value.trim().isEmpty()) { throw new ServletException(参数 paramName 不能为空); } return value.trim(); } }4. JDBC数据库集成4.1 数据库准备首先创建用户表建议使用MySQL Workbench可视化操作CREATE TABLE users ( id int NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(100) NOT NULL, gender varchar(10) DEFAULT NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY username_UNIQUE (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;注意几个设计要点密码字段要预留足够长度考虑加密后长度用户名添加唯一约束使用utf8mb4字符集支持emoji添加创建时间字段4.2 JDBC工具类封装直接在每个Servlet写JDBC代码会很臃肿建议封装工具类public class JdbcUtil { private static final String URL jdbc:mysql://localhost:3306/demo?useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456; // 获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } // 关闭资源 public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if(rs ! null) rs.close(); if(stmt ! null) stmt.close(); if(conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }4.3 完整数据入库实现结合工具类的Servlet实现protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn null; PreparedStatement stmt null; try { // 获取参数 String username ParamUtil.getRequiredParam(request, username); String password ParamUtil.getRequiredParam(request, password); String gender request.getParameter(gender); // 获取数据库连接 conn JdbcUtil.getConnection(); // 使用预处理语句防止SQL注入 String sql INSERT INTO users(username, password, gender) VALUES(?,?,?); stmt conn.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); // 实际项目要加密 stmt.setString(3, gender); // 执行插入 int count stmt.executeUpdate(); // 返回响应 response.setContentType(application/json;charsetUTF-8); PrintWriter out response.getWriter(); out.print({\success\: (count 0) }); } catch (Exception e) { response.setStatus(500); response.getWriter().print({\error\:\ e.getMessage() \}); } finally { JdbcUtil.close(conn, stmt, null); } }5. 常见问题排查指南5.1 中文乱码问题乱码是新手常遇到的问题需要多端统一编码HTML加meta charsetUTF-8Servlet设置request.setCharacterEncoding(UTF-8)和response.setContentType(text/html;charsetUTF-8)数据库连接字符串加参数useUnicodetruecharacterEncodingUTF-85.2 连接池配置直接使用DriverManager在生产环境会有性能问题推荐使用连接池// 使用HikariCP连接池 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/demo); config.setUsername(root); config.setPassword(123456); config.setMaximumPoolSize(10); HikariDataSource dataSource new HikariDataSource(config);5.3 事务处理涉及多个SQL操作时要添加事务try { conn.setAutoCommit(false); // 开启事务 // 执行多个SQL... conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚 throw e; } finally { conn.setAutoCommit(true); }6. 安全加固方案6.1 密码加密存储绝对不要明文存储密码推荐使用BCryptimport org.mindrot.jbcrypt.BCrypt; // 加密 String hashed BCrypt.hashpw(password, BCrypt.gensalt()); // 验证 if(BCrypt.checkpw(inputPassword, storedHash)) { // 密码正确 }6.2 防SQL注入除了使用PreparedStatement还可以使用MyBatis等ORM框架对输入参数做白名单校验避免拼接SQL语句6.3 XSS防护对用户输入做HTML转义import org.apache.commons.text.StringEscapeUtils; String safeOutput StringEscapeUtils.escapeHtml4(userInput);7. 项目结构优化建议随着项目复杂度的增加建议采用分层架构src/ ├── main/ │ ├── java/ │ │ ├── com.example.dao/ # 数据访问层 │ │ ├── com.example.service/ # 业务逻辑层 │ │ ├── com.example.web/ # Servlet控制器 │ │ └── com.example.util/ # 工具类 │ └── webapp/ # 前端资源 └── test/ # 测试代码这种架构下Servlet只负责接收请求参数调用Service处理业务返回响应所有数据库操作放在DAO层业务规则放在Service层。这样代码更易维护和测试。

相关文章:

从表单提交到数据入库:Servlet+JDBC构建经典Web交互闭环

1. 用户注册功能的全链路实现 第一次接触Java Web开发时,最让我困惑的就是前端页面、后端Servlet和数据库之间到底是怎么打配合的。后来做了几个实战项目才发现,原来从表单提交到数据入库的完整流程,就像快递配送一样环环相扣。下面我就用用户…...

ComfyUI-Manager终极指南:5个技巧让你的AI创作效率翻倍

ComfyUI-Manager终极指南:5个技巧让你的AI创作效率翻倍 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...

5G NR里,UE是怎么‘举手’要资源的?聊聊Scheduling Request那点事

5G NR中的"举手"机制:深入解析Scheduling Request工作原理 想象一下大学课堂的场景:当学生有问题要提问时,通常会举手示意教授。在5G网络中,用户设备(UE)也有类似的"举手"机制——这就…...

从零到一:掌握Matlab lsim函数在控制系统仿真中的实战应用

1. 初识lsim函数:控制系统仿真的瑞士军刀 第一次接触Matlab的lsim函数时,我正为一个工业温度控制系统发愁。客户要求验证PID控制器在突发温度扰动下的响应速度,而实验室设备还没到位。同事扔给我一行代码:"试试lsim&#xff…...

C#怎么实现聊天室功能 C#如何用SignalR或Socket开发多人在线聊天室程序【项目】

<p>SignalR 是 C# 聊天室最稳选择&#xff0c;自动处理连接管理、降级兼容、消息分发&#xff1b;避免 async void、空参解构、静态状态存储&#xff0c;正确配置路由与代理&#xff0c;生产环境必用 Redis 背板。</p>SignalR 是当前 C# 聊天室最稳的选择不用纠结 …...

Redis最常见的使用场景都汇总在这了!

Redis想必大家都听说过&#xff0c;不管是面试还是工作上我们都能见到。但是Redis到底能干什么&#xff1f;又不能干什么呢&#xff1f;&#xff08;如下图&#xff09;为什么要用Redis&#xff1f;上面说了Redis的一些使用场景&#xff0c;那么这些场景的解决方案也有很多其它…...

别再傻傻分不清!VB6/VBA中Null、Empty、Nothing、Missing、vbNullString的实战避坑指南

VB6/VBA中Null、Empty、Nothing、Missing、vbNullString的实战避坑指南 在VB6/VBA开发中&#xff0c;处理各种"空值"概念就像在雷区行走——稍有不慎就会引发难以调试的异常。我曾见过一个数据库项目因为混淆Null和Empty导致财务报表计算错误&#xff0c;也调试过因误…...

终极显卡驱动清理指南:如何彻底卸载NVIDIA/AMD/Intel显卡驱动

终极显卡驱动清理指南&#xff1a;如何彻底卸载NVIDIA/AMD/Intel显卡驱动 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-unins…...

二手硬盘验机神器HDDScan:5分钟教你识别翻新盘与矿盘(2024实测版)

2024二手硬盘避坑指南&#xff1a;用HDDScan揪出翻新盘与矿盘的核心技巧 在闲鱼或淘宝淘二手硬盘时&#xff0c;最让人头疼的就是遇到翻新盘或矿盘。这些硬盘往往被商家重新包装&#xff0c;外观崭新如初&#xff0c;但内部可能已经饱经风霜。作为一名经历过多次踩坑的硬件爱好…...

电子/计算机专业学生必看:除了蓝桥杯,这5个高含金量技术竞赛也能为简历加分

电子/计算机专业学生必看&#xff1a;除了蓝桥杯&#xff0c;这5个高含金量技术竞赛也能为简历加分 刚入学的计算机系新生小李&#xff0c;最近在实验室听到学长学姐讨论"互联网"和"挑战杯"的参赛经验。他翻开手机备忘录&#xff0c;里面已经记下了七八个竞…...

索尼相机终极解锁指南:5大隐藏功能一键开启

索尼相机终极解锁指南&#xff1a;5大隐藏功能一键开启 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak OpenMemories-Tweak 是一款专为索尼相机用户设计的强大功能解锁工具&a…...

别再只跑Demo了!用Streamlit给你的YOLO安全帽检测模型做个炫酷的Web界面(支持图片/视频/摄像头)

从命令行到Web界面&#xff1a;用Streamlit为YOLO安全帽检测模型打造专业级交互应用 在计算机视觉领域&#xff0c;YOLO系列算法因其卓越的实时性能已成为目标检测任务的首选方案。然而&#xff0c;许多开发者在完成模型训练后&#xff0c;往往止步于命令行或Jupyter Notebook中…...

Simulink存储类配置实战:从Auto到GetSet的代码生成解析

1. Simulink存储类配置基础概念 第一次接触Simulink代码生成时&#xff0c;我被Storage Class这个概念困扰了很久。简单来说&#xff0c;Storage Class决定了模型中的信号和参数在生成的C代码中如何存储和访问。就像给变量分配不同的"身份证"&#xff0c;告诉编译器这…...

CAN总线BusOff故障排查指南:从硬件到软件的完整解决方案

CAN总线BusOff故障排查实战&#xff1a;从信号分析到恢复策略的工程指南 当你的车载显示屏突然黑屏&#xff0c;而仪表盘上的故障灯开始疯狂闪烁时&#xff0c;背后很可能隐藏着一个CAN总线BusOff故障。这种故障不仅会让工程师们加班到凌晨三点&#xff0c;更可能让整车厂面临巨…...

【智慧能源合集】200余份智慧能源、数字能源、新能源、双碳、碳中和、碳排放、零碳方案合集(PPT+WORD)

以“双碳”目标为牵引&#xff0c;依托数字能源技术构建智慧能源体系&#xff0c;推动新能源替代与碳排放精准管控&#xff0c;最终形成可落地的零碳解决方案&#xff0c;助力实现碳中和。1. 核心概念界定在深入探讨方案之前&#xff0c;需明确相关术语的内涵与外延。新能源&am…...

一站式资源共享平台模板,助力快速搭建专属资源站源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 这个资源分享网站模板是一个功能完整、设计现代的单页网站&#xff0c;非常适合快速搭建资源分享平台。以下是关于这个模板的详细介绍&#xff0c;帮助你更好地理解并发布到自己的网站&#xff1a; 模板…...

【仅限首批参会者获取的AI翻译API白皮书】:含17个企业落地失败案例+5套可直接部署的微调模板

第一章&#xff1a;AI翻译API白皮书发布与核心价值阐释 2026奇点智能技术大会(https://ml-summit.org) 《AI翻译API白皮书》由全球十余家头部语言模型厂商与ISO/IEC JTC 1/SC 42联合编制&#xff0c;于2025年3月正式发布。该白皮书首次定义了面向企业级场景的AI翻译服务能力评…...

音频在线剪切助手网页版源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 音频在线剪切助手网页版源码 所有音频处理均在本地完成 上传音频 点击"选择音频文件"按钮或直接拖放音频文件到上传区域。支持MP3、WAV、OGG和WebM格式。 智能裁剪功能 快速创建标准时长片…...

AI写作助手落地真相(SITS2026内部脱敏报告):5类组织断层、3类数据陷阱、1套可复用的GAP评估矩阵

第一章&#xff1a;SITS2026案例&#xff1a;AI写作助手落地 2026奇点智能技术大会(https://ml-summit.org) SITS2026&#xff08;Smart Intelligence Technology Summit 2026&#xff09;首次将AI写作助手深度集成至会议全流程系统&#xff0c;覆盖议程生成、讲者摘要撰写、…...

游戏攻略新闻资讯主题模板源码 YK一点资讯模版 Zblog主题模版

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 游戏攻略新闻资讯主题模板源码 YK一点资讯模版 zblog主题模版 YK一点资讯(三栏昼夜自定义布局) 建议直接进入演示站观看效果。非常适合做游戏攻略、新闻资讯、CMS内容管理系统或者图片站等等 自定义布…...

2025网盘下载新境界:LinkSwift八大网盘直链助手完整使用指南

2025网盘下载新境界&#xff1a;LinkSwift八大网盘直链助手完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 …...

收藏!2026春招AI抢人大战白热化,大模型学习指南(小白/程序员必看)

2026春招已经进入白热化阶段&#xff0c;AI行业正迎来史上最激烈的“抢人大战”&#xff0c;成为求职市场的绝对焦点。据最新行业数据显示&#xff0c;AI相关岗位同比暴涨12倍&#xff0c;平均月薪突破6万&#xff0c;从大模型微调、RAG开发到AI智能体落地&#xff0c;全新赛道…...

基于Simulink的图腾柱无桥PFC的CRM模式控制

目录 手把手教你学Simulink——基于Simulink的图腾柱无桥PFC的CRM模式控制​ 摘要​ 一、背景与挑战​ 1.1 为什么图腾柱PFC独得恩宠,却又让人又爱又恨?​ 1.2 CRM模式:化骨绵掌,四两拨千斤​ 1.3 破局痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 拓扑拆解:…...

三电阻采样进阶技巧:如何通过PWM动态移相突破FOC控制电压限制

三电阻采样进阶技巧&#xff1a;PWM动态移相突破FOC电压限制的工程实践 在无人机电机和电动汽车驱动系统中&#xff0c;工程师们常常面临一个棘手的矛盾&#xff1a;既要保证电流采样精度&#xff0c;又要最大化电源利用率。传统限幅方案就像给赛车手绑上沙袋——安全却限制了性…...

如何让Jellyfin精准识别中文影视?MetaShark插件的技术解析与实践指南

如何让Jellyfin精准识别中文影视&#xff1f;MetaShark插件的技术解析与实践指南 【免费下载链接】jellyfin-plugin-metashark jellyfin电影元数据插件 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metashark 对于使用Jellyfin搭建个人媒体库的中文用…...

RyzenAdj:深入解析AMD处理器功耗管理调优机制

RyzenAdj&#xff1a;深入解析AMD处理器功耗管理调优机制 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj RyzenAdj是一款专为AMD锐龙移动处理器设计的开源功耗管理调节工具&#xf…...

深入解析RK3588 ADC按键驱动实现与设备树配置

1. RK3588 ADC按键驱动概述 在嵌入式Linux开发中&#xff0c;ADC按键是一种常见的输入方式。RK3588作为瑞芯微旗舰级处理器&#xff0c;其内置的SARADC模块可以方便地实现按键检测功能。相比传统的GPIO按键&#xff0c;ADC按键有以下优势&#xff1a; 节省GPIO资源&#xff1a;…...

【医药AI实战系列⑤】分布漂移、稀疏标签、冷启动——工业级DDI系统的三重死亡陷阱(附:如何设计让药剂师真正信任的可解释性输出)

先说结论,再说过程 我们的DDI(Drug-Drug Interaction,药物相互作用)预测系统,在内部测试集上AUC 0.91,上线三个月后真实场景的AUC只有0.79。 差了0.12。 这不是小差距。AUC从0.91掉到0.79,意味着模型对真实临床场景的判断能力,比我们以为的差了将近一个数量级。有几…...

影响APP增长的13个ASO核心要素(2026最新版)

ASO是APP自然增长的生命线&#xff0c;但其复杂的规则与多变的算法常让运营者束手无策。2026年&#xff0c;应用商店对“质量度”与“用户匹配度”的考核愈发严格&#xff0c;粗放型的优化手段难以奏效。基于最新市场动态与业务实战&#xff0c;我们将ASO拆解为产品契合、关键词…...

Nuke Survival Toolkit:从生存到精通的150个专业特效插件解决方案

Nuke Survival Toolkit&#xff1a;从生存到精通的150个专业特效插件解决方案 【免费下载链接】NukeSurvivalToolkit_publicRelease public version of the nuke survival toolkit 项目地址: https://gitcode.com/gh_mirrors/nu/NukeSurvivalToolkit_publicRelease 你是…...