网上作业批改系统JAVA+Mysql环境搭建与部署避坑指南
简介网上作业批改系统源码包面向Java Web课程设计、毕业设计及教学演示场景采用JSPServletMySQL技术栈帮助学习者理解作业提交、批改与教务信息管理的完整业务链路。系统强调操作简便与友好提示管理员可完成班级、教师、学生、公告、留言、资料及管理员自身信息的管理涵盖录入、查询、删除、打印等操作并具备一定的恶意操作防护能力。压缩包共265个文件约1.93MB包含45个JSP页面、24个Java源文件与24个class文件另有SQL建库脚本、jar依赖、css/js/图片等静态资源及doc/docx说明文档目录结构便于按模块查阅与二次开发。已有1615人学习下载适合作为课程作业、毕业设计原型或Java Web入门练手项目可据此梳理Servlet分层、数据库表设计与后台管理模块的实现思路。1. 网上作业批改系统 JAVAMysql先装环境再谈功能网上作业批改系统 JAVAMysql 这套环境最容易翻车的不是代码写没写对而是版本先撞墙。解压后把 war 直接丢进 Tomcat 10日志里一串javax.servlet找不到或者 JDK 17 跑老编译级别类加载阶段就报Unsupported class file major version。课程作业场景里这种包很常见装不好就是登录页都出不来数据库表还停在导入一半。适合手里已经拿到压缩包、想在本地或内网把它跑起来的人先按 JDK、Tomcat、MySQL 三件套核对版本再谈建库和部署。血泪经验是先把环境摊开比急着改代码省一晚上。2. 版本核对JDK 8/11/17、Tomcat 8.5/9 与 MySQL 5.7/8.0解压之前先别急着找startup.bat这套包的结构决定了后面是用外置 Tomcat 还是java -jar。我一般先看压缩包清单再解压到独立工作目录避免和系统里已有的 Tomcat、MySQL 混在一起。版本核对不是形式JDK 编译级别、Servlet 包名、MySQL 驱动类这三处只要错一个启动日志就会给出一堆看似“代码坏了”的报错实际都是环境没对齐。下面按“看结构、配 JDK/Tomcat、选 MySQL”三步走。2.1 解压后先看三处pom.xml、WEB-INF/lib、SQL 脚本先只列清单不解压# -l 只列压缩包内容sed 取前 80 行先看顶层目录和关键文件 unzip -l 网上作业批改系统JAVAMysql.zip | sed -n 1,80punzip -l不会改动磁盘适合先判断包里有没有pom.xml、WEB-INF/web.xml、*.sql、README。如果顶层直接是WEB-INF/、META-INF/大概率是传统 Web 工程后面要放 Tomcat 的webapps如果顶层有pom.xml先看packaging是war还是jar这决定部署方式。确认结构后再解压# 解压到独立目录避免污染系统已有 Tomcat mkdir -p /opt/edu-homework/src unzip 网上作业批改系统JAVAMysql.zip -d /opt/edu-homework/src解压后把关键文件捞出来cd /opt/edu-homework/src # maxdepth 限制 4 层避免扫到依赖包深处重点找构建文件、Web 描述符、SQL 和连接配置 find . -maxdepth 4 -type f \( \ -name pom.xml -o -name web.xml -o -name *.sql \ -o -name jdbc.properties -o -name db.properties \ -o -name application*.yml -o -name application*.properties \ \)看到pom.xml就再确认打包方式# 看 packaging 标签war 走 Tomcatjar 且带 spring-boot 插件才考虑 java -jar grep -n packaging pom.xml grep -n spring-boot-maven-plugin pom.xml如果只有WEB-INF/lib没有pom.xml不用硬上 Maven直接把整个 Web 目录或 war 放进 Tomcat 即可。传统项目还要看web.xml的 Servlet 版本版本太老时别配 Tomcat 10# 看 web.xml 声明的 Servlet 规范版本3.0/3.1 常见于 Tomcat 7/8/9 时代项目 grep -n version WEB-INF/web.xml | head这一步的产出不是一张漂亮清单而是三个判断项目是 war 还是 jar、连接配置在jdbc.properties还是application.yml、SQL 脚本有没有自带CREATE DATABASE。后面建库和改连接串都靠这三条先看清楚比装到一半再回头翻包省事。2.2 JDK 与 Tomcat 的版本匹配别让 javax 和 jakarta 打架JDK 选 8、11 还是 17不要凭“新就是好”。先看pom.xml的编译级别# 查编译源码和目标字节码版本没有 pom 就跳过改看 WEB-INF/lib 里的依赖 jar grep -nE maven.compiler|source|target|java.version pom.xml如果看到1.8优先用 JDK 8 或 11 跑看到11就用 JDK 11看到17再考虑 JDK 17。JDK 17 跑 JDK 8 编译的类通常能启动但反射、模块化访问和旧版字节码工具可能抛InaccessibleObjectException这类问题在日志里很像业务异常实际是运行时版本不匹配。Tomcat 这边重点看WEB-INF/lib里有没有servlet-api、javax.servlet相关 jar# 只看依赖包文件名快速判断是 javax 时代还是 jakarta 时代 find WEB-INF/lib -maxdepth 1 -type f -name *.jar \ | sed s#.*/## | sort \ | grep -E servlet|mysql|spring|mybatisTomcat 8.5 和 9 使用javax.servletTomcat 10 开始切到jakarta.servlet。老项目直接扔进 Tomcat 10典型报错是ClassNotFoundException: javax.servlet.http.HttpServlet页面 404 或 500日志里一片红。常见做法是用 Tomcat 9 对齐旧包改代码包名成本高不适合安装阶段折腾。可以按下面这张表快速取舍看到的特征优先选原因pom.xml编译级别 1.8依赖里有javax.servletJDK 8/11 Tomcat 8.5/9包名和字节码都匹配改动最少编译级别 11WEB-INF/lib里没有jakarta字样JDK 11 Tomcat 9避免 JDK 17 模块化反射问题编译级别 17依赖里出现jakarta.servletJDK 17 Tomcat 10新包名体系旧 Tomcat 反而不兼容还有一处容易漏Tomcat 自身运行也需要JAVA_HOME。如果系统里同时装了多个 JDKjava -version和 Tomcat 实际使用的 JDK 可能不是同一个。启动前用echo $JAVA_HOME和readlink -f $(which java)对一遍Windows 下用where java和echo %JAVA_HOME%。这个检查只要十秒能省掉后面半小时的“为什么编译能过、Tomcat 起不来”。2.3 MySQL 5.7 与 8.0 的差异驱动、时区、排序规则MySQL 版本先看本机装的是什么mysql --version再看 SQL 脚本头部的建库语句和排序规则# 重点看有没有 8.0 专属排序规则以及是否自带 CREATE DATABASE / USE grep -nE utf8mb4_0900|utf8mb4_general_ci|CREATE DATABASE|ENGINE *.sql | head -n 20MySQL 8.0 默认排序规则常见utf8mb4_0900_ai_ci5.7 不认识这个排序规则导入时会报Unknown collation。如果本机是 5.7把脚本里的utf8mb4_0900_ai_ci替换成utf8mb4_general_ci再导入如果本机是 8.0保留默认也可以但连接串要带时区参数。驱动类同样有差异MySQL 8.0 驱动用com.mysql.cj.jdbc.Driver老 5.x 驱动用com.mysql.jdbc.Driver。连接串里serverTimezone不配日志可能报The server time zone value is unrecognized用东八区写GMT%2B8即可在 URL 里要编码成%2B。JDBC URL 还要注意useSSL和allowPublicKeyRetrieval。本地或内网演示环境没有证书时useSSLfalse能减少握手报错MySQL 8 默认caching_sha2_password老驱动连不上时要么升级驱动要么给应用账号改用兼容认证方式。常见连接串形态如下参数在下一章建完库后再逐项替换# 这是 MySQL 8 驱动写法5.7 老驱动把 driver 改成 com.mysql.jdbc.Driver jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/homework_db?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8useSSLfalseallowPublicKeyRetrievaltrue jdbc.usernamehw_app jdbc.passwordChangeMe_2024useUnicodetrue和characterEncodingutf8解决中文传输serverTimezoneGMT%2B8解决时间字段偏移allowPublicKeyRetrievaltrue只建议在受控内网用公网环境不要图省事一直开着。版本核对到这一步三件套的取舍基本清楚JDK 跟编译级别走Tomcat 跟 Servlet 包名走MySQL 跟 SQL 脚本里的排序规则走。3. 安装 JDK 与 Tomcat 9JAVA_HOME、8080 端口和 war 部署这一章按 Linux 和 Windows 两条线写命令和路径都放在独立工作目录里不覆盖系统已有环境。JDK 装完必须验证JAVA_HOME和java -version指向同一套Tomcat 装完先改端口和编码再放 war。顺序反过来也能跑但一旦 404 或端口冲突排查面会变大。下面以 JDK 8/11、Tomcat 9 为例Tomcat 8.5 的操作基本一致。3.1 JDK 安装与 JAVA_HOMEWindows 和 Linux 各一条检查命令Linux 下解压 JDK 到工作目录# 创建独立目录tar 解压 JDKjdk-8u*-linux-x64.tar.gz 按实际文件名替换 sudo mkdir -p /opt/edu-homework sudo tar -zxf jdk-8u*-linux-x64.tar.gz -C /opt/edu-homework ls -d /opt/edu-homework/jdk*tar -zxf中的-C指定解压目标避免在当前目录散落一堆文件。ls -d用来确认实际解压出来的目录名后面配JAVA_HOME要写这个真实路径不要照抄示例里的占位。写系统级环境变量# 写入 profile.d登录 shell 自动加载JAVA_HOME 换成上一步看到的真实目录 sudo tee /etc/profile.d/jdk.sh /dev/null EOF export JAVA_HOME/opt/edu-homework/jdk1.8.0_xxx export PATH$JAVA_HOME/bin:$PATH EOF source /etc/profile.d/jdk.sh java -version echo $JAVA_HOMEtee写文件比手工编辑少出错source让当前终端立即生效。java -version看版本echo $JAVA_HOME看路径两条都对才算装好。Windows 下用安装包或解压版都行管理员终端执行REM /M 表示写系统变量需要管理员权限路径按实际安装目录替换 setx JAVA_HOME D:\edu-homework\jdk1.8.0_xxx /M setx PATH %JAVA_HOME%\bin;%PATH% /Msetx不会影响已经打开的终端改完要新开一个命令提示符再用where java和echo %JAVA_HOME%验证。常见坑是 PATH 里旧 JDK 排在前面java -version显示的是另一个版本把%JAVA_HOME%\bin放到 PATH 前部或者直接删掉旧 JDK 的 bin 项。3.2 Tomcat 9 解压与 server.xml端口、编码、访问日志Tomcat 用解压版最干净不写注册表卸载就是删目录# 解压后改成固定目录名后面脚本和文档都好引用 sudo tar -zxf apache-tomcat-9*.tar.gz -C /opt/edu-homework sudo mv /opt/edu-homework/apache-tomcat-9* /opt/edu-homework/tomcat9改conf/server.xml里的 Connector。端口冲突时把 8080 改成 8081GET 请求中文参数乱码时加URIEncodingUTF-8!-- Tomcat 9 的 HTTP Connectorport 被占用就改 8081URIEncoding 管 GET 参数解码 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /connectionTimeout是连接超时毫秒数本地演示不用改太大redirectPort在 HTTPS 跳转时用没配证书可以保留默认URIEncoding对表单 POST 影响不大但对 URL 里带中文的查询参数很关键。启动和看日志# startup.sh 依赖 JAVA_HOME启动后立刻看 catalina.out 末尾 /opt/edu-homework/tomcat9/bin/startup.sh tail -n 100 /opt/edu-homework/tomcat9/logs/catalina.out日志里出现Server startup in才算启动完成。如果只看到Using CATALINA_BASE就停了多半是JAVA_HOME没配好或 8080 被占用。Windows 下对应bin\startup.bat看logs\catalina.*.log。还要确认防火墙或安全组放行端口内网访问用http://服务器IP:8080/不要用localhost在别的机器上试。3.3 部署 war 包与上下文路径ROOT、项目名和静态资源如果项目是 Maven war先打包cd /opt/edu-homework/src # -DskipTests 跳过测试安装阶段先保证能部署target 下找 war mvn clean package -DskipTests ls -lh target/*.war如果不是 Maven 项目就在解压目录里找现成 war或者把包含WEB-INF的整个目录作为应用目录。部署时把 war 复制到webappswar 文件名就是上下文路径# homework.war 部署后访问路径是 /homework先删旧解压目录避免旧 class 残留 cp target/*.war /opt/edu-homework/tomcat9/webapps/homework.war rm -rf /opt/edu-homework/tomcat9/webapps/homework /opt/edu-homework/tomcat9/bin/shutdown.sh /opt/edu-homework/tomcat9/bin/startup.shrm -rf清的是 Tomcat 自动解压出来的旧目录不是源包。Tomcat 启动时会重新解压 war如果旧目录还在可能出现“改了 war 但页面没变”的玄学现象。想直接用根路径访问把 war 改名ROOT.war但会覆盖 Tomcat 默认欢迎页更稳妥的是保留项目名访问/homework/。静态资源 404 时先看解压目录里有没有assets、static、css再看页面里引用路径是不是带上了上下文路径。4. 初始化 MySQL 5.7/8.0建库、导表与 JDBC 连接串数据库这一步分三件建库和账号、导入 SQL、改应用连接配置。顺序不要乱先有库和账号再导表最后改连接串。导入失败最常见的原因不是 SQL 语法而是字符集排序规则、脚本自带CREATE DATABASE、表前缀对不上。下面按可回滚的方式做导入前先备份空库状态出错可以直接删库重来。4.1 建库与账号字符集 utf8mb4、排序规则和最小权限用 root 登录 MySQL 后建库-- utf8mb4 兼容中文和 emojiutf8mb4_general_ci 在 5.7 和 8.0 都能识别 CREATE DATABASE homework_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 应用账号只给业务库权限不给全局权限 CREATE USER hw_applocalhost IDENTIFIED BY ChangeMe_2024; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON homework_db.* TO hw_applocalhost; FLUSH PRIVILEGES;utf8mb4比utf8更完整作业内容里出现特殊符号也不会截断。排序规则用utf8mb4_general_ci是为了兼容 5.7如果确定只跑 8.0也可以用默认排序规则但导入旧脚本时仍要检查脚本里有没有utf8mb4_0900_ai_ci。账号 host 写localhost表示只允许本机连接应用和数据库不在同一台时才考虑改成受控网段不要直接开%了事。MySQL 8 默认认证插件是caching_sha2_password老驱动连不上时可以在测试环境执行-- 仅在老驱动无法升级时使用生产环境优先升级驱动 ALTER USER hw_applocalhost IDENTIFIED WITH mysql_native_password BY ChangeMe_2024; FLUSH PRIVILEGES;执行完用应用账号登录一次确认权限和密码都通mysql -h 127.0.0.1 -P 3306 -u hw_app -p homework_db-h 127.0.0.1走 TCP不走 socket更接近应用连接方式。能进到mysql提示符说明账号、端口、库名三件事至少对了两件。4.2 导入 SQL 脚本source 命令、报错定位和表前缀导入前先看脚本头部确认它是否自带建库和USE# 看前 40 行判断脚本是否自己 CREATE DATABASE / USE避免重复建库报错 sed -n 1,40p homework.sql如果脚本不带建库语句用刚建好的库导入# 指定 homework_db脚本里的建表语句会落到这个库 mysql -u root -p homework_db homework.sql如果脚本自带CREATE DATABASE和USE就不要在命令行再指定库直接mysql -u root -p homework.sql否则可能出现“表建到了另一个库”的错觉。导入过程中报错会中断想继续看完所有错误可以进交互模式-- 进 mysql 后执行source 路径写绝对路径出错后立刻看 warnings SOURCE /opt/edu-homework/src/homework.sql; SHOW WARNINGS;导入完成先数表SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema homework_db; USE homework_db; SHOW TABLES;表数量对不上先看 SQL 脚本里是不是有表前缀比如sys_user、hw_homework。应用配置里的表前缀和脚本不一致时登录会报“表不存在”但数据库连接本身是通的这类报错要看 SQL 日志里的表名不要只盯连接串。导入前如果库里有旧表先确认能不能删测试环境可以DROP DATABASE homework_db重建内网演示环境至少先mysqldump备份。4.3 改连接配置jdbc.properties 与 application.yml 的字段对照传统 Web 项目常见jdbc.properties或db.properties字段名可能是jdbc.url、jdbc.username也可能是db.url、db.user。不要凭习惯改先打开文件看键名# 示例键名实际以项目文件为准MySQL 8 驱动用 cj 结尾的类 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/homework_db?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8useSSLfalseallowPublicKeyRetrievaltrue jdbc.usernamehw_app jdbc.passwordChangeMe_2024jdbc.url里127.0.0.1适合应用和数据库同机分机部署改成数据库内网地址。characterEncodingutf8是 JDBC 参数不是库的字符集两边都要对。serverTimezoneGMT%2B8里%2B就是的 URL 编码直接写有的驱动会解析成空格。allowPublicKeyRetrievaltrue只在受控内网开公网环境不要保留。如果项目是 Spring Boot 结构配置在application.yml字段对照如下spring: datasource: # 驱动类、URL、账号密码与 properties 版本一一对应 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/homework_db?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8useSSLfalseallowPublicKeyRetrievaltrue username: hw_app password: ChangeMe_2024改完配置要清一次 Tomcat 工作目录避免旧连接池配置被缓存# 清掉当前应用的编译缓存下次启动会重新解压 war rm -rf /opt/edu-homework/tomcat9/work/Catalina/localhost/homework /opt/edu-homework/tomcat9/bin/shutdown.sh /opt/edu-homework/tomcat9/bin/startup.shwork/Catalina/localhost/homework对应上下文路径homework项目名不同就换目录名。启动后看日志里有没有Communications link failure、Access denied、Unknown database这三类分别指向网络、账号、库名。连接池初始化失败不一定会让 Tomcat 起不来但登录页一点就 500所以配置改完必须进一次登录页验证。5. 避坑与排查404、连不上库、乱码和上传失败的现场记录安装阶段的问题大多有固定套路Tomcat 起来了但应用 404数据库账号能登录但应用连不上页面能开但中文乱码作业附件传不上去。下面四条按“现象 → 原因 → 解决”记录都是我实际踩过的翻车点。排查时先看日志时间戳再看最近改过的配置不要一上来就重装环境。5.1 启动即 404war 包名、上下文路径和 Tomcat 欢迎页现象浏览器打开http://服务器IP:8080/能看到 Tomcat 欢迎页但访问http://服务器IP:8080/homework/返回 404日志里没有明显异常。原因通常有三种war 文件名和访问路径不一致比如部署的是homework-1.0.war上下文路径就是/homework-1.0war 还没解压完就访问server.xml里配了Context指向旧目录覆盖了自动部署。还有一种容易误判项目其实是 Spring Boot jar根本没有WEB-INF扔进 Tomcat 当然 404。解决先看webapps下实际解压目录再按目录名访问# 看 war 和解压目录是否成对出现解压目录名就是上下文路径 ls -lh /opt/edu-homework/tomcat9/webapps tail -n 120 /opt/edu-homework/tomcat9/logs/catalina.out | grep -iE deploy|SEVERE|Exception如果目录是homework访问/homework/要带末尾斜杠如果目录是homework-1.0就访问/homework-1.0/。想固定路径把 war 改名成homework.war删掉旧解压目录后重启。日志里出现SEVERE: Error deploying web application archive时往上翻第一个Caused by通常是缺依赖或web.xml版本不兼容不要只看最后一行。5.2 数据库连不上驱动类、端口、时区和权限现象应用启动日志报Communications link failure或者登录时 500日志里Access denied for user hw_applocalhost也可能Unknown database homework_db。原因MySQL 没启动端口不是 3306bind-address只监听本机但应用在另一台账号 host 不匹配密码错驱动类还是旧的com.mysql.jdbc.DriverMySQL 8 认证插件和老驱动不兼容。这几种报错长得像但关键词不同先按关键词分流。解决先在本机用应用账号走 TCP 登录# 看服务状态和端口监听3306 没出现就先解决 MySQL 启动问题 systemctl status mysql ss -lntp | grep 3306 # 用应用账号走 TCP 登录模拟应用连接方式 mysql -h 127.0.0.1 -P 3306 -u hw_app -p homework_db本机能登录、应用不能登录再看应用和数据库是不是同一台机器。分机部署时账号 host 要覆盖应用来源地址或者建受控网段账号同时确认数据库配置文件里的bind-address没有只写127.0.0.1。驱动类报ClassNotFoundException时检查WEB-INF/lib里 MySQL 驱动 jar 是否只有一个版本旧版和新版混放也会出问题。5.3 中文乱码库表字符集、连接串和页面编码现象页面能打开但中文显示问号或者页面正常数据库里存进去的是????也有导入 SQL 后表注释乱码。原因库或表是latin1连接串没带characterEncodingJSP 页面没声明pageEncodingTomcat Connector 没配URIEncodingGET 参数中文先乱一次导入 SQL 时客户端字符集不对。乱码要看是哪一层不要只改页面。解决先查库表字符集SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME homework_db; SHOW CREATE TABLE homework;如果表是latin1按实际表名转换ALTER DATABASE homework_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE homework CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;连接串补useUnicodetruecharacterEncodingutf8Tomcatserver.xml的 Connector 补URIEncodingUTF-8JSP 页面头部确认有contentTypetext/html;charsetUTF-8和pageEncodingUTF-8。导入 SQL 时用mysql --default-character-setutf8mb4避免客户端按系统默认字符集解释脚本。三层都统一后再清缓存重启旧数据如果已经乱码只能重新导入或逐条修。5.4 上传附件失败目录权限、大小限制和临时目录现象提交作业附件时页面报 500日志里出现FileNotFoundException、Permission denied或者 Tomcat 报The temporary upload location is not valid。小文件能传大文件失败通常是大小限制。原因上传目录不存在Tomcat 运行用户对目录没有写权限maxPostSize或 Spring multipart 限制太小临时目录被系统清理。不要用chmod 777糊过去按运行用户授权更稳。解决建独立上传目录并授权# 上传目录放在应用外部升级 war 不会丢附件用户按 Tomcat 实际运行用户替换 sudo mkdir -p /opt/edu-homework/upload/homework sudo chown -R tomcat:tomcat /opt/edu-homework/upload/homeworkTomcat Connector 可以放开 POST 大小限制Spring 项目再配 multipart!-- maxPostSize-1 表示不限制 POST 大小内网演示可以公网要按业务设上限 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 maxPostSize-1 /spring: servlet: multipart p a hrefhttps://download.csdn.net/download/weixingxing_123/12716066 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p