Java Web学生成绩管理系统:Servlet+JSP+JDBC三层架构全拆解

📅 发布时间:2026/10/4 16:22:46
Java Web学生成绩管理系统:Servlet+JSP+JDBC三层架构全拆解
简介基于Java的Web学生成绩管理系统压缩包面向高校Java课程设计、毕业设计及Web入门开发者提供了一套完整的可运行项目。项目基于Servlet、JSP、JDBC与MVC模式构建涵盖学生信息管理、成绩录入修改、查询筛选、统计排序等典型功能并配有MySQL数据表设计适合学习Java Web分层开发与数据库交互。压缩包共36个文件包含10个Java源码、9个JSP页面、10张运行界面截图以及XML配置、MF清单、README说明等整体2.94MB目录结构清晰便于按WebRoot、src等模块对照学习。目前已有34人浏览学习。通过源码和截图读者可以快速理解前后端交互逻辑、JDBC持久化写法及页面样式还可直接部署到Tomcat运行验证作为课程项目或二次开发的基础。1. 一套Java Web学生成绩管理系统比你想的要耐拆技术圈里有个不成文的规律越“基础”的项目越能看出一个人对Java Web的底子。学生成绩管理系统这个题目在课设清单里出现的频率常年排前几网上各种版本也多但大多数要么缺数据库、要么缺截图、要么代码和页面对不上。这套zip可贵在它把源码、配置、九张运行界面截图、数据表设计图一股脑打包好了解压就是一个完整web工程不是半成品。对三类人有直接价值正在做Java课设、需要一套能跑通做底稿的在校生学了Servlet和JSP但还没跑通过完整项目的Java Web新手以及想把课设整理成面试能讲的“亲手写的项目”的求职者。这篇笔记我就按拆包的顺序把目录结构、部署流程、数据库设计、筛选统计逻辑、运行期的坑一条条讲清楚你照着走一遍大概率一小时内能看到首页。2. 拆开java0323Servlet JSP JDBC的目录骨架与MVC落点2.1 先认清包里每层目录是干嘛的解压后顶层目录叫java0323这个目录名在导入IDE时会变成项目名后面部署访问路径也跟它有关。用tree命令看一层结构java0323 ├── src │ └── stuPackage # Java源码都在这个包下 ├── WebRoot # Web应用的根目录 │ ├── WEB-INF │ │ └── web.xml # Servlet映射、欢迎页配置 │ ├── index.jsp # 系统入口页 │ ├── JSP # 各业务功能页面 │ ├── IMG # 页面里用的静态图片 │ └── META-INF # 容器相关配置 ├── 运行界面截图 # 九张验收截图相当于交付标准 ├── .gitignore └── README.md这个结构和Eclipse默认的Dynamic Web Project布局完全一致src放Java类WebRoot放JSP和静态资源。imports进IDE时直接认这个结构不需要额外转换。stuPackage里基本是按职责命名的类Controller类的Servlet、操作数据库的DAO、承载数据的JavaBean类名后缀一眼能分辨这就是标准的MVC落法——Controller用ServletModel用JavaBean加DAOView用JSP。2.2 web.xml里藏着系统入口和Servlet分发规则WEB-INF/web.xml是这个工程的行为说明书。先看欢迎页和Servlet映射这两个关键配置web-app welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list servlet servlet-namescoreServlet/servlet-name servlet-classstuPackage.ScoreServlet/servlet-class /servlet servlet-mapping servlet-namescoreServlet/servlet-name url-pattern/score/url-pattern /servlet-mapping /web-appwelcome-file-list决定了访问http://localhost:8080/java0323/时默认打开的是index.jsp它是学生成绩管理系统的门面页面上的入口链接再指向具体功能。servlet-mapping则是把/score这样的URL路径绑定到stuPackage.ScoreServlet这个Java类上。这里要注意上面的类名和映射路径是这套系统最常见的写法具体你的包里的web.xml叫什么以你下载后看到的为准但阅读方法是一样的想改URL风格改这个文件比改Java代码更直接。2.3 代码分层谁在处理请求谁在读写数据库谁在渲染页面对照JSP目录里的页面名和截图文件名能看出功能划分查询页面负责录入学号或姓名条件录入或修改页面负责新增与更新成绩成绩筛选页面是带排序条件的列表成绩统计页面展示聚合结果。每张JSP提交表单后请求落到对应ServletServlet再调DAO层去查MySQL最后把结果set到request或session里forward回JSP渲染。这套结构的典型流转是JSP发请求 → Servlet接收并解析参数 → DAO拼接SQL、执行JDBC → 返回ResultSet封装成JavaBean列表 → Servlet把列表放进request作用域 → JSP用Java代码或EL表达式循环输出表格。没有框架包装的情况下每一行数据都要程序员自己搬这恰恰是Java基础还不牢的人最该反复读的部分。我一般建议新手把这个工程当“三层结构的活体标本”看先在纸上画出请求到底走了几个Java类再对照代码验证比看十篇架构文章都管用。2.4 运行界面截图是现成的验收单这套包特别实在的一点是把运行界面截图单独列了一个目录系统首页、查询页面、查询结果、录入或修改页面、录入后的提交结果、成绩筛选页面、降序排列结果、成绩统计页面、数据表设计九张图对应九个功能节点。你跑起来之后不需要自己编测试用例照着截图一张张对页面长得一样、按钮能用、排序结果一致说明部署成功对不上说明数据库或环境有偏差。这个验收方法做课设和改别人的老代码都一样好用省得自己瞎猜功能到底有没有生效。3. 完整部署流程从JDK、Tomcat到MySQL的一小时闭环3.1 环境选型老项目对JDK版本最敏感跑这种基于Servlet/JSP的老工程环境版本不能盲目追新要按兼容性来搭配。下面这组是我试过比较稳的组合组件推荐版本说明JDK1.88u202以上老代码用JDK 8编译最稳JDK 17以上容易遇到javax包被移除的问题Tomcat8.5或9.0支持Servlet 3.1/JSP 2.3跑课设绰绰有余MySQL5.7或8.0连接驱动类名不同后面避坑章节重点讲IDEEclipse或IDEA均可2024版的IDEA建新Web项目反而麻烦但导入老项目没问题如果你装了JDK 17以上的版本编译下载下来的源码时如果报找不到javax.servlet包先别怀疑代码有问题八成是Tomcat的servlet-api.jar没加到构建路径或者JDK太高导致环境不兼容。老老实实装一个JDK 8能省掉后面一大半莫名其妙的错。3.2 导入IDEEclipse和IDEA各自的操作路径Eclipse这边走File → Import → Existing Projects into Workspace目录选中解压出来的java0323等它识别出项目就导入。IDEA那边选File → New → Project from Existing Sources导入类型选Eclipse之后一路Next源码目录会被识别为Source Root。导入完成后第一件事是确认Java编译环境右键项目 → Build Path → Configure Build Path把Compiler compliance level改成1.8再把Tomcat运行时Server Runtime加到Libraries里否则会报javax.servlet不存在。这一步是新手最常漏的漏了的症状是大量红叉但不是代码写错而是项目没关联上运行容器。3.3 数据库连接串改四个参数就能跑代码里一定有个负责拿数据库连接的工具类通常在stuPackage下叫DBUtil或DBConnection之类。它的核心逻辑长这样package stuPackage; import java.sql.Connection; import java.sql.DriverManager; public class DBUtil { // 四要素地址、库名、用户名、密码 private String url jdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private String user root; private String password 123456; public Connection getConnection() throws Exception { Class.forName(com.mysql.cj.jdbc.Driver); return DriverManager.getConnection(url, user, password); } }四个参数要按你的实际环境改3306是MySQL默认端口没改过就不用动student_db是数据库名建库时保持一致user和password务必改成你自己的MySQL账号。url里那三个参数很关键——useSSLfalse关掉SSL握手减少不必要的报错serverTimezoneAsia/Shanghai解决MySQL 8.x的时区问题characterEncodingutf8保证中文不乱码。这三个参数缺一个后面都可能在“玄学报错”上折腾半小时。3.4 启动前先建库跑起来后对照验收在MySQL里创建数据库命令很简单CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;新建好库之后把数据表设计截图对应的建表语句和数据导进去第4章会给具体结构。然后右键Eclipse里的项目 → Run As → Run on Server选你配置好的TomcatIDEA里则配置Tomcat运行方式Deployment里把项目以war exploded方式挂上去。启动日志出现“Server startup in xxxx ms”后浏览器访问http://localhost:8080/java0323/index.jsp注意这个路径的大小写和部署名要跟项目名完全一致Tomcat对大小写敏感Index.jsp写成index.jsp也会404。看到首页后就按截图清单过一遍查询一个学生成绩、改一个分数点提交、按成绩降序筛选、打开统计页四步都通过这个系统就正式跑起来了。4. 反推数据库设计成绩降序筛选与统计背后的SQL4.1 从截图和数据表设计.jpg反推表结构下载包里有一张数据表设计.jpg和一张数据表内容.jpg这两张图基本暴露了系统核心设计。学生成绩管理系统哪怕功能再花哨核心也逃不开两张表学生信息和成绩记录。一张典型的设计是这样表名字段类型约束说明studentsnovarchar(20)主键学号studentsnamevarchar(50)非空姓名studentssexvarchar(4)性别studentsclassvarchar(30)班级scoreidint自增主键记录编号scoresnovarchar(20)外键→student.sno学号scoresubjectvarchar(50)非空课程名scorescoredecimal(5,2)非空成绩保留两位小数把学号设成varchar而不是int是很多课设容易忽略的细节。学号常见有前导零比如20230001int类型会把0吃掉而且学号只用来标识身份不需要参与算术运算varchar完全够用还能兼容字母和数字混合的编号。成绩字段用decimal(5,2)能存最大999.99分对百分制课程成绩绰绰有余。4.2 建表SQL外键先建被引用表建表顺序有讲究必须先建student再建score因为score的sno外键引用了student的sno。实操SQLCREATE TABLE student ( sno VARCHAR(20) PRIMARY KEY, sname VARCHAR(50) NOT NULL, ssex VARCHAR(4), sclass VARCHAR(30) ); CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, sno VARCHAR(20) NOT NULL, subject VARCHAR(50) NOT NULL, score DECIMAL(5,2) NOT NULL, FOREIGN KEY (sno) REFERENCES student(sno) );AUTO_INCREMENT让id自动生成省得程序里手动维护编号。外键约束保证了成绩表里不会出现不存在的学号——但反过来如果你录入成绩时学生还没录进student表就会报外键失败这也是个常见翻车点后面避坑章节会说。想验证数据是否导对了执行SELECT * FROM score; 应该能看出和截图“数据表内容.jpg”一致的记录数。4.3 筛选页的降序逻辑ORDER BY和WHERE的配合截图里有一张“成绩筛选结果按查询成绩降序排列”这个功能对应的SQL核心是ORDER BY子句SELECT s.sno, s.sname, sc.subject, sc.score FROM student s JOIN score sc ON s.sno sc.sno WHERE s.sclass 计科2301 ORDER BY sc.score DESC;DESC是从高到低ASC是从低到高默认是ASC。这里有个实际经验如果筛选结果里同分的记录很多排序顺序会不稳定肉眼看着像“乱序”。解决方法是加第二排序键比如ORDER BY sc.score DESC, s.sno ASC让同分的人按学号再排一次结果就完全可预期了。JSP页面里一般是把这个SQL字符串按用户选择的排序方向动态拼接懂了这个规律改排序逻辑就是改一个单词的事。4.4 统计页面的聚合函数平均分、最高分、最低分一次查完成绩统计页面不需要在Java里做循环求和SQL聚合函数可以直接算SELECT sc.subject, COUNT(*) AS cnt, ROUND(AVG(sc.score), 2) AS avg_score, MAX(sc.score) AS max_score, MIN(sc.score) AS min_score FROM score sc GROUP BY sc.subject;GROUP BY subject让每门课独立成一行COUNT数记录条数AVG求平均MAX和MIN取最高最低。ROUND(…, 2)是保留两位小数避免算出无限小数位。这个查询结果集合正好对应统计页面上的表格。这套简单的聚合逻辑在你今后做报表类功能时照样直接套用属于“学一次用很久”的SQL套路。5. 避坑清单五个在部署运行期最真实的翻车点5.1 ClassNotFoundExceptionMySQL驱动类名跟版本走现象启动Tomcat后一旦页面触发数据库操作后台日志抛java.lang.ClassNotFoundExceptioncom.mysql.jdbc.Driver。原因MySQL 8.x的驱动包把类名从com.mysql.jdbc.Driver迁移到了com.mysql.cj.jdbc.Driver老代码里如果写的是旧类名在MySQL 8环境里就找不到类。解决看看lib目录或WEB-INF/lib里的mysql-connector-java.jar是什么版本。如果是8.x把代码里的Class.forName改成com.mysql.cj.jdbc.Driver如果你是MySQL 5.7则保持旧的类名。注意改完要重新部署一次别只保存不重启。5.2 Communications link failure时区参数缺失和MySQL连接超时现象页面上点击查询界面卡几秒后报Communications link failure或The server time zone value ‘йʱ’ is unrecognized。原因MySQL服务器和JDBC驱动之间的时区信息没对齐。8.x之后驱动对时区要求严格连接串里没指定serverTimezone就会被拒绝另外MySQL空闲连接超时wait_timeout默认8小时也会触发连接失效。解决连接串加上serverTimezoneAsia/Shanghai并建议加上autoReconnecttrueconnectTimeout5000socketTimeout5000让连接更抗造。改完重启Tomcat。这个报错中段乱码是编码问题不影响排查不用慌。5.3 8080端口被占用改端口比杀进程更省事现象启动Tomcat时直接报Port 8080 required by Tomcat v9.0 Server at localhost is already in useWindows下还可能弹窗问是否强制终止进程。原因本机某程序常见的有别的Tomcat实例、Nginx、或者某些开发工具自带的代理已经占用了8080。解决两个思路。杀进程用netstat -ano | findstr :8080查出PID再taskkill /PID /F。但更推荐改Tomcat的端口打开Tomcat安装目录conf/server.xml找到Connector port8080改成8081重启后访问路径也对应改成http://localhost:8081/java0323/index.jsp。改端口不影响功能以后调试互不干扰。5.4 中文乱码三处编码必须统一现象页面显示学生姓名或课程名变成一串“???”或录入中文后数据库里存成乱码。原因请求编码、JSP页面编码、数据库编码三处不一致。最常见的是JSP没写pageEncoding或者数据库建库时没指定utf8导致写入时被转成了latin1。解决三处统一UTF-8。JSP顶部写% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %数据库建库时用第3章的CREATE DATABASE语句带DEFAULT CHARSET utf8连接串里带characterEncodingutf8。如果已经存了乱码数据先删掉再重新录入别只改一处改了也不生效。5.5 Statement拼接SQL能跑但会被面试官追问的隐患现象代码里出现类似executeQuery(SELECT * FROM score WHERE sno sno )的写法。这其实不算“运行翻车”但属于“面试翻车”——面试官看到这种拼接一定会问SQL注入的问题。原因把外部输入直接拼进SQL字符串等于让用户输入变成代码的一部分。比如学号输入一个’ OR ‘1’’1整个查询条件就被绕过了。老课设代码里这种写法很常见因为它直观、好写。解决改用PreparedStatement占位符这也是第6章要做的第一项改造。虽然课设运行环境里未必真的被攻击但把这条记在避坑清单里是因为大多数面试和答辩追问都从这里开始。6. 把课设升级成面试作品三项低成本改造与回归验证6.1 加一个统一编码过滤器乱码问题的根本解不在每个JSP页面上写pageEncoding而是用一个Filter拦下所有请求统一设置编码。新建stuPackage.EncodingFilter实现javax.servlet.Filter接口package stuPackage; import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); res.setContentType(text/html;charsetUTF-8); chain.doFilter(req, res); } }然后在web.xml里注册它映射路径写/*表示所有请求都过这道过滤器。chain.doFilter是关键它把请求放行给后续的Servlet和JSP。这个类一加上“每页写编码”的重复劳动直接清零代码看起来也比原来专业一截。6.2 把Statement换成PreparedStatement改造前是字符串拼接改造后是占位符参数。先看对比// 改造前拼接危险 Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery( SELECT * FROM score WHERE sno sno ); // 改造后占位符安全 PreparedStatement ps conn.prepareStatement( SELECT * FROM score WHERE sno ?); ps.setString(1, sno); ResultSet rs ps.executeQuery();PreparedStatement会把参数值当作纯数据传给数据库再特殊的内容也只会被当字符串处理不会改变SQL结构。而且它对SQL做了预编译同一个SQL重复执行时性能更好。把项目里所有拼接的地方都改成这个风格然后重新跑一遍所有页面功能应该完全不变。6.3 回归验证三步与面试怎么讲改造完不能直接拿去答辩先走一遍回归第一步重启Tomcat后逐张页面点击查询、录入、修改、筛选降序、统计五项全过第二步在学号输入框里输入一个包含单引号和or的测试串看程序是否像改造前一样返回数据返回了说明还有漏洞漏改第三步录入一条带中文的测试成绩再查出来确认显示正常。三步都过就可以放心拿它当面试里的“亲手完成的项目”来讲了。面试时讲的顺序建议是先说业务背景——学校需要一套Web成绩管理系统教师录入、学生查询、按成绩排序筛选、统计均分最值再说技术选型——Servlet JSP JDBCMySQL持久化Tomcat部署采用MVC分层最后主动提一句“我在DAO层用了PreparedStatement防止SQL注入并加了统一编码过滤器处理中文”这比单纯背Java面试题有力得多因为它是你项目里真实存在的代码。从那以后我每次拿到一套现成的Java Web老项目都强制先建库、再核对连接串、最后才启动Tomcat这个顺序帮我避开过至少三次白折腾。希望帮到你。本文还有配套的精品资源点击获取