最近总有读者拿着“JSP记账本的设计与实现”这个题目来问我,说课程设计或毕业设计抽到了它,手头只有一份标题里写着“程序+源码+数据库+调试部署+开发环境”的压缩包,却不知道从哪下手。这类项目的本质,是用一套完整的Java Web技术栈把记账业务跑通,听起来简单,但真正动手时会发现:数据库怎么建、登录状态怎么维持、报表怎么统计、部署到别人电脑上为什么乱码,每一个环节都能卡住人。这篇就围绕JSP记账本从设计、编码、调试到部署的全过程,把我实际做这个项目时踩过的坑、总结的经验一次讲清楚。
1. 记账本项目为什么选JSP:一个成熟技术栈在课程设计里的现实价值
1.1 这个题目到底在考什么
JSP记账本是一个很典型的Java Web入门综合项目。它不像商城、论坛那么复杂,但又完整覆盖了一个Web应用从后端到前端、从数据库到页面渲染的所有环节。考察点其实非常明确。
- 能用JSP+Servlet处理HTTP请求和响应
- 能用JDBC操作MySQL数据库,完成增删改查
- 能用Session/Cookie管理用户登录状态
- 能用JSTL、EL表达式在页面展示动态数据
- 能理清项目目录结构、配置文件、部署方式
这些点合在一起,对应的是企业对Java Web开发的入门要求。所以哪怕JSP现在在生产环境中的新项目用得少了,这个题目仍然是很多学校课程设计的常客,因为它能在写代码的过程中把Web开发的骨架练一遍。
1.2 JSP/Servlet在这个场景下的真实优势
有人会问,现在新项目都用Spring Boot了,为什么不直接学Spring Boot?这个问题我在带学生做项目时被问过很多次。
从学习角度讲,JSP+Servlet是理解Web底层原理最好的方式。Spring Boot帮你封装了内嵌Tomcat、自动配置、依赖管理,你写起来是快,但你对HTTP请求如何被处理、Session怎么创建、Servlet生命周期是什么样的,实际上是模糊的。而JSP记账本逼着你手动处理这些细节——你写一个Servlet,手动配置web.xml,手动获取Connection,手动关闭资源。这个过程虽然啰嗦,但扎实。
从课程设计答辩角度讲,JSP项目更容易被老师问到细节,也更容易答上来。因为每一步都是你自己写出来的,没有框架帮你兜底。老师问“你这个登录状态存在哪里”,你可以直接说Session;问“数据库连接怎么管理的”,你可以把JDBC的步骤背出来。
JSP本身在服务端渲染场景下并没有完全过时。在一些老系统的维护、内部管理系统、快速原型开发中,JSP仍然在运行。学会读JSP代码,是接手很多老旧项目的必备技能。
1.3 技术栈清单和版本选型
做JSP记账本,我建议的技术栈如下,版本经过实践验证,按这个组合能少踩很多坑。
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| JDK | 1.8 或 11 | 8最稳,兼容性最好,Tomcat支持最全 |
| IDE | Eclipse EE 或 IDEA Ultimate | 两个都行,IDEA对JSP语法提示更好 |
| Web服务器 | Tomcat 8.5 或 9.0 | 9.0对应Servlet 4.0,8.5够用 |
| 数据库 | MySQL 5.7 或 8.0 | 5.7经典,8.0注意驱动和时区问题 |
| 前端技术 | JSP + JSTL + EL + jQuery | 不需要前端框架,够用 |
| 项目管理 | Maven 3.6+ | 方便管理依赖,但也可以不用 |
提示:如果你的题目要求里没有强制Maven,用传统方式在Eclipse里建Dynamic Web Project(动态Web项目),把jar包手动放到WEB-INF/lib下,反而更直观,也更好控制版本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计:记账本的核心不在页面,而在数据模型怎么搭
2.1 三张核心表的设计思路
很多同学拿到题目第一反应是去写登录页面、记账页面,这是本末倒置。记账本的核心是数据,数据模型设计得不好,后面所有页面都会跟着改。我先设计的是数据库,而且只用了三张表,就把这个项目的基本业务全部撑起来了。
第一张是用户表。这个表是记账本所有数据归属的前提,没有用户体系,账本数据就没法和人关联。第二张是分类表,用来管理收入支出分类,比如餐饮、购物、工资、奖金。第三张是账单流水表,这是整个项目最核心的业务表,每一笔收入或支出都对应一条记录。
2.2 建表SQL脚本和表关系说明
我直接给出一份可运行的建表脚本,MySQL 5.7和8.0都能跑。
sql复制-- 用户表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 分类表
CREATE TABLE `t_category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '所属用户',
`name` varchar(50) NOT NULL COMMENT '分类名称',
`type` tinyint(4) NOT NULL COMMENT '1收入 2支出',
`sort` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 账单流水表
CREATE TABLE `t_record` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '所属用户',
