ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JavaWeb作业管理系统源码:Servlet+JSP+MySQL可运行实战

JavaWeb作业管理系统源码:Servlet+JSP+MySQL可运行实战 简介本资源是一套基于JavaWeb技术实现的作业管理网站完整源码面向计算机、通信、人工智能等专业的本科生及教师适用于课程设计、期末大作业与毕业设计实践场景帮助学习者掌握B/S架构下用户管理、作业发布与提交、成绩统计等核心业务逻辑。压缩包共54个文件包含9个Java后端类、9个JSP页面、7个CSS样式文件、5个JS脚本、10个Mapper映射文件及配套jar库、druid连接池配置、web.xml部署描述符等结构清晰体现MVC分层思想整体包体7.73MB轻量易部署。已有237人下载学习代码经实际调试验证可直接运行答辩获95分高分附带README说明文档与典型页面如login.jsp、submit.jsp、work.jsp及Bootstrap前端组件便于初学者理解前后端交互流程也支持进阶者基于现有模块拓展功能或重构为Spring Boot版本。1. 这不是“又一个JavaWeb课程设计”它是一份能跑通、能改、能交、能面试的作业管理网站最小可行源码你手头这个基于JavaWeb的作业管理网站源码(课程设计).zip不是压缩包里塞满空文件夹的“模板工程”也不是只在Eclipse里点几下就报错的“半成品”。它是真实跑在Tomcat 8.5、连得上MySQL 5.7、登录后能增删查改学生/教师/作业/提交记录的可执行闭环系统——核心功能链路完整教师发布作业 → 学生查看并提交 → 教师批阅打分 → 学生成绩自动归档。我去年带三届本科生做课程设计时筛掉90%的“伪源码”最终只保留这类web.xml有明确servlet-mapping、jdbc.properties配置项不硬编码、JSP里没写SQL、Servlet里没直接new DAO。它不炫技没用Spring Boot但每一步都踩在JavaWeb教学考核的得分点上MVC分层清晰、数据库事务可控、表单校验有前后端双保险、错误页面友好。适合两类人一是大二大三正被《Java Web程序设计》课折磨需要一份能本地一键启动、改两行配置就能交作业、答辩时能讲清每个包作用的参考二是刚转Java后端的新人想绕过Spring全家桶的陡峭曲线从HttpServlet、RequestDispatcher、JDBC DriverManager这些原生API开始亲手把“请求怎么进来、数据怎么存、响应怎么回去”这条链路焊死。别被“课程设计”四个字骗了——它比你想象中更接近真实中小项目的技术水位。2. 从解压到首页用最简路径跑通这个JavaWeb项目含TomcatMySQL环境适配这个源码包的生存逻辑是建立在JavaWeb最经典的技术栈之上的Servlet 3.1 JSP 2.3 JDBC MySQL Tomcat。它不依赖Maven中央仓库的“最新版”而是把所有jar包commons-dbutils-1.7.jar,mysql-connector-java-5.1.47.jar,jstl-1.2.jar全打进WEB-INF/lib/目录。这意味着你不需要联网下载依赖但必须确保你的运行环境版本匹配。下面是我验证过的最小启动路径跳过所有IDE绑定步骤纯命令行文本编辑器可复现。2.1 环境检查三个必须确认的版本锚点提示别急着解压先确认这三项否则后续90%的报错都源于此Java版本必须是JDK 8java -version输出1.8.0_XXX。JDK 11会因javax.servlet包缺失直接启动失败。Tomcat版本推荐Apache Tomcat 8.5.x如8.5.99。Tomcat 9默认启用Servlet 4.0而本项目web.xml声明的是version3.1版本不匹配会导致servlet无法注册。MySQL版本5.7.x如5.7.32。MySQL 8.0默认启用caching_sha2_password认证插件而mysql-connector-java-5.1.47.jar不支持连接时会抛Access denied for user。验证命令# 检查Java java -version # 检查Tomcat进入bin目录后 ./version.sh # Linux/macOS 或 version.batWindows # 检查MySQL mysql --version2.2 数据库初始化建库、建表、插初始数据三步到位项目没提供SQL脚本别慌——它的建表语句就藏在src/com/dao/DBUtil.java里。我把它抽出来整理成标准SQL直接执行即可-- 1. 创建数据库字符集必须是utf8mb4否则中文乱码 CREATE DATABASE IF NOT EXISTS homework_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 切换数据库 USE homework_db; -- 3. 创建用户表含角色字段区分教师/学生 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role ENUM(teacher,student) NOT NULL, name VARCHAR(50), email VARCHAR(100) ); -- 4. 创建作业表 CREATE TABLE assignments ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, description TEXT, deadline DATETIME, teacher_id INT, FOREIGN KEY (teacher_id) REFERENCES users(id) ); -- 5. 创建提交表关联学生、作业、文件路径 CREATE TABLE submissions ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, assignment_id INT NOT NULL, file_path VARCHAR(500), submit_time DATETIME DEFAULT CURRENT_TIMESTAMP, score INT DEFAULT -1, -- -1表示未批阅 comment TEXT, FOREIGN KEY (student_id) REFERENCES users(id), FOREIGN KEY (assignment_id) REFERENCES assignments(id) ); -- 6. 插入初始测试账号密码均为123456明文存储仅用于课程设计 INSERT INTO users (username, password, role, name) VALUES (teacher01, e10adc3949ba59abbe56e057f20f883e, teacher, 张老师), (student01, e10adc3949ba59abbe56e057f20f883e, student, 李同学);参数说明密码字段用的是MD5e10adc3949ba59abbe56e057f20f883e 123456项目里LoginServlet.java调用的是MD5Util.getMD5()所以数据库必须存MD5值不能存明文。file_path字段设计为VARCHAR(500)因为项目上传文件实际存放在WebContent/upload/目录下数据库只存相对路径如upload/202405151423_student01_作业1.docx避免BLOB拖慢查询。字符集utf8mb4是硬性要求JSP页面% page contentTypetext/html;charsetUTF-8%、Tomcatserver.xml的URIEncodingUTF-8、MySQL连接URL的useUnicodetruecharacterEncodingutf8mb4三者必须一致否则中文标题/描述全变??。2.3 Tomcat部署修改配置、拷贝项目、启动服务解压基于JavaWeb的作业管理网站源码(课程设计).zip后你会得到一个名为homework_web的文件夹或类似名称。这不是标准WAR包需手动部署# 进入Tomcat webapps目录 cd /path/to/tomcat/webapps # 将解压后的文件夹重命名为ROOT覆盖默认首页或 homework保持路径 mv /path/to/homework_web ./homework # 修改Tomcat连接池配置关键项目用的是BasicDataSource但默认没配 # 编辑 conf/context.xml在Context标签内添加 # Resource namejdbc/homework authContainer typejavax.sql.DataSource # maxTotal20 maxIdle10 minIdle5 # usernameroot passwordyour_password # driverClassNamecom.mysql.jdbc.Driver # urljdbc:mysql://localhost:3306/homework_db?useUnicodetrueamp;characterEncodingutf8mb4/逻辑说明项目中DBUtil.java通过JNDI查找java:comp/env/jdbc/homework获取数据源而不是直连DriverManager.getConnection()。这是JavaEE规范做法但很多课程设计源码会漏掉context.xml配置导致启动时报NameNotFoundException。你必须手动补上且注意在XML中要写成amp;。如果你不想改context.xml也可以走快捷路径打开src/com/dao/DBUtil.java找到getConnection()方法把JNDI查找那段注释掉换成直连方式但答辩时会被问“为什么不按规范用JNDI”慎用。启动Tomcat# Linux/macOS /path/to/tomcat/bin/startup.sh # Windows /path/to/tomcat/bin/startup.bat访问http://localhost:8080/homework/login.jsp—— 如果看到登录页说明部署成功。输入teacher01/123456或student01/123456即可进入。3. 看懂它的MVC骨架三层包结构、核心Servlet流转与web.xml约束解析这个源码的价值不在于功能多炫而在于它用最朴素的方式把JavaWeb的MVC骨架钉在了代码里。web.xml不是摆设而是整个请求路由的宪法每个Servlet不是孤岛而是MVC链条上咬合的齿轮。下面拆解它如何用200行XML和5个核心类撑起整个作业管理流程。3.1 web.xmlServlet容器的“宪法”3个必须读懂的约束点WEB-INF/web.xml是本项目的灵魂文件。它没用Servlet 3.0的注解式配置而是回归XML声明式这对理解容器启动原理至关重要。重点看这三个区块?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 !-- 1. 全局上下文参数定义应用根路径 -- context-param param-namebasePath/param-name param-valuehttp://localhost:8080/homework//param-value /context-param !-- 2. Servlet声明LoginServlet是入口 -- servlet servlet-nameLoginServlet/servlet-name servlet-classcom.servlet.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern !-- 注意不是/login.jsp -- /servlet-mapping !-- 3. 过滤器强制UTF-8编码解决中文乱码 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classcom.filter.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-mapping /web-app参数说明与选型理由version3.1明确告诉Tomcat用Servlet 3.1规范避免与高版本冲突。这是课程设计的“安全区”比盲目追新更重要。url-pattern/login/url-pattern所有以/login结尾的请求都交给LoginServlet处理。这意味着你在浏览器输/login不是/login.jsp——JSP是视图Servlet是控制器这是MVC的铁律。CharacterEncodingFilter过滤器在请求到达Servlet前强制设置request.setCharacterEncoding(UTF-8)和response.setCharacterEncoding(UTF-8)。没有它表单提交的中文作业标题会变成乱码。这是JavaWeb项目最常被忽略的“玄学”环节也是答辩时老师必问点“为什么这里要用过滤器而不是在Servlet里setCharacterEncoding”3.2 MVC三层落地从LoginServlet到StudentListServlet的请求链整个系统围绕5个核心Servlet构建它们像齿轮一样咬合转动Servlet名路径职责关键技术点LoginServlet/login验证账号密码跳转首页request.getSession().setAttribute(user, user)存会话TeacherHomeServlet/teacher/home查询该教师发布的所有作业SELECT * FROM assignments WHERE teacher_id ?SubmitAssignmentServlet/submit处理学生上传文件Part part request.getPart(file); part.write(savePath)GradeAssignmentServlet/grade教师打分并更新submissions.score事务控制conn.setAutoCommit(false)LogoutServlet/logout清除session并重定向session.invalidate()以学生提交作业为例看MVC如何协同ViewJSPstudent/submit.jsp里有一个form action/homework/submit methodpost enctypemultipart/form-dataenctypemultipart/form-data是文件上传的硬性要求。ControllerServletSubmitAssignmentServlet收到请求调用request.getPart(file)获取文件流用FileUtils.copyInputStreamToFile()存到WebContent/upload/目录再调用AssignmentDAO.addSubmission()插入数据库。ModelDAOAssignmentDAO.java里的addSubmission()方法通过QueryRunner.update()执行预编译SQL参数化防止SQL注入。血泪经验很多同学复制源码后点击“提交作业”没反应。90%原因是form action的路径写错了。必须写成/homework/submit项目上下文路径Servlet映射路径而不是/submit或submit.jsp。Tomcat的URL解析规则是http://host:port/{context-path}/{servlet-mapping}少一个环节就404。3.3 JSP与EL表达式如何安全地把数据从Servlet喂给页面项目没用Struts或SpringMVCJSP就是最后的视图层。但它没写% request.getAttribute(list) %这种易出错的脚本片段而是用JSTLEL表达式!-- teacher/assignment_list.jsp -- c:forEach items${assignmentList} varassign tr td${assign.title}/td tdfmt:formatDate value${assign.deadline} patternyyyy-MM-dd HH:mm//td td a hrefgrade.jsp?aid${assign.id}批阅/a | a hrefdelete_assignment?id${assign.id}删除/a /td /tr /c:forEach逻辑说明${assignmentList}来自TeacherHomeServlet里request.setAttribute(assignmentList, list)这是Servlet向JSP传值的标准方式。fmt:formatDate是JSTL格式化标签把java.util.Date转成可读字符串。如果没引入% taglib prefixfmt urihttp://java.sun.com/jsp/jstl/fmt %页面会直接报错org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/fmt cannot be resolved。hrefgrade.jsp?aid${assign.id}是典型的GET传参但要注意grade.jsp里必须用request.getParameter(aid)获取而不是EL表达式——因为EL只能取域对象request/session里的属性取不到URL参数。4. 避坑指南5个让90%人卡住的致命细节与现场排查方案这个源码包最大的价值不是功能完整而是它把JavaWeb开发中最容易翻车的“边界场景”全暴露出来了。我带学生调试时几乎每个人都栽在这几个坑里。下面不是泛泛而谈而是按“现象→原因→解决”给出可立即执行的方案。4.1 现象登录后跳转到空白页地址栏显示/homework/teacher/home但页面什么也不显示原因TeacherHomeServlet里查询作业列表时QueryRunner.query()返回null而JSP的c:forEach遍历null会直接抛NullPointerExceptionTomcat默认不显示错误堆栈。解决在TeacherHomeServlet.java的doGet()方法末尾加一行日志System.out.println(Query result size: list.size());查看Tomcat控制台输出。如果报java.lang.NullPointerException说明list为null。进入AssignmentDAO.java检查getAssignmentsByTeacherId(int teacherId)方法确认SQL语句SELECT * FROM assignments WHERE teacher_id ?中的teacher_id字段名是否与数据库表结构完全一致大小写敏感确认QueryRunner构造时传入的数据源是否正确new QueryRunner(DBUtil.getDataSource())不是new QueryRunner()。4.2 现象上传作业文件后数据库submissions.file_path字段存的是null且WebContent/upload/目录下没文件原因SubmitAssignmentServlet.java里获取文件Part时request.getPart(file)返回null因为HTML表单的input typefile namefile的name属性值必须严格等于Servlet里写的file且form必须有enctypemultipart/form-data。解决打开student/submit.jsp检查input标签!-- 正确 -- input typefile namefile accept.doc,.docx,.pdf !-- 错误name不匹配 -- input typefile namehomeworkFile accept.doc,.docx,.pdf检查form标签!-- 正确 -- form action/homework/submit methodpost enctypemultipart/form-data !-- 错误缺少enctype -- form action/homework/submit methodpost在Servlet里加断点Part filePart request.getPart(file);如果filePart为null一定是前端问题。4.3 现象教师批阅作业后分数没更新到数据库刷新页面还是-1原因GradeAssignmentServlet.java里执行updateScore()时没开启事务或者conn.commit()没执行。MySQL默认自动提交但项目用了BasicDataSource连接池可能关闭了自动提交。解决打开GradeAssignmentServlet.java找到updateScore()方法确认是否有conn.setAutoCommit(false); // 必须有 // ... 执行update SQL ... conn.commit(); // 必须有如果没有补上。更稳妥的做法是用try...catch...finallytry { conn.setAutoCommit(false); runner.update(conn, sql, score, comment, id); conn.commit(); } catch (SQLException e) { conn.rollback(); // 回滚 throw e; } finally { conn.close(); }4.4 现象点击“删除作业”链接URL变成/homework/delete_assignment?id1但作业没删页面也没跳转原因DeleteAssignmentServlet.java里用的是doGet()处理删除但a href发的是GET请求而Servlet没重写doGet()只写了doPost()。解决打开DeleteAssignmentServlet.java确认doGet()方法是否存在Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id request.getParameter(id); // ... 删除逻辑 ... response.sendRedirect(request.getContextPath() /teacher/home); }如果只有doPost()要么把a href改成form methodpost要么补全doGet()——课程设计中用GET删数据虽不严谨但符合教学场景。4.5 现象修改了jdbc.properties里的密码重启Tomcat后仍连不上数据库报Access denied for user rootlocalhost原因项目同时用了两种数据源配置jdbc.properties硬编码和context.xmlJNDI。DBUtil.java优先使用JNDI如果context.xml没配或配错就会 fallback 到jdbc.properties但此时密码可能还是旧的。解决统一数据源删掉jdbc.properties只用JNDI。确保conf/context.xml里的username和password与MySQL实际账号一致确保DBUtil.java里getDataSource()方法只走JNDI路径public static DataSource getDataSource() { try { Context ctx new InitialContext(); return (DataSource) ctx.lookup(java:comp/env/jdbc/homework); } catch (Exception e) { throw new RuntimeException(e); } }把所有DriverManager.getConnection()相关的代码块彻底删除。5. 从课程设计到真实项目3个可立即落地的升级技巧与我的实战习惯这个源码包的价值远不止于应付课程设计。它像一块未经打磨的璞玉只要加三道工序就能变成你简历里“独立开发的Web项目”。下面分享我在企业项目中反复验证的升级技巧不讲虚的全是抄起来就能用的代码和配置。5.1 技巧一用Filter实现登录拦截杜绝未登录直接访问/teacher/home现在系统靠LoginServlet跳转但用户手动在地址栏输/homework/teacher/home就能绕过登录。加一个LoginFilter让所有/teacher/*和/student/*路径必须登录// src/com/filter/LoginFilter.java public class LoginFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; String path request.getServletPath(); // 放行登录页、静态资源、登录Servlet if (path.startsWith(/login) || path.startsWith(/css/) || path.startsWith(/js/) || path.equals(/login)) { chain.doFilter(req, resp); return; } // 检查session中是否有user HttpSession session request.getSession(false); if (session null || session.getAttribute(user) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, resp); } }在web.xml里注册filter filter-nameLoginFilter/filter-name filter-classcom.filter.LoginFilter/filter-class /filter filter-mapping filter-nameLoginFilter/filter-name url-pattern/teacher/*/url-pattern /filter-mapping filter-mapping filter-nameLoginFilter/filter-name url-pattern/student/*/url-pattern /filter-mapping为什么这招管用它不改变任何业务逻辑只是在请求到达Servlet前加一道门禁。session.getAttribute(user)是LoginServlet存进去的只要session没过期用户就能畅通无阻。比在每个Servlet里写if (sessionnull) redirect优雅10倍也更安全。5.2 技巧二用Bootstrap 4重写所有JSP3小时完成UI现代化原生JSP表格丑得没法见人别重写逻辑只换皮肤。把WebContent/css/bootstrap.min.css和WebContent/js/bootstrap.min.js引入然后改teacher/assignment_list.jsp!-- 替换原table为Bootstrap卡片 -- div classcard div classcard-header bg-primary text-white h5 classmb-0您发布的作业/h5 /div div classcard-body c:forEach items${assignmentList} varassign div classcard mb-3 div classcard-body h6 classcard-title${assign.title}/h6 p classcard-text text-muted${assign.description}/p div classd-flex justify-content-between align-items-center small classtext-muted截止${assign.deadline}/small div a hrefgrade.jsp?aid${assign.id} classbtn btn-sm btn-outline-success批阅/a a hrefdelete_assignment?id${assign.id} classbtn btn-sm btn-outline-danger删除/a /div /div /div /div /c:forEach /div /div参数说明Bootstrap 4的栅格系统.row,.col-*和组件.card,.btn能让你在不碰Java代码的前提下把界面从“教学风”变成“产品风”。关键是所有CSS/JS文件放WebContent/下JSP里用相对路径引用不依赖CDN离线也能跑。5.3 技巧三用Log4j2记录操作日志让“谁在什么时候干了什么”可追溯课程设计不要求日志但真实项目必须有。在src/log4j2.xml里配好?xml version1.0 encodingUTF-8? Configuration statusWARN Appenders File nameFileAppender fileNamelogs/operation.log PatternLayout Pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/Pattern /PatternLayout /File /Appenders Loggers Logger namecom.servlet levelinfo additivityfalse AppenderRef refFileAppender/ /Logger Root levelerror AppenderRef refFileAppender/ /Root /Loggers /Configuration在GradeAssignmentServlet.java里加一行private static final Logger logger LogManager.getLogger(GradeAssignmentServlet.class); // ... 在updateScore()成功后 ... logger.info(教师 {} 批阅作业ID {}分数 {}, teacher.getUsername(), id, score);我的实战习惯我从不写System.out.println()所有输出都走Log4j2。因为System.out在Tomcat里会混在启动日志里根本找不到而logs/operation.log是独立文件按天滚动grep一下grep 批阅作业ID logs/operation.log就能查到所有操作记录。这招在答辩时展示“系统可审计性”老师眼睛都亮了。希望帮到你。这些年我坚持一个原则不教学生“怎么抄作业”而是教他们“怎么把作业变成作品”。这个源码包就是你第一个作品的起点。本文还有配套的精品资源点击获取
返回列表