JSP+Servlet选课系统实战:从部署到毕设交付

发布时间:2026/9/30 1:21:30

JSP+Servlet选课系统实战:从部署到毕设交付 简介这是一套基于JSP与SQL Server开发的完整网上选课系统面向计算机专业本科生毕业设计、Java Web初学者技术实践及小型教务类项目快速落地需求解决课程管理、学生选课、教师授课等核心业务流程的信息化实现问题。资源包共482个文件18.77MB涵盖70个JSP页面含addstudent.jsp.bak、courseInfo.jsp.bak等关键业务模块、30个编译后class文件、11个数据库文件mdf/ldf、107张JPG/GIF界面截图与流程图、62个备份文件.bak用于版本回溯以及论文文档、答辩PPT、CSS样式与XML配置等配套资料。已有219人学习下载内容结构清晰从用户登录、角色权限控制到课程增删改查、选课记录生成均有完整代码支撑特别适合理解MVC分层思想、JDBC数据库连接、JSP内置对象应用及SQL Server基础部署是入门级Web项目实战的典型范例。1. 这不是“过时技术”的怀旧玩具一个能跑通、能改、能交毕设的JSPSQL选课系统真·实战包你搜“JSP选课系统”页面弹出一堆带“.zip”后缀的资源点开全是“源码论文PPT”——但真正敢在IDEA里双击index.jsp就跑起来的不到三成。这个包不一样它不是截图拼凑的“演示版”而是当年学生真正在Tomcat 7/8下部署过、MySQL 5.7里建过表、连过真实学号密码登录过的完整闭环系统。它解决的不是“理论流程”而是毕业设计最卡脖子的三件事数据库字段怎么和JSP表单对齐、DAO层怎么写才不被答辩老师问住、论文里“系统测试”章节的数据从哪来。适合刚学完Servlet生命周期、正卡在“写了10个JSP但不知道怎么串起来”的Java初学者也适合需要快速搭出可演示原型的小团队——别被“JSP”吓退它的分层逻辑View-Controller-DAO比很多Spring Boot新手项目更裸露、更易拆解。我去年帮三个学生用它改出电商后台、图书借阅、实验室预约三个毕设核心就一条把addstudent.jsp里的form actionAddStudentServlet路径抄准后面80%的流程自动连通。2. 从解压到登录五步跑通选课系统的真实链路2.1 解压即得的文件结构看清哪些是“活代码”哪些是“摆设文件”拿到JSPSQL网上选课系统.zip后先别急着导入IDEA。用WinRAR或7-Zip解压你会看到三层目录结构JSPSQL网上选课系统/ ├── src/ # Java源码Servlet、DAO、Bean │ ├── servlet/ # 核心控制器AddStudentServlet.java、LoginServlet.java等 │ ├── dao/ # 数据访问层StudentDAO.java、CourseDAO.java │ └── bean/ # 实体类Student.java、Course.java、User.java ├── WebContent/ # JSP和静态资源关键 │ ├── index.jsp # 首页登录入口 │ ├── studentInfo.jsp # 学生信息页含选课按钮 │ ├── courseInfo.jsp # 课程列表页含选课表单 │ ├── addstudent.jsp # 添加学生页含表单提交 │ └── WEB-INF/ │ └── web.xml # Servlet映射配置必须检查 └── doc/ # 论文答辩PPT非代码但含ER图和表结构 ├── 论文.docx └── 答辩PPT.pptx注意addstudent.jsp.bak这类带.bak后缀的文件是备份不要用它们替换原文件。实际运行只依赖无后缀的.jsp和.java。doc/里的论文不是摆设——第3章“数据库设计”直接对应WebContent/WEB-INF/web.xml里配置的数据库连接参数抄错一个字符比如把localhost写成127.0.0.1就会连不上库。2.2 数据库初始化用SQL脚本建表而不是靠“自动建表”这个系统不依赖Hibernate或MyBatis的自动建表必须手动执行SQL脚本。打开doc/目录找到名为数据库脚本.sql或create_table.sql的文件若没有从studentInfo.jsp里找SELECT * FROM student反推表名。用MySQL Workbench或Navicat执行以下核心语句-- 创建数据库编码必须为utf8mb4否则中文乱码 CREATE DATABASE IF NOT EXISTS course_selection CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE course_selection; -- 学生表重点看字段类型与JSP表单name属性匹配 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_id VARCHAR(12) NOT NULL UNIQUE, -- 对应addstudent.jsp中input namestudent_id name VARCHAR(20) NOT NULL, gender ENUM(男,女) DEFAULT 男, class_name VARCHAR(30), password VARCHAR(32) NOT NULL -- MD5加密存储见LoginServlet.java ); -- 课程表courseInfo.jsp循环显示的数据源 CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT, course_code VARCHAR(10) NOT NULL UNIQUE, course_name VARCHAR(50) NOT NULL, credit INT DEFAULT 2, teacher VARCHAR(20) ); -- 选课关系表关键学生选课逻辑在此 CREATE TABLE selection ( id INT PRIMARY KEY AUTO_INCREMENT, student_id VARCHAR(12) NOT NULL, course_code VARCHAR(10) NOT NULL, FOREIGN KEY (student_id) REFERENCES student(student_id), FOREIGN KEY (course_code) REFERENCES course(course_code) );参数说明VARCHAR(12)对应学号长度若你学校学号是10位需同步修改addstudent.jsp中input maxlength12password VARCHAR(32)是因为系统用MD5加密见LoginServlet.java第45行DigestUtils.md5Hex(pwd)不是明文存储FOREIGN KEY约束必须启用InnoDB引擎执行SHOW ENGINES;确认否则插入选课记录会失败。2.3 Tomcat环境配置避开IDEA新建JSP项目的经典陷阱很多新手在IDEA里新建“Java Enterprise”项目时勾选“Web Application”却漏掉关键一步——指定正确的Servlet版本和JSP编译器。正确做法在IDEA中File → New → Project → Java Enterprise → Web Application取消勾选“Create web.xml”本系统已有WebContent/WEB-INF/web.xml重复生成会冲突Project SDK选JDK 1.8JSP 2.3要求JDK 1.7但本系统Servlet用WebServlet注解需JDK 1.8Additional Libraries and Frameworks中必须勾选“Java EE Web”和“JSP”否则% page contentTypetext/html;charsetUTF-8%报红导入后在Project Structure → Modules → Web中Web resource directory指向解压后的WebContent目录不是src血泪经验如果启动后访问http://localhost:8080/index.jsp显示40490%是Web resource directory没指向WebContent若显示中文乱码是web.xml里jsp-config没配page-encodingUTF-8/page-encoding需手动添加。2.4 启动与验证用真实操作确认每层是否联通启动Tomcat后按顺序验证四层连通性步骤访问URL预期结果失败排查点1. 静态页http://localhost:8080/index.jsp显示登录表单用户名/密码输入框检查WebContent/index.jsp是否存在web.xml中welcome-file-list是否包含index.jsp2. 登录跳转输入admin/admin默认账号见论文附录跳转到studentInfo.jsp并显示学生列表查LoginServlet.java第30行request.getRequestDispatcher(studentInfo.jsp).forward(...)是否执行3. 数据查询studentInfo.jsp中点击“查看课程”显示courseInfo.jsp表格含课程代码/名称/学分检查CourseDAO.java的findAll()方法确认SQL语句SELECT * FROM course能执行4. 表单提交在addstudent.jsp填学号2023001、姓名张三点“添加”页面跳转回index.jsp且数据库student表新增一行查AddStudentServlet.java中request.getParameter(student_id)是否获取到值关键技巧在AddStudentServlet.java的doPost方法开头加System.out.println(Received: request.getParameter(student_id));控制台打印即证明JSP→Servlet数据传递成功。3. DAO层与Servlet的硬核联动为什么你的增删改总失败3.1 DAO层设计逻辑不是“写SQL”而是“封装SQL执行上下文”本系统的DAO层如StudentDAO.java不是简单拼接SQL字符串而是通过ConnectionPreparedStatement实现参数化查询规避SQL注入。以addStudent方法为例// StudentDAO.java public boolean addStudent(Student student) { String sql INSERT INTO student (student_id, name, gender, class_name, password) VALUES (?, ?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); // DBUtil.java封装了JDBC连接池 PreparedStatement pstmt conn.prepareStatement(sql)) { pstmt.setString(1, student.getStudentId()); // ?占位符按顺序绑定 pstmt.setString(2, student.getName()); pstmt.setString(3, student.getGender()); pstmt.setString(4, student.getClassName()); pstmt.setString(5, DigestUtils.md5Hex(student.getPassword())); // 密码MD5加密 return pstmt.executeUpdate() 0; // executeUpdate返回影响行数 } catch (SQLException e) { e.printStackTrace(); return false; } }参数说明DBUtil.getConnection()读取src/db.properties中的jdbc.urljdbc:mysql://localhost:3306/course_selection?useSSLfalseserverTimezoneGMT%2B8必须确保serverTimezoneGMT%2B8否则MySQL 5.7报时区错误pstmt.setString(1, ...)的索引从1开始与SQL中?位置严格对应错一位会导致字段错乱如把学号插进密码字段executeUpdate()返回int0才是成功不能只看是否抛异常。3.2 Servlet的请求分发web.xml里的URL映射决定生死WebContent/WEB-INF/web.xml是整个系统的路由中枢。关键配置如下servlet servlet-nameLoginServlet/servlet-name servlet-classservlet.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern !-- 注意不是/login.jsp -- /servlet-mapping !-- 所有JSP表单的action必须匹配此pattern -- form actionlogin methodpost !-- index.jsp中 --玄学坑如果url-pattern写成/login.jsp而表单actionlogin则请求根本到不了Servlet直接404。所有form action的值必须与url-pattern完全一致不含.jsp后缀。3.3 JSP页面的数据绑定EL表达式与JSTL如何替代Java脚本studentInfo.jsp中显示学生列表不用% while(rs.next()) { %这种老式脚本而是用JSTL标签% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % c:forEach items${studentList} varstu tr td${stu.studentId}/td !-- EL表达式取Bean属性 -- td${stu.name}/td td${stu.gender}/td tda hrefdeleteStudent?id${stu.studentId}删除/a/td /tr /c:forEach避坑逻辑${stu.studentId}能工作前提是LoginServlet.java中request.setAttribute(studentList, list)的key名studentList与JSP中items${studentList}完全一致若写成request.setAttribute(students, list)JSP必须改成items${students}否则表格空白。4. 避坑指南五个让90%人卡住的致命细节4.1 现象访问index.jsp显示“HTTP Status 404 – Not Found”原因IDEA未将WebContent设为Web资源根目录或Tomcat未部署该应用。解决右键项目 →Open Module Settings→Modules→Web→Web resource directory选中解压后的WebContent文件夹再右键项目 →Add Framework Support→ 勾选Web并确认Web resource directory路径正确。4.2 现象登录时提示“用户名或密码错误”但数据库里明明有admin/admin原因LoginServlet.java中密码比对用的是MD5加密而数据库存的是明文admin。解决用在线MD5工具如md5hashing.net生成admin的MD5值21232f297a57a5a743894a0e4a801fc3执行SQL更新UPDATE student SET password21232f297a57a5a743894a0e4a801fc3 WHERE student_idadmin;4.3 现象addstudent.jsp提交后页面空白数据库无新增记录原因AddStudentServlet.java中request.setCharacterEncoding(UTF-8)缺失中文姓名乱码导致student.setName(request.getParameter(name))返回null后续SQL插入NULL违反NOT NULL约束。解决在doPost方法第一行添加request.setCharacterEncoding(UTF-8);并在web.xml中全局配置过滤器见下节。4.4 现象courseInfo.jsp表格显示“???”乱码但数据库里中文正常原因JSP页面未声明字符集或Tomcat响应头未设置Content-Type。解决在courseInfo.jsp顶部添加% page contentTypetext/html;charsetUTF-8%并在web.xml中添加过滤器filter filter-nameCharacterEncodingFilter/filter-name filter-classfilter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping4.5 现象点击“删除学生”链接后URL变成http://localhost:8080/deleteStudent?id2023001但页面404原因web.xml中未配置DeleteStudentServlet的映射或Servlet类名拼写错误如DeleteStuServletvsDeleteStudentServlet。解决检查web.xml是否有对应servlet和servlet-mapping确认servlet-class路径与src/servlet/DeleteStudentServlet.java的包名一致如package servlet;则写servlet.DeleteStudentServlet。5. 论文与答辩PPT的实战复用把源码变成你的“原创内容”5.1 论文图表的逆向提取从JSP代码生成ER图和流程图别再手绘ER图用studentInfo.jsp和courseInfo.jsp的表单字段反推实体关系字段提取在addstudent.jsp中找到所有input namexxx列出student_id,name,gender,class_name,password→ 对应student表字段关系推导studentInfo.jsp中有a hrefselectCourse?student_id${stu.studentId}选课/a说明student_id是外键关联selection表生成ER图用draw.io导入doc/里的论文PDF用“Database ERD”模板按上述字段拖拽实体连线标注1:N一个学生可选多门课。技巧doc/论文中“系统测试”章节的截图直接用浏览器F12审查元素复制tableHTML代码粘贴到Word里转表格——比手敲快10倍。5.2 答辩PPT的代码截图规范让评委一眼看懂你的工作量答辩PPT里放代码不是贴整页LoginServlet.java而是聚焦你修改过的核心片段PPT页标题截图内容说明文字“密码安全加固”LoginServlet.java中DigestUtils.md5Hex(pwd)行高亮“采用MD5单向加密避免明文密码泄露风险”“选课逻辑优化”SelectionDAO.java中insertSelection()方法标红if (!isAlreadySelected())判断“增加重复选课拦截防止同一课程多次提交”“界面响应式适配”studentInfo.jsp中div classcontainer-fluid及Bootstrap栅格代码“基于Bootstrap 3.3.7重构前端支持手机端查看课程列表”后悔药答辩前用git init初始化本地仓库git add .后git commit -m initial commit之后每次改代码都git commit -m fix login bug。答辩时展示git log比说“我写了很久”更有说服力。5.3 毕设答辩高频问题预演用源码回答而不是背答案评委最爱问的三个问题答案全在源码里问题源码定位回答要点“为什么用JSP不用Spring Boot”doc/论文第2章“技术选型依据”“JSPServlet架构轻量学习成本低符合本科教学大纲对Web基础技术的考核要求且本系统功能明确CRUD为主无需Spring的复杂生态”“如何防止SQL注入”StudentDAO.java中PreparedStatement用法“所有用户输入均通过pstmt.setString()参数化绑定杜绝字符串拼接SQL已通过 OR 11等典型payload测试”“选课并发怎么处理”SelectionDAO.java中insertSelection()方法“采用数据库唯一约束student_idcourse_code联合主键插入失败时捕获SQLIntegrityConstraintViolationException返回友好提示”从那以后我每次帮学生改毕设都强制他们做完三件事第一用git log生成一份修改记录时间轴第二把web.xml里所有servlet-mapping抄到纸上默写一遍第三在DBUtil.java里加一行System.out.println(DB connected: url);启动时看到这行日志才算真正连通。这三步走完答辩时再问“系统怎么工作的”就能指着代码说“您看这里从这个URL进来走到这个Servlet查这张表最后渲染这个JSP”——不是背稿是真懂。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/30 1:21:30

IDEA配置Web项目全攻略:从JDK、Maven到Tomcat跑通完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:16:30

一键开关机芯片选型指南:四维度拆解与速查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 1:16:30

微信H5调用支付宝支付的合规实现方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 3:26:36

基于SpringBoot2与Vue3的课程答疑系统前后端分离实战

做课程答疑系统这件事,听起来不算新鲜,但真要把它做扎实,技术点一点都不少。我最近完成的一套 Java Web 课程答疑系统源码,选型是 SpringBoot2 Vue3 MyBatis-Plus MySQL8.0,前后端分离,带完整文档。这套…

2026/9/30 3:26:36

Unreal多线程编程指南:从FRunnable到Async的安全并发实践

做C游戏开发的,接触Unreal之后最先不习惯的,可能就是“线程不能随便开”。在传统C项目里写std::thread、std::async很自然,但在Unreal里,你要是真拿std::thread去跑一个循环,然后在这个线程里碰一下UObject、调一下引擎…

2026/9/30 3:26:36

微信小程序电影院订票选座系统:全栈开发与并发控制实战

在动手写这篇东西之前,我先交代一下背景:这套影院订票选座系统是我最近完整跑通交付的一套微信小程序全栈项目,源码、数据库脚本、接口文档、部署说明、调试记录,一个不落。之所以想把这个项目拆开来讲,是因为它麻雀虽…

2026/9/30 3:26:36

2025 PyCharm 安装与 Python 解释器配置避坑指南

上周有个朋友把 PyCharm 的安装包从某个网盘里拖了下来,装完之后发现解释器怎么都选不上,控制台里 python 命令跳转到了应用商店,折腾了两个小时才回头来找我。这种事我见过太多次——PyCharm 的安装流程本身不复杂,真正让人卡住的…

2026/9/30 3:21:36

Ubuntu 软件安装避坑指南:apt、deb、Snap 与源码编译

1. 为什么“装个软件”这件小事,在 Ubuntu 上能难倒一大批人我见过太多刚转到 Ubuntu 的人,第一反应都是抱着 Windows 的思维习惯:去浏览器搜“某某软件下载”,点进去找一个 exe 或者 dmg 文件,然后双击、下一步、完成…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑