嘟嘟校园一卡通系统:基于JavaWeb+MySQL的JSP+Servlet完整实战复盘
先说结论:这年头还在用JSP+Servlet做项目,很多人第一反应是"过时了"。但我把这套"嘟嘟校园一卡通系统"完整做完之后,反而觉得它比想象中更能打。
如果你是要交课程设计、毕业设计,或者想彻底弄懂JavaWeb最底层的那套请求-响应-数据库交互机制,这个项目就是一个非常合适的练手样本。它不是那种花里胡哨的微服务项目,没有Spring Boot帮你把一切都封装好,所有东西都摆在明面上:JSP怎么写页面,Servlet怎么接请求,JDBC怎么连MySQL,Ajax怎么局部刷新。把这一套跑通,你就真正理解了Java Web的地基。
这套系统我定位为"校园一卡通管理平台",核心功能覆盖了卡片管理、学生信息管理、充值消费记录、异常挂失、统计报表这些日常运维场景。前端用JSP+CSS+JavaScript+jQuery+Ajax,后端用Java+Servlet,数据库用MySQL,典型的三层结构,没有引入任何重量级框架。
本文会从整体架构设计、数据库建模、Servlet核心逻辑、JSP页面交互到实际部署踩坑,完整走一遍。你在其他博客里看到的可能是零散的代码片段,我这里直接给你一套能跑、能交、能扩展的完整思路。
1. 项目定位与整体架构:为什么选JSP+Servlet这套组合
在开始写代码之前,先把技术选型的逻辑讲清楚。
1.1 这套技术栈解决了什么问题
很多人在做校园一卡通这类管理系统时,会陷入一个选择困难:用Spring Boot几分钟就能搭起来,为什么要选JSP+Servlet这种"老古董"?
我的理由有三个:
第一,学习价值完全不同。 Spring Boot帮你把Tomcat内嵌、DispatcherServlet配置、组件扫描全部藏起来了,你写一个@RestController就好像会了Web开发,但实际上请求是怎么进到Java代码的、Session是怎么管理的、页面是怎么渲染出来的,你完全没有概念。而JSP+Servlet这套组合,每一个环节都是裸的,你在浏览器里点一下按钮,请求经过web.xml的映射、进入Servlet的doGet/doPost、调用DAO层、返回JSP页面,整个过程清清楚楚。
第二,课程设计和毕业设计的硬性要求。 很多学校的大作业明确指定要用JSP+Servlet+MySQL,不允许用Spring Boot。这套系统完美匹配这种需求。
第三,部署成本低。 一个WAR包扔进Tomcat的webapps目录就能跑,不依赖Maven仓库里那堆复杂依赖,在配置一般的电脑上也能流畅开发调试。
1.2 系统的三层架构拆解
这套嘟嘟校园一卡通系统采用经典的MVC三层架构:
- View层(视图层):JSP页面 + CSS + JavaScript + jQuery + Ajax。负责页面展示和用户交互。
- Controller层(控制层):Servlet。负责接收请求、调用业务逻辑、控制页面跳转。
- Model层(模型层):JavaBean + DAO + MySQL数据库。负责业务数据封装和持久化操作。
具体到代码结构上,我习惯把包结构按"分层 + 功能模块"双维度组织:
code复制com.duducard
├── entity // 实体类:User, Student, Card, RechargeRecord, ConsumeRecord等
├── dao // 数据访问层:接口 + 实现类
├── service // 业务逻辑层:处理充值、消费、挂失等业务规则
├── servlet // 控制层:LoginServlet, CardServlet, StudentServlet等
├── filter // 过滤器:登录验证、编码处理
└── util // 工具类:DBUtil数据库连接、DateUtil时间处理
WebContent目录下对应:
code复制WebContent
├── index.jsp // 登录页
├── admin/ // 管理员模块页面
├── student/ // 学生端功能页面
├── css/ // 样式文件
├── js/ // jQuery、Ajax脚本
├── images/ // 静态资源
└── WEB-INF/
├── web.xml // Servlet映射、欢迎页面配置
└── lib/ // 项目依赖JAR包
这种结构的好处是定位问题非常快:页面样式出了问题去JSP找,业务逻辑出了问题去Servlet找,数据不对了去DAO和SQL里找,不用像某些框架那样查一堆自动生成的代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计:一卡通的表结构到底该怎么建
数据库是这个系统的地基。校园一卡通的核心是"卡",所有业务都围绕卡片的状态和资金流动展开。我在设计表结构时,重点考虑了完整性约束和查询效率。
2.1 核心表结构详解
我建了6张核心表,每张表都对应一个明确的功能域。
用户表(t_user)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT PRIMARY KEY AUTO_INCREMENT | 自增主键 |
| username | VARCHAR(50) UNIQUE | 登录用户名 |
| password | VARCHAR(100) | 登录密码(MD5加密存储) |
| role | VARCHAR(20) | 角色:admin/student |
| is_active | TINYINT | 是否启用:1启用,0禁用 |
学生信息表(t_student)
| 字段名 | 类型 | 说明 |
|---|---|---|
| student_no | VARCHAR(20) PRIMARY KEY | 学号,业务主键 |
| name | VARCHAR(50) | 姓名 |
| department | VARCHAR(50) | 院系 |
| major | VARCHAR(50) | 专业 |
| phone | VARCHAR(20) | 联系电话 |
| card_id | INT | 关联一卡通ID |
一卡通表(t_card)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT PRIMARY KEY AUTO_INCREMENT | 卡ID |
| card_no | VARCHAR(30) UNIQUE | 卡号 |
| student_no | VARCHAR(20) | 持卡人学号 |
| balance | DECIMAL(10,2) | 卡内余额 |
| status | TINYINT | 卡片状态:1正常,2挂失,3注销 |
| create_time | DATETIME | 办卡时间 |
充值记录表(t_recharge)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT PRIMARY KEY AUTO_INCREMENT | 流水ID |
| card_id | INT | 卡ID |
| amount | DECIMAL(10,2) | 充值金额 |
| recharge_time | DATETIME | 充值时间 |
| operato |
