尧图精选

JSP小学家校作业帮系统:源码部署、避坑与二次开发指南

🕒 发布时间:2026/10/2 2:36:37 📁 来源:尧图网络
简介这是一套基于Java Web技术开发的小学家校一体化作业管理项目适合毕业设计参考与初中级Java学习者实践。系统以JSP为核心实现教师发布作业、家长查看与反馈、作业提交批改等流程覆盖用户登录、班级管理、作业管理等常见业务模块。压缩包共773个文件、55.8MB其中包含99个java源码文件、164个js脚本、44个vue组件、53个css样式、36个html页面另有数据库初始化sql、工程配置文件及mp4演示视频源码结构清晰便于按模块阅读与二次开发。自带演示视频可快速了解系统操作流程整体兼具教学与实战价值已有201人浏览学习。1. 这套JSP“作业帮”到底是什么先看它能帮你解决什么如果你是做“基于JSP的毕设选题”或者正在找一份能直接交差的 JavaWeb 课程设计案例源码那这套“JSP小学家校一体‘作业帮’系统源码演示视频”十有八九在你手上。它解决的并不是那个做习题的手机 App而是一个典型的小学家校场景老师布置作业学生在网上看到并提交家长下班后能查看自己孩子的作业完成情况。整个系统用传统 JSP Servlet MySQL 实现浏览器直接访问不需要复杂的分布式架构。很多人第一次打开这种“.rar 源码包”会犯迷糊原因不是代码读不懂而是不知道从哪里开始是先看演示视频还是先配环境是先导入工程还是先建数据库这套项目看起来功能不算少但真正跑起来通常只要一条链路装好 JDK/Tomcat/MySQL导入源码执行 SQL改数据库连接然后启动服务。只要这条链不卡住后面所有页面都能点开。熬过毕业设计答辩或者期末验收的朋友应该都有同感这类项目最大的价值不在算法而在于它把 JSP 页面、Servlet 控制器、JDBC 数据库操作、Session 登录态这些考点全串起来了。对新手来说它是一份能“照着改”的实验手册对工作几年的老手来说它又是一块能快速二次开发、接进自己毕业设计方案的底盘。本文不会假装看过你手里那份源码的每一个字节而是按这门课最常见的工程做法把从解压到跑通再到避坑的完整路径给你铺好。2. 为什么是 JSP 而不是 Spring Boot技术选型与源码包结构摸底2.1 从“作业帮”需求反推技术栈这个项目的需求边界很清晰教师端要发布作业、批改状态学生端要查看作业、提交内容家长端要登录后看自己孩子的作业记录。三个角色三类页面外加登录过滤、数据库读写就这么大。你可以用 Spring Boot 做也能用 Vue 前后端分离做但这个标题叫“JSP 系统”说明作者选的是最传统、也最适合课堂教学的 JavaWeb 路线。为什么不用 Spring Boot 2 集成 JSP不是说不行而是 Spring Boot 集成 JSP 的目录结构很别扭官方默认不支持 JSP必须手动加spring-boot-starter-tomcat还要把 JSP 放到src/main/webapp/WEB-INF/jsp下面打包成 war 后才能访问。一个毕业设计如果被这些配置卡住就会偏离“把作业帮功能做出来”这件事。而传统 JSP 项目打包 war 后丢进 Tomcat 的webapps目录启动就能访问逻辑直白源代码包也更容易被老一代开发工具识别。还有朋友会问“nginx 支持 JSP 吗”答案是 nginx 本身不处理 JSPJSP 后缀的请求必须转发给 Tomcat 这种 Servlet 容器你通常只在集群部署时用 nginx 做动静分离。一个单体课程设计项目没有必要上 nginx直接用 Tomcat 的 8080 端口访问即可。理解了这一点你就知道这份源码包里的核心不是炫技而是把 Servlet、JDBC、JSP 标签这几样基本功铺平。2.2 拿到源码包后的目录结构清单解压.rar后不管作者具体怎么组织一个合格的 JavaWeb 课程设计项目通常包含四块内容源代码工程、数据库脚本、说明文档、演示视频。演示视频放在根目录下一般能看到功能演示和登录页操作数据库脚本通常是.sql文件文件名一般叫homework_system.sql或db_homework.sql。源代码工程常见有两种组织方式。一种是 Eclipse 的老式布局HomeworkHelp/ ├── .classpath ├── .project ├── src/ │ ├── com/example/dao/ // JDBC 数据访问层 │ ├── com/example/servlet/ // Servlet 控制器 │ ├── com/example/entity/ // 实体类 │ └── com/example/util/ // DBUtil 等工具类 ├── WebRoot/ │ ├── index.jsp │ ├── WEB-INF/ │ │ ├── web.xml │ │ └── lib/ // MySQL 驱动 JAR 包 │ ├── css/ │ ├── js/ │ └── jsp/ // 作业列表、学生端、家长端页面 └── homework_system.sql还有一种是 Maven 结构homework-help/ ├── pom.xml ├── src/main/java/ ├── src/main/resources/ └── src/main/webapp/拿到包后第一件事不是打开视频而是确认它是 Eclipse 工程还是 Maven 工程。看根目录有没有.project、.classpath或者有没有pom.xml。如果两个都没有说明作者把源码压缩得比较随意你就需要自己新建一个 Web 项目再把.java和.jsp复制进去这个操作会在第 3 章详细讲。2.3 看清三层结构JSP、Servlet、JavaBean 各管什么这套系统能跑起来靠的是 JSP Servlet JavaBean 的经典 MVC 分层。理解这个分层后你改任何功能都不会拿错文件。JSP 负责显示像student_homework.jsp、parent_view.jsp这种页面文件主要写在% %里调用 JavaBean 获取数据再用 HTML 渲染表格。Servlet 负责接收请求例如访问AddHomeworkServlet就处理作业发布访问LoginServlet就处理登录。JavaBean 通常是一组实体类比如Homework.java对应作业表Student.java对应学生表负责把数据库记录包装成内存对象。一个最关键的习惯看到页面路径里有/servlet/AddHomeworkServlet这样的访问地址别去 JSP 里找业务逻辑先去src目录找同名 Servlet 类。反过来看到 JSP 页面顶部有jsp:useBean标签去实体类里找它的属性和 getter/setter。示例代码不需要复杂下面是最典型的 Servlet 路由写法WebServlet(/addHomework) // 注意这是 Servlet 3.0 的注解方式 public class AddHomeworkServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String title request.getParameter(title); String content request.getParameter(content); // 后续代码会把 title/content 写入 HomeworkDao response.sendRedirect(homeworkList); } }这里WebServlet替代了老版web.xml中的servlet-mapping。如果你的源码包用的是web.xml配置那就在WEB-INF/web.xml里找url-pattern效果一样。厘清这条路径后第 3 章的部署基本就不会因为“访问地址 404”而卡住。3. 把源码跑起来环境配置、数据库初始化与 Tomcat 部署3.1 环境版本怎么配不踩雷一个 JSP 老项目能不能跑版本匹配比代码本身更关键。下面的组合是经过大量课程设计和交接项目验证的不会因为兼容性问题翻车组件推荐版本踩坑提醒JDKJDK 8 或 JDK 11JDK 17 也能跑但个别老 Tomcat 启动会报反射权限问题TomcatTomcat 8.5 或 Tomcat 9.0Tomcat 10 把javax.servlet改成jakarta.servlet老源码大概率启动失败MySQLMySQL 5.7 或 MySQL 8.0MySQL 8 要换com.mysql.cj.jdbc.Driver开发工具Eclipse 2022 或 IntelliJ IDEA 2021IDEA 社区版跑 Web 项目麻烦一点最好用专业版如果你已经装了 JDK 17又不想重装系统先试启动如果报java.lang.IllegalAccessError或NoClassDefFoundError javax/servlet/...立刻退回 JDK 8。处理多个 JDK 版本时环境变量JAVA_HOME必须指向 Tomcat 要用的那个版本命令行验证一下# Windows 下打开 CMD查看当前 JAVA_HOME echo %JAVA_HOME% java -version # 如果版本不对临时设置到 JDK8 set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_281在 macOS/Linux 下用echo $JAVA_HOME和export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64效果相同。版本改完后一定要重开终端因为环境变量不会自动刷新生效。3.2 在 IDEA 中新建 JSP 项目并导入两种方式与三个容易错的地方网上这类源码多是 Eclipse 工程而你现在大概率用的是 IDEA。IDEA 可以直接打开.project但更容易踩坑的是 Artifact 设置很多新手导入后页面能打开点击跳转就 404问题往往出在“没把项目设置成 Web 项目”。方式一直接 Open 源码目录。IDEA 看到.project文件会识别成 Eclipse 项目进入后提示“Eclipse project detected”选择 Open然后在Project Structure - Facets里确认是否有 Web 和部署描述符。如果没有点加号添加 Web在Deployment Descriptors里指向WebRoot/WEB-INF/web.xml再把WebRoot设为 Web Resource Directory。方式二新建一个 Web 项目再复制源码这个方式最稳妥# 1. 在 IDEA 中创建新项目选择 Java Enterprise / Web Application # 2. 指定 Application Server 为本地 Tomcat # 3. 生成项目后把原源码 src 下的 .java 复制到新项目 src 目录 # 4. 把原源码 WebRoot 下的 jsp、css、js、WEB-INF 复制到新项目 web 目录 # 5. 确定 Artifacts 里生成的 xxx:war exploded 依赖 lib“三个容易错的地方”具体来说第一复制后容易多一层目录造成 class 找不到第二IDEA 默认src目录里如果有旧包名复制后没刷新 Maven导致容器找不到类第三Artifacts 没勾选Available Elements - 项目名 - lib部署时 MySQL 驱动 JAR 不被打进 WEB-INF/lib运行时会报ClassNotFoundException。如果你坚持要使用传统 JSP 项目打包 war最直白的方法是IDEA 里打开 Project Structure选择 Artifacts新建Web Application Exploded再新建一个Web Application ArchiveBuild - Build Artifacts把生成的.war放到 Tomcatwebapps目录。这样你既能在 IDE 里调试又能拿到一个独立部署的 war。3.3 初始化数据库SQL 脚本执行与连接参数修改源码包里的.sql脚本是数据库的“后悔药”。你后面不管把代码改成什么样只要数据库乱了重新执行一遍脚本就能回到初始状态。先建库再导表脚本一般长这样-- 作业帮数据库 CREATE DATABASE IF NOT EXISTS homework_help DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE homework_help; -- 学生表设置默认密码为 123456 CREATE TABLE t_student ( student_id INT PRIMARY KEY AUTO_INCREMENT, student_name VARCHAR(30) NOT NULL, class_id INT, password VARCHAR(50) NOT NULL DEFAULT 123456 ); -- 作业表 CREATE TABLE t_homework ( homework_id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, class_id INT, publish_time DATETIME DEFAULT CURRENT_TIMESTAMP );这里utf8mb4是重点如果脚本头写的是utf8你插入 emoji 或者冷门生僻字时会报Incorrect string value。执行脚本后用show tables;检查表是否都在。表名前缀如t_student、t_homework是这类项目最常见命名风格你后面写 SQL 时直接照抄。接下来修改连接参数。编码方式五花八门但核心就是找到包含数据库地址的那份配置文件或 Java 工具类。常见位置是src/util/DBUtil.java里面一定有像下面这样的三段配置public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/homework_help?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai; private static final String USERNAME root; private static final String PASSWORD 123456; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }参数说明characterEncodingutf8保证 JSP 写入的中文在数据库里不变成乱码serverTimezoneAsia/Shanghai是 MySQL 8 的必填项不写的话会报 CST 时区错误useSSLfalse避免本地连库时出现 SSL 警告刷屏。如果你的 MySQL 密码不是123456只改PASSWORD这一行即可。有些源码把配置写在db.properties或jdbc.properties那也是同理改完记得刷新资源文件。3.4 部署到 Tomcat 并启动验证部署分两步先把项目生成 war 或直接用 exploded 配置再启动 Tomcat。IDEA 里调试时通常用Tomcat - Deployment - 项目名:war exploded启动后控制台能看到类似sss.sss: C:/Program Files/apache-tomcat-8.5.87/bin/ Using CATALINA_BASE: ... Deploying web application archive命令行部署则更接近生产把 war 丢进 Tomcatwebapps后启动startup.batWindows或startup.shLinux/macOS# Windows 启动 cd C:\apache-tomcat-8.5xx\bin startup.bat # Linux/macOS 启动 cd /opt/apache-tomcat-8.5.87/bin ./startup.sh # 实时查看日志SESSION 初始化或 SQL 报错都会出现在这里 tail -f /opt/apache-tomcat-8.5.87/logs/catalina.out启动成功后浏览器访问http://localhost:8080/项目名/。项目名默认是 war 的文件名如果你是HomeworkHelp.war那就是http://localhost:8080/HomeworkHelp/index.jsp。如果首页变成了 Tomcat 默认页多半是webapps下面既有 ROOT 又有你的项目地址没带项目名。这里给你一个验证是否真正启动的硬指标访问登录接口时打开 IDEA 控制台或 catalina.out看到你自己的 Servlet 打印的 SQL 语句就说明数据库连接和项目 Web 路径都通了。4. 核心功能怎么落地作业发布、提交与家校互通的表与代码4.1 数据库表结构设计作业表、学生、家长、班级做“小学家校一体”这种系统绕不开这几张表班级表、学生表、家长表、教师表、作业表、提交记录表。我不建议用一张大表把所有角色塞进去因为这会让登录逻辑变成一团乱麻。下面是一个瘦身后的核心表结构足够支撑作业帮的主流程USE homework_help; CREATE TABLE t_class ( class_id INT PRIMARY KEY AUTO_INCREMENT, class_name VARCHAR(50) NOT NULL ); CREATE TABLE t_teacher ( teacher_id INT PRIMARY KEY AUTO_INCREMENT, teacher_name VARCHAR(30) NOT NULL, username VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL ); CREATE TABLE t_parent ( parent_id INT PRIMARY KEY AUTO_INCREMENT, parent_name VARCHAR(30) NOT NULL, username VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, student_id INT, FOREIGN KEY (student_id) REFERENCES t_student(student_id) ); CREATE TABLE t_homework ( homework_id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, class_id INT NOT NULL, teacher_id INT NOT NULL, publish_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (class_id) REFERENCES t_class(class_id), FOREIGN KEY (teacher_id) REFERENCES t_teacher(teacher_id) ); CREATE TABLE t_submit ( submit_id INT PRIMARY KEY AUTO_INCREMENT, homework_id INT NOT NULL, student_id INT NOT NULL, submit_content TEXT, submit_time DATETIME DEFAULT CURRENT_TIMESTAMP, status TINYINT DEFAULT 0 COMMENT 0未提交 1已提交 2已批改 );这个设计的核心是两个外键t_parent通过student_id与学生表绑定保证一个家长只能看到自己孩子t_submit通过homework_id和student_id唯一确定一条提交记录。状态字段用TINYINT而不是字符串在页面判断时if(status 1)比if(submitted.equals(status))更省事。参数说明AUTO_INCREMENT是自增主键插入记录后可以通过SELECT LAST_INSERT_ID()拿到最新 IDCOMMENT不会影响逻辑但强烈建议保留因为后续写dao层时你会经常需要查阅字段含义。4.2 教师端作业发布逻辑教师登录后进入发布页面填一个标题、一段作业内容点提交。前端是一个极简 JSP 表单重点在 Servlet 侧。先看addHomework.jsp的表单form actionaddHomework methodpost input typetext nametitle placeholder作业标题 required / textarea namecontent rows5 placeholder作业内容 required/textarea button typesubmit发布作业/button /form这个表单提交到addHomework对应的 Servlet 处理WebServlet(/addHomework) public class AddHomeworkServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); // 从会话中拿教师ID避免前端伪造教师身份 HttpSession session request.getSession(); Integer teacherId (Integer) session.getAttribute(teacherId); String title request.getParameter(title).trim(); String content request.getParameter(content).trim(); HomeworkDao dao new HomeworkDao(); int classId Integer.parseInt(request.getParameter(classId)); boolean ok dao.insertHomework(title, content, classId, teacherId); if (ok) { response.sendRedirect(homeworkList); // 重定向避免重复提交 } else { response.setContentType(text/html;charsetUTF-8); response.getWriter().print(发布失败请重试); } } }逻辑说明这里用session.getAttribute(teacherId)而不是从表单取教师 ID是所有多用户系统都应该养成的习惯。因为页面隐藏的teacherId可以被改而从 Session 里拿到的 ID 是服务端维护的。sendRedirect是 PRGPost/Redirect/Get模式防止点刷新后重复写入。HomeworkDao里的 SQL 可以这样写public boolean insertHomework(String title, String content, int classId, int teacherId) { String sql INSERT INTO t_homework (title, content, class_id, teacher_id) VALUES (?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, title); ps.setString(2, content); ps.setInt(3, classId); ps.setInt(4, teacherId); return ps.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } }用PreparedStatement而不是拼接字符串是为了防 SQL 注入标题里如果包含单引号直接拼接会直接把 SQL 写炸。try-with-resources写法会自动关闭连接你不需要在finally里手动close()这是课程设计里最容易加分的小细节。4.3 学生端提交作业与状态回显学生端的功能比教师端简单进入作业详情页看到一个textarea填好提交。提交表可以复用t_submit关键是要保证同一学生同一作业只能有一条记录而不是无限插入。提交处理的 Servlet 核心逻辑WebServlet(/submitHomework) public class SubmitHomeworkServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); int studentId (Integer) request.getSession().getAttribute(studentId); int homeworkId Integer.parseInt(request.getParameter(homeworkId)); String content request.getParameter(content); SubmitDao dao new SubmitDao(); // 如果已经提交过则执行更新而不是新增 boolean ok dao.isSubmitted(homeworkId, studentId) ? dao.updateSubmit(homeworkId, studentId, content) : dao.insertSubmit(homeworkId, studentId, content); response.sendRedirect(homeworkDetail?homeworkId homeworkId); } }这里引入了一个“先查询再判断”的动作本质上是为了防止重复提交。更稳妥的方案是在t_submit表加唯一联合约束UNIQUE KEY (homework_id,student_id)但从课程设计演示角度先查再写已经够用。页面端状态回显常见做法是 JSP 里用c:if或最原始的 Java 代码判断% Submit submit (Submit) request.getAttribute(submit); if (submit null || submit.getStatus() 0) { % div classunsubmitted尚未提交作业/div % } else { % div classsubmitted已提交于 % submit.getSubmitTime() %/div % } %注意这里不要用数字直接代替所有判断因为状态2表示“已批改”你在学生端显示的文案需要和教师端批改状态保持一致。一个好的习惯是让Submit实体里加一个getStatusText()方法返回“未提交/已提交/已批改”三处页面共用。4.4 家长/教师端登录与家校互通家校互通的起点是登录登录状态又是所有页面权限的开关。一般做法是做一个/loginServlet根据用户名和角色查询不同表WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); String role request.getParameter(role); // teacher / student / parent if (teacher.equals(role)) { Teacher t TeacherDao.login(username, password); if (t ! null) { request.getSession().setAttribute(teacherId, t.getTeacherId()); response.sendRedirect(teacher/home.jsp); return; } } else if (student.equals(role)) { // 同理写入 studentId } else if (parent.equals(role)) { // 写入 parentId并同时查出该家长绑定的 student_id } // 登录失败 request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } }这里的角色字段如果放在前端就会被恶意用户篡改但课程设计里最常见的演示做法就是这样。更稳一点的做法是登录页只提交用户名和密码登录时依次查教师表、学生表、家长表命中谁就以谁的身份登录。这样虽然多查两次数据库但安全性明显提升。权限控制靠一个 Filter 统一拦截WebFilter(/*) public class AuthFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; HttpSession session request.getSession(false); String path request.getRequestURI(); if (path.endsWith(login.jsp) || path.endsWith(/login) || path.contains(/css/) || path.contains(/js/)) { chain.doFilter(req, resp); return; } if (session null || session.getAttribute(teacherId) null session.getAttribute(studentId) null session.getAttribute(parentId) null) { response.sendRedirect(login.jsp); return; } chain.doFilter(req, resp); } }这个 Filter 的逻辑是把静态资源和登录接口放行其他页面一律检查 Session。新手最容易漏掉的是css/js路径不放开的话登录页样式会失效到让你以为是乱码问题。判断条件里同时检查三种角色 ID是为了让教师、学生、家长共用一个过滤器不重复写三段拦截逻辑。5. JSP 项目常见问题避坑从版本冲突到中文乱码的 5 个坑5.1 现象Tomcat 一启动就 HTTP 500控制台抛NoClassDefFoundError或ClassNotFoundException原因很直接JDK 版本太高或者 Tomcat 的lib目录里缺少servlet-api.jar。在 JDK 17 本地跑 Tomcat 8 时javax.servlet的加载机制发生变化老项目非常容易撑不住。处理方案是双击检查两条第一看java -version是 17 就换 8第二看项目的WEB-INF/lib下是不是少了 mysql 驱动之外的公共库。解决退回 JDK 8并在 IDEA 的 Project Structure 中把 Project SDK 和 Module SDK 都改成 8。Tomcat 的版本页面如果没有javax.servlet则改用一个 9.0.xx 版本。改完后不要只刷新页面要完整重启 Tomcat否则你看到的还是上一个进程的报错。5.2 现象启动时不报错但一打开作业列表就报数据库连接失败提示Server connection failure during transaction原因是 MySQL 8 与老驱动com.mysql.jdbc.Driver不兼容。这类源码包里经常只放一个旧版mysql-connector-java-5.1.xx.jar它不认识 MySQL 8 的认证协议。解决去 Maven 仓库下载mysql-connector-java-8.0.33.jar替换掉局部驱动并把 Url 加上serverTimezoneAsia/Shanghai。如果源码里的Class.forName(com.mysql.jdbc.Driver)没改记得改成Class.forName(com.mysql.cj.jdbc.Driver);严格来说新驱动仍然能识别com.mysql.jdbc.Driver但会抛一条过时警告我建议直接改成新版类名。5.3 现象页面上所有中文变成???或稿尤其是通过表单提交后的作业标题原因有两层第一数据库表创建时用了latin1第二JSP 页面或 Servlet 没有设置字符编码。只要一层没设对中文就会在某个环节变成乱码。解决先用show create table t_homework;看表是否DEFAULT CHARSETutf8mb4不对就重建表再检查 JSP 文件头是否有% page contentTypetext/html;charsetUTF-8 %。Post 请求乱码可以在web.xml里加一个编码过滤器或者在每一个doPost第一行写request.setCharacterEncoding(UTF-8)。最省事的是写一个通过注解注册的过滤器来统一处理。5.4 现象访问http://localhost:8080/项目名/出现 404但手动输入index.jsp就能打开原因默认欢迎页没配好。项目根目录没有/时默认去找web.xml里的welcome-file-list如果写的是/jsp/index.jsp而你访问根路径又没带文件名Tomcat 无从映射。解决打开web.xml检查welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list如果首页放在WebRoot/jsp/下就写welcome-filejsp/index.jsp/welcome-file。改完后清掉 Tomcatwork目录下的旧编译产物再重启避免 JSP 修改没被重新编译。5.5 现象演示视频能播放但自己操作时页面和视频里不一样这个坑在“源码演示视频”资源里太常见了。视频可能是作者旧版本录制的源码是后来改过的也可能是数据库初始数据不同。比如视频里教师端有“批量发布作业”按钮而源码里根本没这段你怎么点都找不到。解决把视频当成功能流程参考不要当成验收标准。先按视频路径走一遍主流程再回来对照源码目录逐个找功能。找不到的按钮直接去 JSP 页面的源码里搜索关键词“批量”看存在不存在。如果只是初始数据导致页面显示不同就执行 SQL 脚本里的INSERT语句把视频里的演示数据恢复出来。这里的关键是记住“源码是最终真相”视频只用来理解业务故事。6. 给系统加一个作业统计功能答辩演示与二次开发技巧如果你已经跑通上面所有流程说明这个系统已经能作为你毕业设计或课程设计的基础。很多同学到这一步就停了其实还有一个“长尾”功能段位把项目从“能跑”变成“像自己做的”。我推荐你加一个小的“作业提交统计”功能改动量不大但答辩时能直接证明你理解数据表关联关系。核心思路是在教师端首页加一张统计表统计每个班级目前有几份作业、提交了几份、提交率是多少。你需要新写两个东西一个是取数逻辑一个是展示页面。先写统计查询的 DAO 方法public ListMapString, Object getHomeworkStats() { ListMapString, Object list new ArrayList(); String sql SELECT c.class_name, h.homework_id, h.title, COUNT(s.submit_id) AS submit_count FROM t_homework h LEFT JOIN t_class c ON h.class_id c.class_id LEFT JOIN t_submit s ON h.homework_id s.homework_id GROUP BY h.homework_id, c.class_name, h.title; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { MapString, Object row new HashMap(); row.put(className, rs.getString(class_name)); row.put(title, rs.getString(title)); row.put(submitCount, rs.getInt(submit_count)); list.add(row); } } catch (SQLException e) { e.printStackTrace(); } return list; }这里用LEFT JOIN而不是INNER JOIN是为了让还没有学生提交的作业也能显示出来提交数为 0。GROUP BY必须包含所有非聚合查询列否则 MySQL 5.7 以上版本会报ONLY_FULL_GROUP_BY错误。展示页面可以直接放在教师端首页循环遍历这个 List 渲染成表格我就不再贴完整 JSP 了因为不同源码包的表结构有差异你需要按实际字段名调整。做这个功能时我还建议你做一次“演示前 10 分钟检查”提示给老师演示时先把t_homework和t_submit里的测试数据清理掉重新执行 SQL 初始化脚本。这样页面列表干净提交状态一目了然。清理前记得把数据库脚本备份一下它就是你的后悔药。这段代码里最容易被忽略的坑是getSession(false)的使用。如果你用了request.getSession()即使未登录也会创建一个新 SessionFilter 判断就会失效未登录用户也能访问教师统计页。改成getSession(false)未登录时为null权限判断才真正生效。我自己的习惯是拿到一份陌生源码后第一件事不看代码而是建一个notes.md把运行步骤、版本号、SQL 执行结果、首页地址、主账号密码写下来。这个习惯帮我避免了很多次隔几天再回头看项目时的“怎么也跑不起来”。每次改完代码后我也会在notes.md里记一行“改了什么、影响哪些页面”这不仅方便自己复盘也方便在最终提交作品时写清楚“系统部署说明”。希望这些内容能帮你少走几步弯路折腾半天太伤神先把主流程走通再放心往深处改。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →