简介这份资源是面向JavaWeb初学者与课程设计学生的《JavaWeb学生成绩管理系统》完整实战项目适合在掌握Servlet、JSP、JDBC等基础后通过一个真实可运行的系统把知识串联起来。项目采用MVC设计模式与动态代理模式基于Java与MySQL开发涵盖学生、成绩、课程、专业等核心业务模块可帮助读者理解分层架构、DAO实现与Action调度的完整流程。压缩包共271个文件约23.41MB包含32个java源码、32个class编译文件、22个jsp页面、78个jar依赖、20个xml配置以及js、css、图片等前端资源另附数据库sql脚本与说明文档结构完整便于对照学习。目前已有6978人学习下载适合作为课程设计、毕业设计或JavaWeb综合练习的参考案例读者可从中获取项目搭建思路、代码组织方式与常见功能实现方法。1. Java 学生成绩管理系统从一份 rar 压缩包到能跑起来的课程设计拿到「java 学生成绩管理系统(源码数据库脚本文档).rar」这种压缩包多数人第一反应是解压、找 main 方法、点运行然后被一堆红色报错劝退。这个标题背后其实是一套完整的课程设计交付物Java 源码负责业务逻辑数据库脚本负责建库建表文档负责说明设计思路和接口。它解决的是「不想从零写一个 CRUD 项目、又需要一份能讲清楚原理的作业」这个真实需求适合 Java 基础刚学完、要交课程设计或者准备面试八股文里「项目经历」那一段的人。我见过太多人把源码跑起来就完事结果答辩时被问「成绩表为什么这么设计」直接卡壳。这篇就按我实际拆包、改配置、跑通、再讲清楚每个环节的顺序写让你不光能跑还能说明白。2. 拆包先看结构源码、脚本、文档各管什么2.1 一个典型课程设计包的目录长什么样解压之后别急着用 IDEA 打开先在文件管理器里把目录树看一遍。常见的结构是三层最外层是项目名里面分src、sql、doc三个文件夹有的还会多一个lib放 jar 包。src下面是标准的 Java 包结构比如com.xxx.score再往下是entity、dao、service、controller、util这几个包。sql文件夹里通常只有一个.sql文件命名可能是score_db.sql或者init.sql。doc里放的是 Word 或 PDF内容一般是需求分析、E-R 图、表结构说明、接口列表。我一般会先打开sql文件扫一眼因为数据库结构决定了后面所有代码能不能跑通。重点看三件事建库语句的字符集是不是utf8mb4建表语句里有没有外键约束初始数据INSERT有没有包含中文。这三样任何一样出问题后面都会以各种奇怪的方式报错。2.2 源码里必须确认的四个文件在 IDEA 导入之前用文本编辑器打开这几个文件确认内容比导入后再排查省事得多。第一个是src根目录下的db.properties或jdbc.properties。里面是数据库连接四要素驱动类名、URL、用户名、密码。课程设计包里的密码经常是作者本机的比如root/123456你本机 MySQL 密码不一样就得改。第二个是pom.xmlMaven 项目或者lib文件夹普通项目。看依赖里有没有mysql-connector-java版本是多少。MySQL 8 以上必须用8.0.x的驱动用5.1.x会报Unknown system variable或者时区错误。第三个是web.xml或者 Spring Boot 的application.yml。这决定了项目是传统 Servlet 项目还是 Spring Boot 项目启动方式完全不同。第四个是util包里的DBUtil或BaseDao。这里能看到连接是怎么获取的是每次DriverManager.getConnection还是用了连接池。课程设计里手写DriverManager的居多这种写法在并发下会出问题但单机跑演示够用。# 在解压目录下快速定位关键文件 find . -name *.properties -o -name pom.xml -o -name *.sql -o -name web.xml # 查看 sql 文件前 50 行确认建库语句和字符集 head -50 sql/*.sql上面两条命令的作用是第一条把配置文件和脚本位置列出来避免在多层目录里迷路第二条直接看 SQL 开头确认CREATE DATABASE语句里的CHARACTER SET是不是utf8mb4。如果看到latin1或者没写字符集后面中文成绩单导出大概率乱码。提示如果sql文件里没有CREATE DATABASE语句只有USE xxx;说明作者假设你已经手动建了库。这种情况先自己建一个同名库字符集选utf8mb4再执行脚本。3. 数据库脚本怎么跑建库、建表、灌数据的顺序不能乱3.1 用命令行导入比图形化工具更可控很多人习惯用 Navicat 右键「运行 SQL 文件」但课程设计的脚本里经常有DROP TABLE IF EXISTS和CREATE TABLE混在一起图形化工具执行到一半报错就停了你也不知道哪句成功了。我一般用命令行因为报错会精确到行号。# 登录 MySQL 并指定字符集 mysql -u root -p --default-character-setutf8mb4 # 在 MySQL 交互界面里执行 source /path/to/score_db.sql;第一行命令的--default-character-setutf8mb4是关键参数它保证客户端发送和接收的数据都用 utf8mb4 编码。第二行source后面跟绝对路径Windows 下路径用正斜杠或者双反斜杠。执行完用SHOW TABLES;确认表都建出来了再用SELECT COUNT(*) FROM student;看初始数据有没有灌进去。如果脚本执行到一半报ERROR 1215: Cannot add foreign key constraint说明外键引用的字段类型或字符集不一致。常见原因是主表用utf8mb4从表用utf8或者主键是int而外键写成了bigint。解决办法是统一改成int和utf8mb4或者干脆在课程设计里去掉外键约束用程序逻辑保证一致性。3.2 表结构里必须看懂的三个设计点成绩管理系统的核心表一般就四张student、course、score、user。student存学号、姓名、班级course存课程号、课程名、学分score存学号、课程号、分数user存登录账号和角色。第一个设计点是score表的主键。有的作者用自增id做主键有的用(student_id, course_id)联合主键。联合主键的好处是天然防止同一个学生同一门课录两次成绩坏处是后面想改成绩得先删再插。我一般会保留联合主键但在service层加一个「先查后插或更新」的逻辑。第二个设计点是分数字段的类型。用int还是decimal(5,2)如果只存整数分tinyint就够如果要存 89.5 这种必须用decimal不能用float因为float在比较和求和时会出现89.499999这种玄学值。第三个设计点是user表的密码字段。课程设计里明文存密码的占多数这在实际项目里是血泪教训级别的错误。你可以在文档里说明「演示用明文生产环境应加盐哈希」答辩时反而是加分项。-- 检查表结构和字符集 SHOW CREATE TABLE score; -- 检查初始数据的中文是否正常 SELECT * FROM student LIMIT 5;第一条语句会输出完整的建表语句重点看ENGINEInnoDB和DEFAULT CHARSETutf8mb4。第二条看姓名列有没有变成问号如果有说明导入时字符集没对上需要重新用--default-character-setutf8mb4导入。4. 源码跑起来从导入 IDEA 到登录成功的完整路径4.1 普通 Java Web 项目和 Spring Boot 项目的启动差异先判断项目类型。如果根目录有pom.xml且src/main/java下有带SpringBootApplication注解的类就是 Spring Boot 项目直接运行那个类即可。如果根目录有web文件夹或者WebContent并且有web.xml就是传统 Servlet 项目需要配置 Tomcat。Spring Boot 项目的配置文件通常是application.properties或application.yml里面数据库连接写法和db.properties略有不同。重点看spring.datasource.url里的时区参数MySQL 8 必须加serverTimezoneAsia/Shanghai否则启动时报The server time zone value错误。传统 Servlet 项目在 IDEA 里的配置步骤File→Project Structure→Modules→ 选中项目 →Sources标签页把src标记为 Sources Root再到Facets里添加 Web指定web.xml路径最后到Artifacts里添加Web Application: Exploded输出目录选target/项目名。Tomcat 配置里 Deployment 选这个 Artifact。!-- 传统项目 web.xml 里必须有的 servlet 映射示例 -- servlet servlet-nameLoginServlet/servlet-name servlet-classcom.xxx.score.controller.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mapping上面这段配置的作用是把/login这个 URL 映射到LoginServlet类。如果web.xml里没有这段访问登录页面会报 404。参数说明servlet-name可以随便起但要和servlet-mapping里的一致servlet-class必须是完整包名加类名url-pattern决定浏览器访问的路径。4.2 登录跑通后先别急着点其他菜单登录成功只说明数据库连接和用户表没问题。接下来按「学生管理 → 课程管理 → 成绩录入 → 成绩查询」的顺序逐个点。每点一个菜单看 IDEA 控制台有没有异常堆栈。常见的报错和对应原因NullPointerException出现在service层多半是dao查询返回了null而service没做判空。比如查一个不存在的学号studentDao.findById返回null后面直接调student.getName()就崩了。SQLSyntaxErrorException说明 SQL 语句拼错了。课程设计里用字符串拼接 SQL 的很多比如SELECT * FROM student WHERE name name 如果name里带单引号就会报语法错误。这也是 SQL 注入的入口答辩时被问到可以主动说「这里应该用 PreparedStatement」。ClassNotFoundException: com.mysql.cj.jdbc.Driver说明驱动 jar 没放到WEB-INF/lib下或者 Maven 依赖没刷新。传统项目必须手动把mysql-connector-java-8.0.x.jar复制到web/WEB-INF/lib目录IDEA 的 Artifact 才会把它打进部署包。// 一个典型的 DAO 查询方法注意 PreparedStatement 的用法 public Student findById(int id) { String sql SELECT * FROM student WHERE id ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, id); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { Student s new Student(); s.setId(rs.getInt(id)); s.setName(rs.getString(name)); return s; } } } catch (SQLException e) { e.printStackTrace(); } return null; }这段代码的逻辑是用?占位符代替字符串拼接通过ps.setInt(1, id)把参数传进去这样即使id是特殊字符也不会破坏 SQL 结构。参数说明1表示第一个问号的位置从 1 开始计数rs.getString(name)里的name必须和数据库列名完全一致大小写不敏感但拼写不能错。返回null表示没查到调用方必须判空。5. 避坑与排查课程设计包里最常见的五个翻车点5.1 中文乱码从数据库到浏览器要过四道关现象学生姓名在数据库里看是正常的但在网页上显示成??或者æŽå¥½。原因字符集在四个环节可能不一致——数据库建库时用了latin1、JDBC URL 没加characterEncodingutf8、Tomcat 的server.xml里 Connector 没加URIEncodingUTF-8、JSP 页面没写% page contentTypetext/html;charsetUTF-8 %。解决按顺序检查这四处。数据库用SHOW CREATE DATABASE 库名;确认JDBC URL 改成jdbc:mysql://localhost:3306/score_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiTomcat Connector 加URIEncodingUTF-8JSP 页面头部加 page 指令。四道关都过了中文就不会乱。5.2 驱动版本不匹配MySQL 8 配 5.1 驱动必报错现象启动时报Unknown system variable query_cache_size或者The server time zone value ?D1ú±ê×?ê±?? is unrecognized。原因MySQL 8 的默认认证插件是caching_sha2_password而mysql-connector-java 5.1.x不支持这个插件。时区错误则是因为 8.0 驱动要求显式指定时区。解决把驱动换成mysql-connector-java-8.0.28或更高版本JDBC URL 加上serverTimezoneAsia/Shanghai。如果不想换驱动也可以在 MySQL 里执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码;把认证插件改回旧的但不推荐因为新项目迟早要升。5.3 端口占用Tomcat 启动一半就停现象IDEA 控制台显示Address already in use: JVM_BindTomcat 启动失败。原因8080 端口被其他程序占了常见的是另一个 Tomcat 实例、或者某个后台服务。解决Windows 下netstat -ano | findstr 8080找到 PID再到任务管理器结束进程。或者直接改 Tomcat 的conf/server.xml把 Connector 的port8080改成8081。改完记得 IDEA 里 Deployment 的 URL 也要跟着改。5.4 外键约束导致删数据失败现象删除一个学生时报Cannot delete or update a parent row: a foreign key constraint fails。原因score表里有这个学生的成绩记录外键约束阻止删除。解决两种思路。一是先删score里对应记录再删student在service层用事务包起来。二是建表时把外键写成ON DELETE CASCADE删学生时自动删成绩。课程设计里我倾向第一种因为能体现你懂事务答辩时有的说。5.5 文档和代码对不上E-R 图里的字段在表里找不到现象文档里写student表有email字段但实际建表语句里没有导致注册功能报错。原因作者先写文档后改代码或者反过来两边没同步。解决以代码为准把文档里的字段说明改成和SHOW CREATE TABLE输出一致。如果代码里确实需要email就手动ALTER TABLE student ADD COLUMN email VARCHAR(50);。答辩前一定把文档和实际表结构对一遍被老师发现不一致很尴尬。6. 把课程设计变成面试素材三个能讲深的改造点跑通只是及格线。如果你想让这个项目在面试里撑起十分钟的「项目经历」环节得做三处小改造每处都能引出一个八股文考点。第一处改造把DBUtil里的DriverManager换成 Druid 连接池。加一个druid.properties用DruidDataSourceFactory.createDataSource创建数据源。这样面试官问「数据库连接池原理」时你可以从「频繁创建销毁连接的开销」讲到「Druid 的保活和监控」。改造代码不超过二十行但话题深度完全不一样。第二处改造给成绩录入加事务。在service层的方法上加TransactionalSpring 项目或者手动conn.setAutoCommit(false)commit/rollback传统项目。面试官问「Java 怎么保证数据一致性」时你可以从「成绩录入要同时写score表和更新student表的学分绩点」这个场景切入讲 ACID 和隔离级别。第三处改造把登录密码从明文改成 MD5 加盐。在user表加一个salt字段注册时生成随机盐存MD5(password salt)。登录时用同样的盐算一遍再比对。面试官问「密码怎么存才安全」时你可以顺势聊到彩虹表、哈希碰撞、为什么 MD5 不够要用 bcrypt。// 加盐 MD5 的简单实现课程设计够用 public static String md5WithSalt(String password, String salt) { try { MessageDigest md MessageDigest.getInstance(MD5); md.update((password salt).getBytes(StandardCharsets.UTF_8)); byte[] digest md.digest(); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(MD5 算法不可用, e); } }这段代码的逻辑是把密码和盐拼接后做 MD5输出十六进制字符串。参数说明password是用户输入的原始密码salt是每个用户独立的随机字符串存在user表的salt列。String.format(%02x, b)保证每个字节输出两位十六进制不足补零。注意 MD5 在安全领域已经不够强但课程设计里用来演示「加盐」这个概念足够了。我自己的习惯是每拿到一个课程设计包先花二十分钟把上面三处改造做完再开始写文档。这样文档里的「系统优化」章节有真东西可写答辩时老师问「你这个和别人的有什么不同」也有话可说。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
VoiceStudio:从TTS到音色克隆的本地语音合成工作台全解析 做播客、做短视频、做有声书的人应该都有同感:录音是最磨人的环节。嗓子状态、房间底噪、口误重来,一天下来可能只录出十分钟能用的干音。VoiceStudio这个项目就是冲着这个痛点去的——把语音合成、音色克隆、批量配音还有后期处理串成一条完整的自动化流… · 2026/11/2 14:47:05
测试用例总结实战:从需求映射到覆盖度矩阵的完整指南 1. 测试用例到底在解决什么问题做软件测试这行十来年,我见过太多团队把测试用例写成“操作说明书”——点这里、填那里、看结果对不对。这种写法本身没错,但它只解决了“怎么点”的问题,没解决“为什么点”和“点漏了怎么办”的问题。测试用例… · 2026/11/2 14:47:05
Vue3+Vite5集成Cesium的完整实践指南 1. 项目概述 最近在开发一个WebGIS项目时,需要将Cesium集成到Vue3Vite5的技术栈中。作为一个长期从事前端GIS开发的工程师,我发现网上很多教程都存在配置不全、版本不兼容等问题,导致新手在实际操作中频频踩坑。本文将分享我在项目中总结出的… · 2026/11/2 14:46:04
解决html2canvas图片模糊的实用方案 1. 为什么html2canvas生成的图片会模糊?这个问题困扰过几乎所有使用过html2canvas的开发人员。当你满心欢喜地想把精心设计的页面元素转换为图片时,却发现生成的图片像打了马赛克一样模糊不清,这种体验确实令人沮丧。造成模糊的根本原因在于h… · 2026/11/3 4:57:53
MCP实战:用Claude读取Figma设计稿,高效还原Vue页面 做前端最烦的一件事就是“照着设计稿还原Vue页面”。设计师在Figma里排得漂漂亮亮的间距、颜色、阴影,到了代码里全靠肉眼量,量错一个8px,验收时又要来回改。我最近把Figma MCP这套流程完整跑了一遍,用Claude直接读取设计稿的图层… · 2026/11/3 4:57:53
Vue多项目同端口部署方案与配置实践 1. 为什么需要多项目同端口部署?在前后端分离架构中,Vue.js项目通常需要与后端API服务协同工作。当企业级应用中存在多个前端项目时,传统做法是为每个项目分配不同端口,但这会带来诸多问题:端口资源消耗:每… · 2026/11/3 4:57:53
AI算力租赁预算测算与GPU选型避坑指南 AI算力租赁这两年算是给中小企业开了个方便之门:不用一次性砸几十万买显卡,按小时付费就能跑起大模型微调、深度学习训练这些重型计算任务。但方便是方便了,真到自己下单的时候,很多人第一反应是懵的——该租多大的卡?… · 2026/11/3 4:57:53
高并发点评系统架构设计与Redis优化实践 1. 项目背景与核心价值"黑马点评"作为一款典型的本地生活服务类应用,其技术实现涉及高并发、分布式、缓存优化等互联网行业的经典技术难题。这个项目之所以成为众多开发者学习的标杆案例,关键在于它完整呈现了一个商业化应用从架构设计到具体实… · 2026/11/3 4:56:53
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18