
简介这份JavaEE课程设计资源以“高校宿舍管理系统”为完整案例面向需要完成SSH框架实战项目的在校生及初级Java开发者。系统采用Struts2、Spring、Hibernate整合架构覆盖用户管理、宿舍分配、宿舍信息维护、维修申请与数据统计五大功能模块能够帮助读者串联MVC分层、依赖注入、事务管理和ORM映射等核心知识点。压缩包共284个文件以java源码、jsp视图、xml配置、jar依赖为主另有docx课程设计报告和sql数据库脚本整体大小32.7MB便于直接导入开发环境进行学习与二次开发。资源在CSDN已有3643人学习下载内容组织清晰报告记录需求分析与设计思路脚本完成建库建表源码展示控制器、服务、模型及视图层的协作方式适合用来理解企业级应用从需求到落地的全过程也为课程设计答辩和项目实训提供了可参考的完整范例。1. 拿到JavaEE课程设计全套之后先搞懂它在解决什么问题很多人在网上下载到“JavaEE课程设计全套.zip”之后第一反应是解压、找README、双击startup.bat恨不得一分钟之内看到登录页面。但现实往往是环境变量没配、JDK版本不对、数据库脚本导不进去、Tomcat启动就报错最后在QQ群里刷屏求助。这个压缩包本质上不是“一个能直接跑的项目”而是一套按JavaEE课程设计要求组织的完整交付物——它包含源码、数据库脚本、项目文档、部署说明甚至答辩PPT和演示录屏。你在做的事情不是“解开一个压缩包”而是把它还原成一套能运行、能讲解、能改写的JavaEE应用并最终让它变成你自己的课程设计成果。这篇笔记我会从拿到ZIP之后的完整落地路径讲起覆盖技术栈识别、Maven构建、VSCode环境配置、常见翻车现场和答辩前的打磨方向。2. 识别压缩包里的技术栈选型判断决定你后续的工作量2.1 从包结构倒推框架三秒钟区分SSH、SSM和纯Servlet解压之后先不要急着导IDE先打开文件夹看骨架。一个项目的框架选型从包名和配置文件就能读出来。我会按照下面的顺序排查先看根目录有没有pom.xml或build.gradle如果有说明这是个Maven或Gradle工程依赖管理是集中的如果没有那就是传统的Web工程依赖靠lib目录下的jar包硬塞。第二步看src/main/java下的包结构。如果看到struts2、com.opensymphony.xwork2相关包或struts.xml那是SSH方案Struts2 Spring Hibernate多见于2015到2018年之间的老课设。如果看到org.springframework.stereotype.Controller、org.springframework.web.bind.annotation.RequestMapping同时还有mybatis或者mapper包那就是SSM方案Spring SpringMVC MyBatis这是目前存量课设里最常见的形态。如果什么都没有只有javax.servlet.http.HttpServlet直接继承的类那就是最朴素的Servlet JSP方案这种项目虽然原始但反而是最容易跑起来的——它对框架版本几乎不敏感。打开WEB-INF/web.xml再看一眼。SSM项目的web.xml里会配置DispatcherServlet并指定contextConfigLocation指向applicationContext.xml和spring-mvc.xml。SSH项目则会配置StrutsPrepareAndExecuteFilter或者FilterDispatcher。Servlet方案则是一堆servlet和servlet-mapping标签。这里有一个容易被忽略的细节web.xml的头部version属性如果是3.1说明这个项目原本按Servlet 3.1规范开发配套Tomcat 8.5以上如果还是2.3或2.5就要保持web.xml存在且用WEB-INF/lib方式部署别手贱改成注解版。2.2 分层架构与包命名看懂controller/service/mapper这三层不管是什么框架课设项目的Java包结构基本都是三层加一个实体层。常见的包名是com.xxx.system.controller、com.xxx.system.service、com.xxx.system.dao或com.xxx.system.mapper再加一个com.xxx.system.entity或com.xxx.system.model。这里我要强调一个判断技巧你不需要看懂每一个类的内部逻辑只需要把三个关键入口打开看一眼。第一个是controller层里的方法——看它是否通过Autowired或Resource注入了service接口第二个是service实现类——看它是否调用了mapper接口的方法第三个是mapper接口——看它是否和src/main/resources/mapper目录下的XML文件通过namespace关联。这个链路走通项目的主干就理解了。如果发现某个service实现类里直接用JdbcTemplate拼SQL或者mapper XML文件的SQL写了一大段动态if判断和foreach循环那说明这个课设在数据访问层是下了功夫的你答辩的时候可以重点讲这块。我见过不少同学拿到ZIP之后第一件事就是全局搜索“TODO”和“百度文库痕迹”然后把作者信息改掉。这种表面功夫在答辩时漏洞百出。真正该做的是把每个类的职责写在一张纸上然后照着包结构图来讲老师问一个你答一个比背稿子有用得多。2.3 数据库脚本人手必查utf8mb4与建表顺序的坑全套ZIP里一般会有doc或sql目录放.sql脚本。这个文件是整个项目的“命根子”但我每次帮人调课设遇到的第一场灾难几乎都出在这里。先看SQL脚本的开头有没有CREATE DATABASE语句。如果没有你需要自己建库然后USE进去再导入。如果有先别执行打开看看DEFAULT CHARSET写的是什么。很多老课设还在用utf8这在存储中文时没问题但如果你在项目里做全文检索、或者用户输入了Emoji表情、或者存了一些特殊字符比如某些生僻字utf8会直接报错或丢字符。我通常的做法是把脚本里的utf8全部替换成utf8mb4把utf8_general_ci或utf8_unicode_ci替换成utf8mb4_general_ci然后用下面的方式导入mysql -uroot -p --default-character-setutf8mb4 book_db.sql这里说明一下为什么加--default-character-setutf8mb4如果你本机的MySQL客户端默认字符集是latin1或gbk执行SQL脚本时字符串字面量会先按客户端字符集解释再转换成表定义的字符集存储。转换过程遇到编码映射不到的字符就会变成乱码或问号。这个参数强制客户端用utf8mb4解码脚本内容源头不出错后面页面显示才可能正常。另一个高频坑是表之间的外键关联和插入顺序。如果脚本里有FOREIGN KEY约束但INSERT语句按字典序先插子表后插父表导入必然失败。处理办法很简单mysql SET FOREIGN_KEY_CHECKS 0; mysql SOURCE /path/to/book_db.sql; mysql SET FOREIGN_KEY_CHECKS 1;提示不要只在MySQL里把命令敲一遍就完事导入完之后用SHOW TABLES和SELECT COUNT(*) FROM每张核心表跑一下确认记录数和脚本中INSERT语句条数对得上。很多时候脚本执行到一半报错你又没开事务表里就是残缺数据。3. 用Maven把课设从源码变成可部署的WAR包最小闭环配方3.1 pom.xml依赖集合Spring版本宁可保守不要激进ZIP里的项目如果是Maven结构第一件事是打开pom.xml把parent、properties和dependencies读一遍。我会先把所有版本号抄出来与本地Maven仓库已有的版本对照。如果版本冲突比如Spring-core是5.3.20、spring-webmvc却是5.1.5大概率会运行时报NoSuchMethodError因为Spring不同模块的类在运行时对方法签名极其敏感。对于JavaEE课设我最推荐的依赖配方是Spring统一用5.3.x不要用Spring 6因为Spring 6把javax.servlet全部换成了jakarta.servlet你的代码里全是javax.servlet.http.HttpServletRequest一启动就NoClassDefFoundErrorMyBatis用3.5.xMyBatis-Spring用2.0.xMySQL驱动用8.0.x的com.mysql:mysql-connector-j连接池用Druid 1.2.x。这套组合在JDK 8和JDK 11下都能编译运行VSCode和IDEA都支持得很完整。下面是一个最小可用的pom.xml核心片段properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding spring.version5.3.27/spring.version /properties dependencies dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring.version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version${spring.version}/version /dependency !-- MyBatis与Spring集成必须用mybatis-spring版本与mybatis版本配套 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.10/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.7/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.32/version scoperuntime/scope /dependency !-- servlet-api必须provided否则Tomcat会和部署包里的jar冲突 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version3.1.0/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- 输出JSON用的课设接口返回Ajax数据时必不可少 -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.13.4/version /dependency /dependencies这里解释三个关键选择第一maven.compiler.source和target设成1.8不是说本机不能装新JDK而是让Maven编译器把字节码级别锁在Java 8这样不管放到哪台装JDK 8/11的机器上都能跑兼容面最宽。第二mysql-connector-j的scope是runtime因为代码里不会直接import这个类的API运行时才用打WAR包时不需要把驱动塞进WEB-INF/lib也行——不过课设为了省事scope不写或写compile也没问题Tomcat会优先加载WEB-INF/lib下的。第三javax.servlet-api必须provided否则你打出的WAR包里会带一份servlet-api.jarTomcat加载类时遇到重复类轻则告警重则java.lang.LinkageError。3.2 applicationContext.xml与spring-mvc.xml两个文件管好所有BeanSSM项目的Spring配置一般拆成两个文件applicationContext.xml管Service、Mapper、数据源spring-mvc.xml只管Controller、视图解析器和静态资源放行。很多人把数据源和注解驱动全部写在一个文件里能跑但很乱答辩时讲不清楚。我一般会保持拆分的做法下面给出一个能直接跑通的配置骨架。!-- applicationContext.xml数据源与MyBatis -- context:property-placeholder locationclasspath:jdbc.properties/ bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ property nameinitialSize value2/ property namemaxActive value8/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ property nametypeAliasesPackage valuecom.example.book.entity/ /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.book.mapper/ /bean!-- spring-mvc.xmlController层与静态资源 -- context:component-scan base-packagecom.example.book.controller/ mvc:annotation-driven/ mvc:default-servlet-handler/ bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views// property namesuffix value.jsp/ /bean关于这里面的参数有三处值得停下来看。第一DruidDataSource设置了initialSize2和maxActive8意思是应用启动时就建立2个物理连接最大能涨到8个。课程设计的并发量撑死几十个人同时在线8个连接绰绰有余调大了反而浪费MySQL的线程资源。第二SqlSessionFactoryBean的typeAliasesPackage配了实体类的包这样在mapper XML里写parameterTypeBook就不用写全限定类名——但千万别在XML里把别名和类名搞混一旦写了不存在的别名MyBatis启动时才报错不会提前暴露。第三mvc:default-servlet-handler是这个配置里最容易漏的一行。缺了它JSP页面里的静态资源CSS、JS、图片会被DispatcherServlet拦截返回404你检查半天发现Controller没问题其实是静态资源没放行。3.3 打WAR包与验证war:war之前的三个检查点执行mvn clean package之前我会习惯性检查三件事避免打完包才发现问题。第一src/main/webapp/WEB-INF/web.xml是否存在。Maven的maven-war-plugin默认把src/main/webapp当作Web根目录但有些项目从Eclipse导出来webapp目录被命名为WebContent或WebRoot这时候你要么改目录结构要么在pom里显式配置warSourceDirectorybuild finalNamebook-system/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version configuration warSourceDirectoryWebContent/warSourceDirectory /configuration /plugin /plugins /build第二检查本地Maven仓库里有没有下载好的依赖。很多同学第一次运行mvn clean package时卡在下载半天不动原因是公司或校园网无法访问中央仓库。解决方式是在~/.m2/settings.xml里配置阿里云镜像代码如下mirrors mirror idaliyun/id mirrorOfcentral/mirrorOf nameAliyun Maven Mirror/name urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrors第三直接执行打包并观察结果mvn clean package -DskipTests如果控制台输出BUILD SUCCESS在target目录下会生成book-system.war。这个WAR包就是你的交付物。拷贝到Tomcat的webapps目录下启动Tomcat后它会自动解压部署。如果输出一堆[ERROR]优先看是依赖解析失败还是编译错误。依赖解析失败就换镜像重试编译错误则逐行看最常见的两个错误是package javax.servlet does not exist——说明servlet-api没配或scope配错cannot find symbol: method orm()——说明Spring或MyBatis版本不配套需要统一版本号。4. 用VSCode配置JavaEE语言环境从JDK到Tomcat的完整落地4.1 为什么这套课设用VSCode比Eclipse更省心但凡用过Eclipse跑过老课设的人多少都被.classpath、.project、Dynamic Web Module版本和Deploy Assembly折磨过。VSCode的优势在于它对Maven项目是“直接打开就能识别”不依赖工作区缓存它的Java语言服务器Eclipse JDT Language Server负责代码补全和编译诊断配置路径清晰它启动Tomcat调试的方式比Eclipse更接近命令行运维习惯。更重要的是课程设计答辩现场如果用VSCode演示代码结构和注解看得清楚老师印象分会好一些。但要注意VSCode本身不是IDE它需要一组扩展配合才能当成JavaEE开发环境。装完之后一定要用JDK 17运行VSCode的语言服务器同时让编译目标保持在Java 8两者的关系是“运行时环境高版本编译产出低版本”。4.2 三个关键扩展与settings.json核心配置打开VSCode扩展市场按顺序装三样东西Extension Pack for Java微软官方全家桶内含语言服务器、调试器、Maven支持、测试运行器、Tomcat for VS Code由Red Hat维护支持直接在编辑器里启动/停止Tomcat查看部署状态、MyBatisX如果你确认项目是MyBatis这个插件能让你从Mapper接口跳到XML反过来也能Debug时非常有用。装完扩展后按CtrlShiftP打开命令面板输入Java: Configure Classpath检查当前项目的JDK是否匹配。如果你的机器装了两个JDK比如8和17需要打开settings.json手动指定哪个JDK负责jdt.ls运行{ java.configuration.runtimes: [ { name: JavaSE-1.8, path: C:\\Program Files\\Java\\jdk1.8.0_202, default: true }, { name: JavaSE-17, path: C:\\Program Files\\Java\\jdk-17.0.5 } ], java.debug.settings.console: internalConsole, maven.executable.path: D:\\apache-maven-3.8.8\\bin\\mvn.cmd, tomcat.port: 8080 }说明一下这些参数的实际效果java.configuration.runtimes不只是给编译器用的它还决定了语言服务器启动时加载的JDK。如果这里只写了JDK 8而没写17扩展包本身可能因为Class版本问题报错如果只写17项目又会提示“source 1.8 的选项不受支持”。两个都写把低版本设为default是最稳的。maven.executable.path用来指定Maven可执行文件位置如果机器上配了系统环境变量不写也行但写了可以避免VSCode找不到mvn命令。tomcat.port是Tomcat插件的默认端口如果宿主机的8080被占用这里的数字要改等你启动之后还要同步修改Tomcatserver.xml里Define的Connector端口两处不一致的话插件显示启动成功但你浏览器访问被拒。4.3 在VSCode里启动Tomcat并把WAR包部署进去打开Tomcat for VS Code扩展面板会看到TOMCAT SERVERS列表。第一次打开时列表是空的点击“Add Tomcat Server”选择本地Tomcat的解压目录目录下必须能看到bin和conf。添加成功后右键这个Server选择“Start”控制台窗口会出现Tomcat的启动日志。接着部署WAR包有两种方式。方式一把target/book-system.war直接拖到Tomcat面板里的服务器节点上插件会自动复制到Tomcat的webapps目录并触发部署。方式二右键服务器节点选择Open Web App然后在弹出的浏览器里访问http://localhost:8080/book-system注意是/book-system不是/除非你把WAR包名字改成ROOT.war。这里有一个很多新手不理解的逻辑Tomcat插件显示的启动日志里如果出现SEVERE: Error deploying web application archive book-system.war不要慌这不一定是你代码的问题。直接打开Tomcat的logs/localhost.log看堆栈第一行如果是ClassNotFoundException: org.springframework.web.context.ContextLoaderListener说明WAR包里的WEB-INF/lib没有Spring的jar——回Maven重新打包关注maven-war-plugin是否把依赖真正打进去了如果是BeanCreationException说明Spring容器初始化失败去查applicationContext.xml里的Bean配置多半是数据源连不上或mapper XML路径不对。4.4 编译版本错误与Classpath缺失这两个拦路虎在VSCode里写JavaEE课设最多见的两个报错信息需要单独拎出来说因为它们看起来像“环境问题”实际是配置问题。第一个是java: error: release version 17 not supported。这个意思是语言服务器正在尝试用JDK 17的编译器编译你的代码但pom里maven.compiler.target是1.8。解决办法不是改pom而是确认VSCode的settings.json里有没有把JDK 8设为default。如果Extension Pack for Java的语言服务器始终加载JDK 17你需要按CtrlShiftP执行Java: Clean Java Language Server Workspace它会重启语言服务器并按你配置的JDK重新扫描。别小看这一步很多人改了配置却不生效就是这个原因——语言服务器缓存了上一次的JDK路径。第二个是The import javax.servlet cannot be resolved。这个报错不一定说明servlet-api没配更多时候是因为VSCode的classpath里没有包含Tomcat的lib/servlet-api.jar。右键项目选择Java: Add Jar to Classpath然后选择Tomcat解压目录下lib里的servlet-api.jar。注意这一步只影响VSCode编辑器里的语法检查不会改变Maven构建行为。最终打WAR包时还是以pom.xml里的providedscope为准——不打包进WAR但编译期可见。5. 避坑JavaEE课设里最易翻车的五个高频问题5.1 页面和数据库全是乱码三层编码失效现象页面显示中文全是问号或菱形符号数据库里查出来也是乱码但控制台日志正常。原因信息流经过了“数据库连接 → SQL解析 → JSP渲染”三个环节任何一环字符集不一致都会翻车。最常见的是jdbc.url忘了加characterEncodingutf8或者MySQL表的字符集是latin1又或者JSP页面没声明pageEncoding。解决先在jdbc.properties里把URL补全jdbc.urljdbc:mysql://localhost:3306/book_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai然后把每个JSP页面头部的指令写成这样% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %最后确认数据库表已经是utf8mb4。如果你执行过ALTER TABLE t_book DEFAULT CHARACTER SET utf8mb4;但发现已有的数据还是乱码那说明乱码是在字符集切换之前就写入的历史数据只能通过schema重建或者CONVERT函数修复。检查顺序是先看浏览器开发者工具里的Content-Type响应头再查JSP指令最后查数据库——别在Tomcat里瞎调server.xml的URIEncoding那是GET请求参数的编码问题跟显示乱码是两码事。5.2 启动时数据库连接失败Access denied与Communications link failure现象Tomcat启动后后台日志抛出Access denied for user rootlocalhost或者Communications link failure页面直接500。原因Access denied说明用户名或密码错误或者MySQL里的root账号不允许从当前主机连接。Communications link failure则多半是端口不对、MySQL服务没启动、或者serverTimezone没有正确配置导致驱动在握手阶段抛异常。解决先在本机命令行确认MySQL能连上mysql -uroot -p -h127.0.0.1 -P3306能连上再回头看jdbc.properties里的jdbc.url。如果你用的是MySQL 8.0驱动driverClassName必须写com.mysql.cj.jdbc.Driver写com.mysql.jdbc.Driver会直接抱怨Loading class com.mysql.jdbc.Driver is no longer supported。如果确认都要没问题还有一个最隐蔽的坑DruidDataSource的validationQuery默认是SELECT 1这在MySQL 8.0下没问题但如果你用的Druid版本低于1.1.10且数据库是MySQL 8.0连接池启动时会做心跳校验连不上会正常报错——解决办法是升级Druid到1.2.x。这一条尤其容易出现在老课设的ZIP里因为2018年前的Druid版本对MySQL 8.0的支持确实有缺陷。5.3 访问页面404或静态资源丢失现象浏览器访问http://localhost:8080/book-system/login时出现404但Tomcat启动日志没有任何异常或者页面HTML正常但CSS和JS全部加载失败。原因404分两种情况。第一种是web.xml里的DispatcherServletURL映射配成了/导致Spring MVC接管了所有请求但Controller里没有处理/login这个路径的RequestMapping第二种是web.xml的servlet-mapping写成了/*注意/*的优先级高于/它会拦截所有请求包括JSP文件本身导致JSP页面被当成Controller映射处理永远404。静态资源丢失的根因则是DispatcherServlet拦截了.css和.js的请求却没有配置处理资源映射。解决把web.xml里的URL模式改回/然后在spring-mvc.xml里保留mvc:default-servlet-handler/并在Controller类上检查一下到底映射了什么路径。如果源码里Controller没有类级别RequestMapping方法上的路径就是最终路径把浏览器地址和它保持一致即可Controller RequestMapping(/system) public class BookController { RequestMapping(/login) public String login() { return login; } }这时代码访问路径是/system/login不是/login。很多人忽略类头上的RequestMapping(/system)对着旧世界恳谈的地址找半天这是新手答辨讲解时最容易暴露的硬伤。5.4 Tomcat运行时内存溢出Metaspace与堆外泄漏现象Tomcat跑了一晚上或连续操作某个功能几十次之后后台日志出现java.lang.OutOfMemoryError: Metaspace或者GC overhead limit exceeded然后页面卡死。原因课程设计项目很少因为业务并发量打爆堆内存最常见的是两种情况一是每次请求都创建了新的对象但没有释放典型出现在使用PreparedStatement后不关闭、ResultSet不关闭、或者自定义的Filter里持有了请求对象的引用二是Tomcat的Metaspace默认上限是无穷的JDK 8之后但随着项目热部署次数增加类加载器泄漏导致Metaspace越涨越高。解决先在bin/catalina.shLinux或bin/catalina.batWindows里加一段JVM参数把指标放出来JAVA_OPTS-Xms256m -Xmx512m -XX:MaxMetaspaceSize256m -XX:PrintGCDetails -XX:PrintGCDateStamps然后重新启动Tomcat观察GC日志。如果Metaspace持续上涨不回落基本可以判定为类加载器泄漏——这时候要检查是否在代码里用了ThreadLocal且没有remove()或者是否在静态集合里缓存了大对象。课设级别最常见的ThreadLocal用法是存当前登录用户Filter里设置了请求结束后没有清理这就会导致用户对象被线程长期持有。修复很简单public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { try { User user userService.findByToken(token); ThreadLocalHolder.set(user); chain.doFilter(request, response); } finally { ThreadLocalHolder.remove(); } }5.5 JSON返回却拿到HTML错误页现象Controller方法上标注了ResponseBody预期浏览器拿JSON但实际拿到的是Tomcat的404或500 HTML错误页。原因漏配了mvc:annotation-driven/或者配了但jackson-databind不在依赖里Spring MVC无法将返回值序列化成JSON只能抛出HttpMediaNotAcceptableException最终被默认错误页接管。解决确认spring-mvc.xml里有mvc:annotation-driven/同时pom.xml里有jackson依赖见我3.1节写的那个配方。改完之后记得mvn clean package重新打WAR包别直接在Tomcat运行目录里替换class——很多人在VSCode里按了CtrlF5热重载以为代码更新了实际上Tomcat插件默认打开的是重新部署但会忽略掉target/classes之外的资源更新。最稳的办法是把WAR包删掉再拖一次或者直接停服务器重启。6. 把课设从“能跑通”打磨到“能答辩”最后一个星期的三个技巧离答辩还有一个星期的时候我建议你做三件事。第一件事是录一个演示动线视频从启动MySQL、启动Tomcat、打开登录页、走完一个带事务的业务闭环比如“用户下单 → 扣库存 → 生成订单”每一步停留三秒以上。这个录屏既是答辩当天机器崩盘时的后悔药也是你讲稿的底稿。第二件事是给核心Controller和Mapper方法补注释不要写“获取页面”这种废话要写“依据前端通过Ajax传入的userId与bookId执行库存扣减并返回最新库存”。答辩老师不看项目是你写的还是下载的只看你能不能讲清楚那个关键的业务逻辑。第三件事是做一个A3纸的项目架构图把浏览器、Controller、Service、Mapper、数据库五条线画出来用红笔标出你参与过的哪怕只是改写过的代码位置——这张纸能在你紧张忘词时帮你撑住节奏。最后一个私人的建议VSCode确实能配置JavaEE语言环境我也会把JDK、Maven和Tomcat的配置步骤截图放在演示PPT里这比嘴上说“我用的IDEA”更能体现工程素养。课程设计不是要你造一个生产级系统但“能讲清楚边界、能说得出参数、能修得掉问题”这三个标准至少能保证你在任何一台机器上把项目跑起来。希望你拿到这个ZIP后不是焦头烂额地应付检查而是借它把JavaEE一整条链路彻底摸透希望帮到你。本文还有配套的精品资源点击获取