☰
Java Web毕业选题系统课设源码详解:JSP+Servlet+MySQL实现
2026/10/4 12:07:57 网站建设 项目流程

简介:面向高校计算机及相关专业学生的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 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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_status=1 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.Driver,8.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_HOME=D:\Java\jdk1.8.0_291 PATH=%JAVA_HOME%\bin;%PATH%

配置完要重新打开一个命令行窗口,因为新环境变量不会自动加载到已打开的终端里。我见过不少同学明明配了 JAVA_HOME,却还在用旧终端输入 java -version,结果看到旧版本就开始怀疑安装包有问题。

MySQL 5.7 安装完成后,先用命令行验证连接:

mysql -u root -p

输入密码后看到 mysql> 提示符,说明数据库服务正常。这一步不能跳过,因为后面导入 SQL 时最常翻车的就是密码或端口不对。如果你本机之前装过 MySQL 8,5.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 Runtime:Window → 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.8,mysql --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.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/biye_design?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=123456

参数说明:url 里的 biye_design 必须和 Navicat 里建的库名一致;password 是本地 MySQL root 的密码。useUnicode=true 和 characterEncoding=utf-8 要一起出现,否则数据库连接会按系统默认字符集传输中文。如果你的 MySQL 是 8.0,把驱动换成 com.mysql.cj.jdbc.Driver,并在 URL 末尾追加 serverTimezone=Asia/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.xml,IDEA 不会自动识别 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-file>login.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 'root'@'localhost',登录框一直进不去。

原因:源码里的数据库密码和你本机的不一致。很多人只导入了 SQL,忘了改 JDBC 配置;或者改了配置但没有重启 Tomcat,旧连接还在缓存里。

解决:先在 MySQL 命令行确认自己的用户名和密码能正常登录,再打开项目里的数据库连接文件,把 jdbc.password 同步过去,保存并重启 Tomcat。如果之前启动过旧连接,在 MySQL 里执行 FLUSH PRIVILEGES 重置权限缓存。

补充说明:我帮同学排查时遇到过密码在配置里有多余空格的情况,肉眼看不出来,建议写配置时把密码两边的空格清掉,用引号包住值。这类问题日志只给一句 access denied,不会告诉你在哪个文件改,所以排查顺序是:先检查 db.properties → 再检查 DBManager → 最后看 Tomcat 启动日志里的连接信息。

5.2 中文乱码:页面、数据库、连接串三层问题

现象:用 Navicat 看表数据中文正常,但网页上题目名显示“????”或乱码方块,有时候是提交中文后数据库里变成乱码,而页面显示正常。

原因:三层编码不一致。数据库表不是 utf8mb4;JDBC 连接串缺少 characterEncoding=utf-8;JSP 页面没有声明 pageEncoding,Tomcat 用了 ISO-8859-1 解码请求。

解决:三层一起改。第一层把数据库和表的字符集改成 utf8mb4,SQL 脚本里如果没有 CHARSET=utf8mb4 就手动补上;第二层在连接串 URL 上追加 useUnicode=true&characterEncoding=utf-8;第三层在 JSP 顶部加上 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>。用 GET 方式提交中文时,还需要在 Tomcat 的 server.xml Connector 上配置 URIEncoding="UTF-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: 'username=10001&password=123456&role=1', 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 版本检查一遍,最后才打开浏览器演示。这套流程帮我避免过好几次在讲台上临时改配置的尴尬,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询