ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java Web毕业选题系统课设源码详解:JSP+Servlet+MySQL实现

Java Web毕业选题系统课设源码详解:JSP+Servlet+MySQL实现 简介面向高校计算机及相关专业学生的Java Web毕业设计选题系统完整源码包覆盖管理员、教师、学生三类角色管理员负责系统维护并可增删管理系主任信息教师可录入毕业设计题目并对学生的选题进行审核学生登录后即可在线完成选题涵盖高校毕设选题管理的核心流程。开发环境采用JDK1.8、MySQL5.7、Tomcat推荐使用Eclipse或IDEA配合Navicat导入数据库配套数据库文件和详细说明文档部署上手较为容易。资源共547个文件压缩包约8.65MB其中GIF操作演示截图353张、JSP页面61个、CSS样式表38个、JS脚本23个另含docx/doc说明文档、CAJ参考文献及jar依赖库目录按模块划分清晰便于逐块阅读学习。已有53人学习适合作为课程设计或毕业设计的参考项目也可帮助Java Web初学者理解选题系统的业务逻辑、分层架构与前后端配合方式。1. 毕业选题系统这是一份能直接打开的 Java Web 课设源码如果你接过 Java Web 课设一定熟悉这种局面网上下载的源码要么缺数据库要么没有说明文档要么一导入全是红叉。这份基于 Java 的毕业选题系统把管理员、老师、学生三条角色线都做成了完整前后端从学生选题到老师审核中间的状态流转都是现成的。技术栈是 Java JSP JDK 1.8 MySQL 5.7 Tomcat和大多数课程设计的交付环境完全一致包含源码、数据库脚本和说明文档材料。这套系统能解决的是毕业设计选题管理的核心流程学生不用再靠 Excel 排队抢题老师能统一录入题目并在线审核管理员维护基础数据和系统参数。对正在做课设、毕设的同学来说它的价值在于可以直接下载复现再基于它改成自己的题目对想快速了解 JSP Servlet 传统项目怎么组织权限和业务状态的从业者它也是一个很小的可读样本。下面我按自己实际拆解这套资源的顺序从结构、环境、导入到避坑一层层讲清楚。2. 系统结构与选题流程三个角色背后是怎么协作的2.1 管理员、老师、学生的权限边界这套系统的核心不是复杂算法而是三类角色的权限边界。管理员负责增加系主任信息和系统维护老师负责录入毕业设计题、审核学生选题学生负责网上选题。三个角色对应三种不同的操作入口在 JSP 老项目里识别身份一般靠登录后的 Session 字段比如 roleId 或 userType页面头部统一校验没有权限就直接跳回登录页。从项目正文列出的文件能看出压缩包里带了 db.class、.classpath、Eclipse 工程配置和几份 CSS 样式表。这说明源码是 Eclipse 传统 Web 工程不是 Maven 结构数据库访问被封装在一个独立类里。常见写法是有一个 DBManager 工具类维护静态连接JSP 或 Servlet 调用它执行 SQL。这种写法对课设来说很直观答辩时也容易讲清数据从哪来、写到了哪个表。三个角色对应的数据表通常分主表和关联表。下面这个表是典型的模块对照拿到源码后可以按这个思路去找页面和表角色核心操作典型数据表页面入口管理员增加系主任信息、系统维护t_adminadmin 相关页面老师录入题目、审核学生选题t_teacher、t_subjectteacher 相关页面学生网上选题t_student、t_student_subjectstudent 相关页面注意这个表格只是功能对照实际表名不以它为准。课设项目里表名有叫 sys_user、tb_title、tb_choose 的也有叫 admin_info、teacher_info 的关键是对照字段语义而不是认死一个表名。真正要理解业务建议先找“题目表”和“选题中间表”这两张表因为它们几乎承载了全部状态变化。2.2 选题状态机与数据表设计思路网上选题的本质是一个状态机老师发布题目后题目先处于“待选择”状态学生申请选题后变成“待审核”老师审核通过后变成“已选中”如果老师驳回就重新回到“待选择”让其他学生继续选。这个状态机画清楚了业务逻辑就完成了一大半。常见的数据表设计是把当前状态放在题目表里同时用一张中间表记录选题申请记录。下面是我给这类系统做简化设计时常用到的建表脚本和这套资源的思路基本一致。CREATE TABLE t_subject ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 题目ID, title VARCHAR(100) NOT NULL COMMENT 题目名称, description TEXT COMMENT 题目要求, teacher_id INT NOT NULL COMMENT 发布老师ID, status TINYINT DEFAULT 0 COMMENT 0待选择 1待审核 2已选中 3已驳回, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT毕业设计题目表; CREATE TABLE t_student_subject ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL COMMENT 学生ID, subject_id INT NOT NULL COMMENT 题目ID, apply_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 申请时间, audit_time DATETIME COMMENT 审核时间, audit_status TINYINT DEFAULT 0 COMMENT 0未审核 1通过 2驳回, KEY idx_subject (subject_id), KEY idx_student (student_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生选题中间表;代码说明t_subject 的 status 字段承担了题目自身状态t_student_subject 则是学生和题目的多对多关联。中间表里同时加了申请时间和审核时间这是为了记录操作轨迹如果源码原本没有这两个字段你补上也不破坏原结构。status 用 TINYINT 而不是 VARCHAR是为了让数据库层直接比较状态值避免把字符串判断写散在业务代码里。索引 idx_subject 和 idx_student 对应两个高频查询一个题目的被选记录、一个学生的选题记录加索引成本低收益高。很多课设项目图省事把 student_id 直接写进题目表优点是查询少一张表缺点是学生一旦选题题目就被占死无法记录驳回前的历史状态。中间表多一次 join但给“是否重复选题”“老师驳回后再选别的题”留了余量我建议保留中间表。你拿到源码后可以先看一眼 SQL 里有没有类似 t_student_subject 的表如果有说明状态机设计是清晰的如果只有题目表加一个 student_id 字段那就是简化版本改造时需要额外注意。另一处容易被忽略的字段是 teacher_id。老师能录入题目题目表必然要关联老师表如果老师调到别的系或账号被删题目要怎么处理很多课设没有外键约束数据一致性靠 Java 层保证所以你会看到删除老师前要先“转交题目”或“删除全部题目”。源码里如果有类似逻辑那是对业务做了完整考虑的。实际操作时我一般用 Navicat 打开源码附带的 SQL 文件先找到题目表和中间表再顺着中间表字段去对应 JSP 页面里的查询条件基本不需要读全部代码。比如老师审核页面的 SQL 里如果出现 update t_student_subject set audit_status1 where subject_id?那就对应状态从待审核到已选中如果只更新中间表、不动题目表那么“已选中”状态可以由 audit_status 推导。两者课程设计里都常见不必强行统一。这套系统还在用 JSP并不是技术落后而是课程设计环境决定的不依赖 Maven、不依赖 Spring 依赖注入解压到 Eclipse 就能 import答辩演示时容错率最低。JSP Servlet JDBC 三段式可以很清楚地把表现层、控制层、数据层分开连数据库异常都能从控制台直接定位到具体行。理解了这一点你再看后面的环境安装就不会觉得多余。3. 环境与配置JDK 1.8 MySQL 5.7 Tomcat 的版本匹配3.1 为什么是这个组合版本匹配的硬道理这套资源的环境说明写得很明确Java/JSP、JDK 1.8、MySQL 5.7、Navicat 11、Eclipse 或 IDEA、Tomcat 部署。很多人拿到源码不看版本直接装最新的 JDK 21 和 MySQL 9然后控制台报一堆错其实代码没问题是版本环境不兼容。JDK 1.8 配 Tomcat 8.5 是老牌组合Tomcat 8.5 对应 Servlet 3.1和 JDK 8 的 JDBC 4.1 配合很稳。Tomcat 9 也支持 JDK 8但对老课设项目来说8.5 是最省事的选择。如果你用 Tomcat 10项目里所有 import javax.servlet.* 都要改成 jakarta.servlet.*那不是一个文件的事整个项目要重编译课程设计阶段没必要做这种迁移。MySQL 5.7 和 MySQL 8 的最明显差异在 JDBC 驱动5.7 用 com.mysql.jdbc.Driver8.0 用 com.mysql.cj.jdbc.Driver。如果你把项目连到 MySQL 8驱动类名不变会直接报 ClassNotFoundException连接串里的 serverTimezone 参数在 8.0 下是必填的在 5.7 下可加可不加。下面是落地这套系统时我推荐固定的一组环境参数旁边是需要注意的边界情况。软件推荐版本主要作用特别注意事项JDK1.8编译和运行 Java 代码不要再配 JDK 11老 IDE 插件可能失效MySQL5.7.x如 5.7.44存储题目、用户、选题记录安装时记好 root 密码策略Tomcat8.5.xJSP/Servlet 容器Tomcat 10 需要改 jakarta 包名Navicat11 或更高可视化导入 SQL11 对 MySQL 5.7 兼容最顺IDEEclipse 2019-06 或 IDEA 2021开发与部署Eclipse 需要装 Java Web 插件选型理由是这套环境足够应付课程设计演示。MySQL 5.7 的 utf8mb4 支持完善不会出现 8.0 在部分 Linux 发行版上 root 认证插件导致的密码问题Tomcat 8.5 的启动脚本和 webapps 目录简单直接适合在教室讲台上快速展示IDE 用 Eclipse 则是因为压缩包里的 .classpath 文件可以直接导入省掉手工配置。3.2 本地环境搭建步骤搭建顺序建议按 JDK → MySQL → Tomcat → IDE 来每一步都验证完再往下走不然后面排错时不知道是本级问题还是上级问题。安装完 JDK 后在命令行验证编译器和运行时版本java -version javac -version如果 java 有版本而 javac 提示找不到说明只装了 JRE 或没有把 JDK 的 bin 目录放进 PATH。课程设计要求的是 JDK不是 JRE否则源码编译都过不了。检查完版本后可以把 JDK 环境变量配好Windows 下可以这样写JAVA_HOMED:\Java\jdk1.8.0_291 PATH%JAVA_HOME%\bin;%PATH%配置完要重新打开一个命令行窗口因为新环境变量不会自动加载到已打开的终端里。我见过不少同学明明配了 JAVA_HOME却还在用旧终端输入 java -version结果看到旧版本就开始怀疑安装包有问题。MySQL 5.7 安装完成后先用命令行验证连接mysql -u root -p输入密码后看到 mysql 提示符说明数据库服务正常。这一步不能跳过因为后面导入 SQL 时最常翻车的就是密码或端口不对。如果你本机之前装过 MySQL 85.7 的服务可能启动不了原因是 3306 端口被占用可以在 5.7 的 my.ini 里改成 3307然后把后续连接串里的 3306 改成 3307。Tomcat 安装后先验证容器本身能启动。Windows 下进入 bin 目录执行startup.bat看到日志里有 Server startup 字样后访问 http://localhost:8080能打开 Tomcat 欢迎页就说明容器正常。注意这一步要在 8080 端口没被占用的前提下做否则日志会卡在最后一两行。你可以用 netstat -ano | findstr 8080 检查端口占用如果被其他服务占了优先处理占用而不是急着改端口因为改完端口还要同步项目里的跳转地址。IDE 部分推荐直接用 Eclipse 2019 的 Java EE 版本。打开后配置 Tomcat RuntimeWindow → Preferences → Server → Runtime Environments → Add选择刚才安装的 Tomcat 8.5 并指向安装目录。有一个很容易被忽略的细节Eclipse 里 Servers 面板部署项目时是把项目复制到 wtpwebapps 目录而不是直接用工作区里的文件。所以后面你们会遇到“改了代码页面却没变”的灵异事件第五章我会专门写处理办法。工程导入后还要检查编译级别。在项目 Properties → Java Compiler 里把 Compiler compliance level 设为 1.8。如果不设Eclipse 默认按当前 JDK 等级编译例如用 JDK 17 编译出的 class 是 61 版本Tomcat 8.5 的类加载器会报 UnsupportedClassVersionError那是 class 版本太高不是代码问题。到这里环境部分可以做一个自检打开命令行java -version 看到 1.8mysql --version 看到 5.7访问 Tomcat 欢迎页正常Eclipse 里新建 Dynamic Web Project 能选择到 Tomcat 8.5。四项都满足就可以进入导入源码阶段了。4. 导入源码与数据库从解压到跑通的完整操作4.1 数据库导入与连接参数拿到这份资源后第一件事不是急着导入 IDE而是先把 MySQL 跑起来把数据库脚本导入。JSP 课设项目的 SQL 脚本一般放在压缩包根目录或 database 子目录文件名可能是 .sql也可能是一个 txt 格式的备份。用 Navicat 连接 root 后右键新建数据库命名建议和连接串里出现的库名保持一致这样后面最少改动。新建数据库时字符集选 utf8mb4排序规则选 utf8mb4_general_ci。这一步很关键因为 JSP 页面、JDBC 连接串、数据库三层编码只要有一层不是 UTF-8中文题目就很容易乱码。建好数据库后在新库上右键“运行 SQL 文件”选择 .sql 文件执行看到导入成功的提示即可。导入后先验证表结构SHOW TABLES; SELECT COUNT(*) FROM t_subject;如果 t_subject 不存在就换 t_title、subject_info 之类的表名试试。这个方法比直接看 DAO 层代码快因为课设表数量少SHOW TABLES 一下就能看出表是围绕选题业务设计的还是围绕用户管理设计的。如果库里连一张选题记录表都没有那说明 SQL 脚本可能不完整要回头检查是不是选了错误的库导入。接下来改连接参数。在源码里搜关键字 jdbc:mysql找到数据库工具类或配置文件。常见位置是 src 下的 db.properties、DBManager.java、DBUtil.java。我一般直接打开 DBManager因为它是一个类文件getConnection 方法里写着完整的连接串改动最小。典型配置如下jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/biye_design?useUnicodetruecharacterEncodingutf-8 jdbc.usernameroot jdbc.password123456参数说明url 里的 biye_design 必须和 Navicat 里建的库名一致password 是本地 MySQL root 的密码。useUnicodetrue 和 characterEncodingutf-8 要一起出现否则数据库连接会按系统默认字符集传输中文。如果你的 MySQL 是 8.0把驱动换成 com.mysql.cj.jdbc.Driver并在 URL 末尾追加 serverTimezoneAsia/Shanghai。很多源码下载后打开登录页就报 500九成原因是这个配置没改。提示如果 SQL 脚本执行时提示 Unknown database 或 Duplicate key先确认是否新建了库再确认脚本里没有和旧库的 create table 冲突。最简单的办法是 DROP 掉刚建的库再重建而不是只处理报错的部分语句。4.2 部署到 Tomcat 的细节Eclipse 下导入项目选择 File → Import → Existing Projects into Workspace选中解压后的工程根目录。由于压缩包里带了 .classpath 和 .settings 文件Eclipse 通常能直接识别成一个 Java Web 工程导入后不需要额外转成 Dynamic Web Module 就能看到 web 内容。如果你的 Eclipse 把它识别成普通 Java 工程就在项目属性里勾选 Project Facets → Dynamic Web Module并指定 Target Runtime 为 Tomcat 8.5。IDEA 里导入传统 JSP 项目会麻烦一些。因为项目没有 pom.xmlIDEA 不会自动识别 Web 结构。需要 Project Structure 里新建一个 Web Facet再把 src 目录标记为 Sources把 web 目录或 WebContent 标记为 Web Resources然后把 WEB-INF/lib 下的 jar 都加入到 Libraries。如果你不是非用 IDEA 不可我建议这次先用 Eclipse毕竟资源的工程文件就是为 Eclipse 准备的。部署前还要检查 web.xml 的欢迎页配置。老课设项目一般用 JSP 做首页要么是 login.jsp要么是 index.jsp。打开 WEB-INF/web.xml看到类似下面这段就是欢迎页设置welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list如果 Tomcat 启动后访问根路径显示 404先检查这里再检查目录下是否存在对应 JSP 文件。welcome-file 的值是相对项目根的路径不要写成 /WEB-INF/... 之外的多余前缀否则 Tomcat 匹配不到文件。在 Eclipse Servers 视图里把项目 Add 到 Tomcat然后启动。日志出现 Deployed 后访问 http://localhost:8080/项目名/login.jsp。context path 默认和项目名一致建议先不要改成 root避免和 Tomcat 自带首页混淆。看到登录页只代表一半成功还要完整走一遍业务管理员登录增加一个系主任老师登录发布一个课题学生登录选择课题老师审核通过。每一步都没有红字异常才算真正跑通。部署阶段最常出现两个错误。第一个是 503 Service Unavailable意思是项目没有被 Tomcat 成功加载去 Catalin 日志里找 ClassNotFoundException 或 Context 部署失败的原因。第二个是 404 但文件明明存在这种多半是 context path 理解错了访问路径少了个项目名前缀或者 welcome-file 配置不对。这两个问题都不复杂但很容易在答辩前夜让人烦躁所以我把它们放到下一章一起讲。5. 避坑与常见问题我在这套系统里踩过的四个坑5.1 数据库密码不一致MySQL 直接拒绝连接现象打开登录页提交后控制台打出 Access denied for user rootlocalhost登录框一直进不去。原因源码里的数据库密码和你本机的不一致。很多人只导入了 SQL忘了改 JDBC 配置或者改了配置但没有重启 Tomcat旧连接还在缓存里。解决先在 MySQL 命令行确认自己的用户名和密码能正常登录再打开项目里的数据库连接文件把 jdbc.password 同步过去保存并重启 Tomcat。如果之前启动过旧连接在 MySQL 里执行 FLUSH PRIVILEGES 重置权限缓存。补充说明我帮同学排查时遇到过密码在配置里有多余空格的情况肉眼看不出来建议写配置时把密码两边的空格清掉用引号包住值。这类问题日志只给一句 access denied不会告诉你在哪个文件改所以排查顺序是先检查 db.properties → 再检查 DBManager → 最后看 Tomcat 启动日志里的连接信息。5.2 中文乱码页面、数据库、连接串三层问题现象用 Navicat 看表数据中文正常但网页上题目名显示“????”或乱码方块有时候是提交中文后数据库里变成乱码而页面显示正常。原因三层编码不一致。数据库表不是 utf8mb4JDBC 连接串缺少 characterEncodingutf-8JSP 页面没有声明 pageEncodingTomcat 用了 ISO-8859-1 解码请求。解决三层一起改。第一层把数据库和表的字符集改成 utf8mb4SQL 脚本里如果没有 CHARSETutf8mb4 就手动补上第二层在连接串 URL 上追加 useUnicodetruecharacterEncodingutf-8第三层在 JSP 顶部加上 % page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%。用 GET 方式提交中文时还需要在 Tomcat 的 server.xml Connector 上配置 URIEncodingUTF-8。补充说明课程设计里最常见的根源是压缩包里的 SQL 本身是 GBK 编码导入后数据物理上已经乱码此时只改连接串治标不治本。我的做法是用文本编辑器把 .sql 转成 UTF-8 无 BOM 后再导入然后复查 SHOW CREATE TABLE 的 CHARSET。5.3 Tomcat 版本太高报 NoClassDefFoundError现象项目放到 Tomcat 10 上启动日志里出现 java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet或者 ClassNotFound 异常页面无法访问。原因Tomcat 10 把 Java Servlet API 的包名从 javax.* 改成 jakarta.*老 JSP 项目里的 import javax.servlet 全部失效。解决最省事的方法是换回 Tomcat 8.5 或 9.0完全不用改代码。如果用 Eclipse 内置的 tc Server 也会碰到类似问题因为它的 Servlet 版本太新。如果要硬用 Tomcat 10就得把项目里所有 javax.servlet 替换为 jakarta.servlet并同步更新 web.xml 头部的 schema 版本这对课设没有价值。补充说明还有一个容易被带偏的情况是“Tomcat 8.5 里启动却报 NoClassDefFoundError”那通常是缺少 servlet-api.jar 依赖。老工程把 jar 放在 WEB-INF/lib 下Eclipse 没把它们加入 Build Path 就会出现这个现象解决办法是把 WEB-INF/lib 下所有 jar 加入项目依赖。5.4 改了 Java 代码页面却还是老结果现象修改了 Servlet 里的查询语句浏览器刷新后看到的结果和修改前一样甚至调试断点也没进去。原因Eclipse 部署 Tomcat 时把项目复制到 wtpwebapps 目录运行。只改源码不清除发布目录Tomcat 加载的还是旧 class。解决右键项目 → Clean再右键 Tomcat → Clean等待 Servers 视图里项目状态变成 [synchronized]然后重启。这个流程大约 20 秒但大多数人只 Clean 了项目忘了 Clean Tomcat 发布目录。IDEA 下同样要删除旧的 exploded war 并重新 Make 项目否则也会出现旧资源。补充说明如果你在启动日志里看到 Reloading 单词说明 Tomcat 热重载生效了。但实际上 jsp 修改能热生效Servlet 修改不一定会所以别依赖热部署改成“Clean 重启”的老实流程最稳。5.5 8080 端口被占用Tomcat 启动卡住现象startup.bat 执行后日志没有报错但浏览器访问 localhost:8080 一直打不开控制台也退不出来。原因8080 端口被其他进程占用Tomcat 的 Connector 初始化失败但 Windows 命令行窗口不会直观显示这个异常。解决执行 netstat -ano | findstr 8080看到 LISTENING 的 PID 后在任务管理器结束对应进程如果是以前没关干净的 Tomcat 实例也可以直接 kill 掉 PID。不想动其他服务的话就改 conf/server.xml 里的端口为 8081 或 8082但要记得项目里的访问路径也跟着改。补充说明端口问题看起来低级却最容易在学校机房发生因为常见开发环境里的各种服务都可能占 8080。我现在拿到任意 Tomcat 项目启动前都先 netstat 一下已经成为条件反射。6. 进阶验证把 JSP 选题系统改成接口化实验6.1 用 Postman 直接验证选题状态流转传统 JSP 项目没有 REST API但不代表不能做接口化验证。你可以先用 Postman 模拟登录拿到 Session ID再直接请求老师审核接口看数据库状态变化。这种方式对课设答辩特别有用因为不需要反复点击页面也能证明接口逻辑是通的。fetch(http://localhost:8080/biji/login.jsp, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded }, body: username10001password123456role1, credentials: include }) .then(r r.text()) .then(html console.log(html.includes(欢迎)));参数说明body 里的 role 表示身份1 管理员、2 老师、3 学生是我按常见系统划分写的实际参数名要以源码里的 JSP 表单字段为准。credentials: include 保证 Cookie 被保存下来后续请求才能继续带着 session 访问。这个验证法的价值是面向业务动作本身避开页面跳转造成的干扰。6.2 给“学生选题”加一个幂等校验在课设项目上做小优化最值得加的是选题幂等校验同一个学生连续点击两次选择不应插入两条重复记录。逻辑不复杂但能体现基本代码意识。public boolean hasApplied(Connection conn, int studentId, int subjectId) throws SQLException { String sql SELECT COUNT(*) FROM t_student_subject WHERE student_id? AND subject_id?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, studentId); ps.setInt(2, subjectId); ResultSet rs ps.executeQuery(); rs.next(); return rs.getInt(1) 0; }这段代码的逻辑是在学生提交选题前先查中间表是否存在同样的一对学生和题目大于 0 就返回 true页面提示“已经提交过请勿重复操作”。注意 PreparedStatement 的占位符顺序必须和 SQL 里的问号顺序完全一致studentId 在前subjectId 在后。中间表的两个索引正好覆盖这个查询数据量不大时性能可以忽略。我现在的习惯是拿到一套 JSP 课设源码后先不走页面直接跑一遍核心 SQL再把数据库连接串和 Tomcat 版本检查一遍最后才打开浏览器演示。这套流程帮我避免过好几次在讲台上临时改配置的尴尬希望帮到你。本文还有配套的精品资源点击获取
返回列表