ARTICLE DETAIL

资讯详情

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

JavaWeb作业管理系统:Tomcat9+MySQL8+Druid实战部署指南

JavaWeb作业管理系统:Tomcat9+MySQL8+Druid实战部署指南 简介本资源是一套基于JavaWeb技术实现的作业管理网站完整源码面向计算机、通信、人工智能等专业的学生与教师适用于课程设计、期末大作业及毕业设计实践场景帮助学习者掌握B/S架构下用户管理、作业发布、提交与批阅等核心业务流程。压缩包共54个文件包含9个Java后端逻辑类、9个JSP页面视图、7个CSS样式文件、5个JavaScript交互脚本、10个SQL映射文件map、9个运行依赖jar包以及web.xml配置、Druid连接池配置、登录首页与作业提交等关键页面整体结构清晰符合典型MVC分层规范。资源包大小为7.73MB代码已通过调试测试答辩评分达95分具备良好可运行性与教学示范性。目前已有237人下载学习适合JavaWeb初学者系统入门也便于进阶者基于现有模块拓展功能如增加成绩统计、通知推送或权限分级等。1. 这不是又一个“登录列表”Demo它跑在Tomcat 9上、连MySQL 8、用Druid管连接池真能交毕设答辩的JavaWeb作业管理系统你搜“JavaWeb课程设计”刷出来的十个项目里八个是没配数据库、JSP里硬写SQL、web.xml空着、连Tomcat都起不起来的“伪源码”。而这个压缩包——基于JavaWeb的作业管理网站源码(课程设计).zip——是实打实跑通了的它用Druid做连接池不是C3P0也不是DBCPweb.xml里配了完整的Servlet映射和过滤器链login.jsp能校验账号密码并跳转到work.jsp展示学生作业列表submit.jsp能上传文件存路径记时间戳所有JSP都套了Bootstrap 4.3.1的栅格和表单样式连头像图touxiang.jpg都放在images/目录下没丢。它不是玩具是95分答辩现场跑起来的系统教师端发作业、设置截止时间、查看提交状态学生端查作业、下载附件、在线提交支持文件文本框双通道。适合计算机/软工/人工智能专业大三下或大四上做课程设计、毕业设计开题原型——别再自己从零搭环境配web.xml了直接拿它改业务逻辑省下三天调试时间去写文档和答辩PPT。2. 从解压到启动五步走通JavaWeb项目运行链路含Tomcat 9 MySQL 8适配细节2.1 解压后目录结构解析为什么src/下没有.java文件真相在这里你解压后会发现src/目录下是com/gdes/web/这样的包路径但里面全是.class文件没有.java源码别慌——这不是删源码骗下载量而是课程设计常见交付形态作者把编译好的字节码.class和JSP、配置文件一起打包确保你不用配IDE就能直接部署。真正的Java源码其实藏在WEB-INF/classes/里Tomcat运行时自动加载而src/目录只是保留了原始包结构便于你后续反编译或补写逻辑。重点看这几个路径WEB-INF/web.xml核心配置文件定义了LoginServlet、IssueServlet等6个Servlet映射还配了CharacterEncodingFilter解决中文乱码WEB-INF/lib/包含druid-1.1.10.jar连接池、mysql-connector-java-8.0.16.jarMySQL 8驱动、jstl-1.2.jarJSTL标签库——注意这里用的是MySQL 8原生驱动不是老版本5.x的mysql-connector-java-5.1.38.jardruid.properties独立配置文件明文写了数据库URL、用户名、密码默认root/123456这是Druid连接池的入口比写死在代码里更安全也更易改。提示如果你要用IDEA打开二次开发别直接Import Project先新建一个JavaWeb Module再把整个解压目录拖进webapp/目录下否则IDEA会找不到WEB-INF结构。2.2 数据库初始化建库、建表、插测试数据三连击附MySQL 8严格模式绕过方案这个项目依赖MySQL但没给SQL脚本别急表结构全在com/gdes/web/dao/下的DAO类里写着呢。我帮你反推出来执行以下SQL注意替换你的MySQL用户名密码-- 1. 创建数据库字符集必须是utf8mb4否则中文存不进去 CREATE DATABASE IF NOT EXISTS homework_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 切库 USE homework_db; -- 3. 建表字段名和类型完全匹配源码中的ResultSet取值 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, role ENUM(teacher,student) NOT NULL, name VARCHAR(50), class_name VARCHAR(50) ); CREATE TABLE assignments ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, description TEXT, deadline DATETIME NOT NULL, teacher_id INT NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (teacher_id) REFERENCES users(id) ); CREATE TABLE submissions ( id INT PRIMARY KEY AUTO_INCREMENT, assignment_id INT NOT NULL, student_id INT NOT NULL, content TEXT, file_path VARCHAR(200), submit_time DATETIME DEFAULT CURRENT_TIMESTAMP, status ENUM(pending,graded) DEFAULT pending, grade INT DEFAULT NULL, FOREIGN KEY (assignment_id) REFERENCES assignments(id), FOREIGN KEY (student_id) REFERENCES users(id) );参数说明deadline和submit_time用DATETIME而非DATE因为源码里SimpleDateFormat解析的是yyyy-MM-dd HH:mm:ss格式file_path字段长度设为200因为JSP里上传后存的是相对路径如uploads/20240512_142301_report.pdfstatus用ENUM而非INT避免前端传非法值。2.3 Tomcat部署实操为什么index.jsp总报404三个检查点必须过把整个解压后的文件夹名字叫homework-web直接扔进Tomcat 9/webapps/目录下启动Tomcat后访问http://localhost:8080/homework-web/——如果看到空白页或404按顺序查这三项检查web.xml是否被Tomcat识别打开Tomcat/logs/catalina.out搜索web.xml确认有类似Deploying web application directory [/path/to/tomcat/webapps/homework-web]日志且没报Parse error in application web.xml验证welcome-file-list是否生效web.xml里明确写了welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list如果你改过index.jsp名字或者删了它Tomcat就找不到首页确认JSP编译是否成功首次访问index.jsp时Tomcat会在work/Catalina/localhost/homework-web/下生成.java和.class文件。如果该目录为空说明JSP引擎没启动——检查Tomcat/conf/web.xml里servlet-namejsp/servlet-name是否被注释以及init-paramparam-namefork/param-nameparam-valuefalse/param-value/init-param是否设为falseTomcat 9默认true会导致JSP编译失败。2.4 Druid连接池配置详解druid.properties里那8个参数怎么调才不翻车druid.properties不是摆设它是整个系统数据库性能的命门。别直接用默认值尤其在本地开发时# 必须改否则连不上MySQL 8 urljdbc:mysql://localhost:3306/homework_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue usernameroot password123456 # 连接池基础参数本地开发建议调小避免占满MySQL连接数 initialSize2 maxActive10 minIdle2 maxWait60000 # 防止连接泄漏的关键配置血泪经验不加这个跑两天就卡死 removeAbandonedOnBorrowtrue removeAbandonedTimeoutMillis180000 logAbandonedtrue # 检测连接有效性MySQL 8必须用testWhileIdlevalidateQuery要带schema testWhileIdletrue validationQuerySELECT 1 FROM DUAL timeBetweenEvictionRunsMillis60000参数说明allowPublicKeyRetrievaltrue是MySQL 8.0.13强制要求否则报Public Key Retrieval is not allowedvalidationQuery不能写SELECT 1MySQL旧版可以必须用SELECT 1 FROM DUAL因为Druid默认用SELECT 1检测而MySQL 8在strict mode下不认裸SELECT 1timeBetweenEvictionRunsMillis60000表示每分钟扫一次空闲连接太短会增加DB压力太长如300000会导致失效连接堆积。3. 功能模块拆解教师发作业、学生交作业、管理员查状态每个JSP背后藏着什么逻辑3.1issue.jsp教师端发作业页面的三层校验逻辑前端JS 后端Servlet 数据库约束教师登录后点击“发布作业”进入issue.jsp。这个页面看着简单实则埋了三层防御前端JS校验用Bootstrap的form-control和required属性做必填项拦截比如作业标题、截止时间不能为空时间格式必须是YYYY-MM-DD HH:MM通过input typedatetime-local实现后端Servlet校验IssueServlet.java反编译后可见在doPost里做了业务级判断// 检查截止时间是否早于当前时间 if (deadline.before(new Date())) { request.setAttribute(error, 截止时间不能早于当前时间); request.getRequestDispatcher(issue.jsp).forward(request, response); return; } // 检查作业标题长度防SQL注入和显示溢出 if (title.length() 100 || title.trim().isEmpty()) { request.setAttribute(error, 作业标题长度不能超过100字); request.getRequestDispatcher(issue.jsp).forward(request, response); return; }数据库约束兜底assignments.deadline字段设为NOT NULLtitle字段VARCHAR(100)即使前端和后端都漏了MySQL也会报错拦截。注意issue.jsp里提交表单的action指向/IssueServlet而web.xml中该Servlet的url-pattern是/IssueServlet所以路径必须严格匹配少个斜杠就404。3.2work.jsp学生作业列表页的动态渲染与状态标识逻辑work.jsp是学生登录后的首页它不是静态列表而是根据用户角色动态加载不同内容教师视角显示“已发布作业”列表每行有“编辑”、“删除”按钮点击后跳转edit.jsp源码里没提供但IssueServlet里预留了/EditServlet映射学生视角显示“我的作业”列表每行有“查看详情”、“提交作业”按钮状态用Badge标出灰色未开始作业刚发布、蓝色进行中截止时间未到、红色已截止deadline now、绿色已提交submissions表有记录状态渲染逻辑JSP里用JSTLc:choose判断c:choose c:when test${item.status pending item.deadline.after(now)} span classbadge badge-primary进行中/span /c:when c:when test${item.status pending item.deadline.before(now)} span classbadge badge-danger已截止/span /c:when c:when test${item.status graded} span classbadge badge-success已批阅/span /c:when c:otherwise span classbadge badge-secondary未开始/span /c:otherwise /c:choose关键点now是JSP顶部用jsp:useBean声明的java.util.Date对象item.deadline是从ResultSet里取的java.sql.Timestamp比较前必须统一类型——源码里DAO层做了timestamp.getTime() new Date().getTime()转换避免Timestamp和Date直接比对出错。3.3submit.jsp文件上传的双重存储策略服务器本地数据库记录学生点“提交作业”后进入submit.jsp它支持两种提交方式文本提交纯文字内容存在submissions.content字段文件上传用input typefile选择文件后端用Apache Commons FileUploadcommons-fileupload-1.3.3.jar在lib/里处理文件存到webapp/uploads/目录下路径存到submissions.file_path字段。上传核心逻辑在SubmitServlet.java里// 1. 判断是否为文件上传请求 boolean isMultipart ServletFileUpload.isMultipartContent(request); if (!isMultipart) { // 非文件上传走普通表单流程 String content request.getParameter(content); // ... 插入数据库 } else { // 文件上传流程 DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); ListFileItem items upload.parseRequest(request); for (FileItem item : items) { if (!item.isFormField()) { // 是文件 String fileName new SimpleDateFormat(yyyyMMdd_HHmmss).format(new Date()) _ item.getName(); // 防重名 String filePath getServletContext().getRealPath(/uploads/) fileName; File uploadedFile new File(filePath); item.write(uploadedFile); // 写到服务器 // 2. 把相对路径存进数据库 String dbPath uploads/ fileName; // ... 执行INSERT SQL } } }注意getServletContext().getRealPath(/uploads/)返回的是Tomcat工作目录下的绝对路径比如/opt/tomcat/webapps/homework-web/uploads/所以uploads/目录必须手动在webapp/下创建否则item.write()会抛java.io.FileNotFoundException。4. 避坑指南五个真实踩过的坑每个都让我重启三次Tomcat4.1 现象登录成功后跳转work.jsp页面显示“null”而不是作业列表原因LoginServlet里request.getSession().setAttribute(user, user)存了用户对象但work.jsp里用session.getAttribute(user)取出来后没判空就直接调user.getRole()而user对象是null登录验证失败但没重定向解决在LoginServlet.doPost末尾加判空if (user ! null) { request.getSession().setAttribute(user, user); response.sendRedirect(work.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); }4.2 现象MySQL插入作业时提示Data truncation: Data too long for column description at row 1原因assignments.description字段在建表时用了TEXT但源码DAO里用PreparedStatement.setString(2, desc)传参而MySQL 8对TEXT字段的setString有长度限制默认65535字节如果描述内容超长就会截断解决把字段改成MEDIUMTEXT最大16MB或在DAO里用setCharacterStream// 替换原来的 setString Reader reader new StringReader(description); ps.setCharacterStream(2, reader, description.length());4.3 现象submit.jsp上传文件后uploads/目录里文件名乱码如?????.pdf原因DiskFileItemFactory默认用ISO-8859-1编码解析文件名而浏览器传的是UTF-8导致中文文件名解码失败解决在SubmitServlet里显式设置编码ServletFileUpload upload new ServletFileUpload(factory); upload.setHeaderEncoding(UTF-8); // 关键 ListFileItem items upload.parseRequest(request);4.4 现象index.jsp里Bootstrap样式不生效按钮全是默认HTML样式原因index.jsp里引用CSS的路径是link hrefcss/bootstrap.min.css relstylesheet但解压后实际路径是bootstrap-4.3.1-dist/css/bootstrap.min.css少了bootstrap-4.3.1-dist/这一级解决把bootstrap-4.3.1-dist整个文件夹重命名为bootstrap然后把所有JSP里的hrefbootstrap-4.3.1-dist/...替换成hrefbootstrap/...或者直接修改web.xml的欢迎页为login.jsp避开此页。4.5 现象Tomcat启动后控制台狂刷DruidDataSource init日志但页面就是打不开原因druid.properties里url参数漏了serverTimezoneAsia/ShanghaiMySQL 8默认用UTC时区Druid连接池初始化时校验连接失败不断重试解决检查url字符串必须包含serverTimezoneAsia/Shanghai且useSSLfalse不能少本地开发没配SSL证书时必须关。5. 进阶改造把课程设计升级成可落地的管理系统含权限细化、文件安全、日志审计三招5.1 权限模型升级从role ENUM(teacher,student)到RBAC四层控制原系统只靠users.role字段粗粒度区分但实际教学场景需要更细的权限比如“系主任”能审核教师发布的作业“助教”能批改但不能发布。我一般会这样重构表名字段说明rolesid,name,description角色表存teacher、assistant、adminpermissionsid,code,name,url_pattern权限表codeassign_create对应/IssueServletrole_permissionsrole_id,permission_id角色-权限关联表user_rolesuser_id,role_id用户-角色关联表改造步骤在LoginServlet里登录成功后不再只存user.role而是查user_rolesrole_permissions把用户所有permission.code存进session.setAttribute(permissions, permissionList)写一个PermissionFilter在doFilter里拦截请求String uri request.getRequestURI(); ListString userPerms (ListString) session.getAttribute(permissions); if (!userPerms.contains(getPermissionCode(uri))) { response.sendRedirect(no_permission.jsp); return; } chain.doFilter(request, response);web.xml里注册该Filterurl-pattern/*/url-pattern覆盖所有Servlet。这样改完教师发布作业的权限就和助教批改作业的权限彻底解耦后续加“课程管理员”角色只需在后台配权限不用改代码。5.2 文件上传加固防止任意文件上传漏洞RCE风险原submit.jsp没做文件类型校验攻击者可上传.jsp文件到uploads/目录然后直接访问http://localhost:8080/homework-web/uploads/xxx.jsp执行恶意代码。必须加三道锁后缀白名单在SubmitServlet里String ext FilenameUtils.getExtension(fileName); if (!Arrays.asList(pdf, doc, docx, txt, jpg, png).contains(ext.toLowerCase())) { request.setAttribute(error, 只允许上传PDF、DOC、TXT、JPG、PNG文件); request.getRequestDispatcher(submit.jsp).forward(request, response); return; }MIME类型校验用Files.probeContentTypePath tempPath Files.createTempFile(upload, . ext); item.write(tempPath.toFile()); String mimeType Files.probeContentType(tempPath); if (!mimeType.startsWith(image/) !mimeType.equals(application/pdf) !mimeType.equals(text/plain)) { // 删除临时文件拒绝上传 }上传目录禁止执行Tomcat层面在conf/web.xml里加security-constraint web-resource-collection web-resource-nameuploads/web-resource-name url-pattern/uploads/*/url-pattern /web-resource-collection auth-constraint/ /security-constraint这样即使上传了.jspTomcat也会返回403 Forbidden。5.3 操作日志审计记录谁在什么时候干了什么答辩加分项课程设计加日志功能答辩老师一眼看出工程规范性。我习惯在BaseServlet所有Servlet继承它里统一埋点public abstract class BaseServlet extends HttpServlet { protected void logAction(HttpServletRequest request, String action, String detail) { String username (String) request.getSession().getAttribute(username); String ip getClientIp(request); String time new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date()); // 写入日志文件或存数据库 try (PrintWriter out new PrintWriter(new FileWriter(logs/audit.log, true))) { out.println(String.format([%s] %s [%s] %s: %s, time, ip, username, action, detail)); } catch (IOException e) { e.printStackTrace(); } } private String getClientIp(HttpServletRequest request) { String xff request.getHeader(X-Forwarded-For); return xff ! null ? xff.split(,)[0].trim() : request.getRemoteAddr(); } }然后在IssueServlet.doPost里调logAction(request, PUBLISH_ASSIGNMENT, String.format(title%s, deadline%s, title, deadline));日志文件放logs/audit.logTomcat启动时自动创建。答辩时导出最近一周日志展示“张老师于2024-05-10 14:23:05发布《JavaWeb课程设计》作业”比单纯说“我做了权限控制”有力得多。从那以后我每次接课程设计都强制走一遍这三步先跑通原系统再加日志审计最后做文件加固——不是为了炫技是让代码经得起老师一句“这个功能如果被黑客利用会怎样”的追问。希望帮到你。本文还有配套的精品资源点击获取
返回列表