简介面向Java方向毕业设计场景这套基于SSM框架的娱乐影视公司管理系统适合计算机专业学生完成课程设计或毕设开发。系统采用B/S架构与MySQL数据库按管理员和艺人两类角色划分权限管理员负责全局数据维护可管理艺人资料与活动通告艺人登录个人后台后能查看基本资料、日常活动通知和公司公告功能覆盖影视公司日常运营环节如艺人信息维护、活动通告发布、公告管理、个人后台展示等。压缩包内共456个文件总大小35.38MB主要包含图片格式界面截图、Java源码、JSP动态页面、编译后的class文件、依赖JAR包、XML配置与SQL建表脚本并配套说明文档和演示视频方便对照部署与二次开发。目前已有104人学习项目结构完整、权限边界清晰压缩包目录按源码、数据库、说明文档和演示视频分组适合作为毕设选题参考、功能扩展基础或答辩演示素材。1. Java毕设里的SSM影视管理系统为什么多数人卡在跑不起来这一关每年毕业季Java毕设的选题里总有一批“基于SSM框架的XX管理系统”娱乐影视公司管理系统就是其中很典型的一个。这类项目表面看是SSMSpring SpringMVC MyBatis全家桶的CRUD但真正把压缩包拿回来新手最先遇到的不是业务代码看不懂而是JDK版本不对、Tomcat起不来、MySQL密码不匹配、Maven依赖拉不下来这一连串环境问题。我见过太多人代码看了三遍没看出问题最后发现是本地装的JDK 17和SSM这套老框架不兼容。这篇文章按我自己的落地路径来讲——从SSM三层架构怎么拆解到数据库初始化、Maven依赖配置、登录鉴权和影视节目的增删改查怎么写再专门用一章讲我踩过的坑。如果你拿到的也是类似的SSM毕设工程跟着走一遍至少能把环境问题和项目结构问题消掉大半后面改业务逻辑才有底气。适合三类人正在做毕设的本科生、想拿SSM练手的Java后端初学者以及接了外包需要快速交差的人。2. 先拆SSM三层架构和这个影视管理系统是怎么对上的2.1 Spring的IoC容器到底管住了哪些对象SSM三个框架各自负责一件事Spring管对象创建和依赖注入SpringMVC管HTTP请求的路由分发MyBatis管SQL和结果集的映射。很多新手把SSM当作一个整体去背配置一旦报错就全盘抓瞎。实际上遇到问题先判断它落在哪一层比盲目改配置靠谱得多。这个影视管理系统里Spring的IoC容器主要管理三类BeanService层业务对象、Dao层Mapper接口、以及数据源和事务管理器。以影视节目管理为例ProgramService接口的实现类被容器实例化后注入到Controller里开发时不需要手动new而是通过Autowired或XML配置里的property标签把依赖“装配”进去。这样做的好处是后续想把数据库从MySQL换成别的只需要改数据源配置Service层的代码一行不用动。2.2 SpringMVC的请求流转一次“新增影视节目”操作经历了什么一次前端表单提交请求先到达DispatcherServlet它根据URL找到对应的RequestMapping(/program/add)方法把参数绑定到Program实体对象上然后调用Service层完成业务逻辑最后返回视图名由视图解析器拼出JSP页面路径。这个流转链路里新手最容易出问题的是参数绑定——表单字段名和实体属性对不上后端一直拿到null。以新增节目为例我的习惯是让JSP表单里的name属性严格对齐Program实体的字段名比如programName、director、releaseDate避免在Controller里人工做参数搬运。Controller接收参数时直接用实体对象作为方法入参SpringMVC会自动完成绑定。返回路径写program/list视图解析器配置了前缀/WEB-INF/views/和后缀.jsp最终渲染/WEB-INF/views/program/list.jsp。2.3 MyBatis的Mapper层XML文件维护SQL比注解更省心这套毕设项目的数据库操作我倾向于用Mapper XML方式而不是注解。因为影视公司管理系统的查询条件会比较杂——按节目类型查、按上线状态查、按上映时间范围查动态SQL在XML里写whereif标签非常趁手。而注解写动态SQL要靠script标签可读性差很多。Mapper接口里定义一个ListProgram selectByCondition(ProgramQuery query)对应的XML里写动态条件拼装。注意MyBatis的别名配置实体类包名com.company.entertainment.entity下所有类都配了别名XML里写resultTypeProgram即可不用每次写全限定名。3. 环境准备与项目初始化拿到源码压缩包后按这份清单走3.1 基础环境版本这一步错后面全崩我把这套SSM项目跑通时用的是一套比较保守的版本组合也建议你先跟着用确认没问题再升级。JDK用的1.8——SSM诞生的年代本来就是JDK 7/8许多网上流传的毕设项目代码里没用到高版本特性但高版本JDK反而会因为移除了某些模块导致运行报错。Tomcat用8.5系列Maven用3.6.xMySQL用5.7。MySQL 8.0也能跑但驱动要换com.mysql.cj.jdbc.Driver还要额外指定时区参数新手没必要在环境这一步给自己加码。先检查本地Java环境命令行执行java -version确认是1.8。然后确认Maven的settings.xml里用了阿里云镜像否则拉Spring相关依赖可能慢到怀疑人生配置如下mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror注意这里改的是Maven安装目录下的conf/settings.xml不是项目里的pom.xml。配置完镜像执行mvn clean compile能快速验证依赖能不能拉全这一步比直接启动Tomcat更快暴露问题。3.2 从压缩包导入IDEA项目结构先看清再动代码解压出来的文件夹命名经常带中文或空格比如影视公司管理系统(ssm)直接导入IDEA偶尔会导致路径解析异常。我的习惯是先重命名成纯英文小写目录比如entertainment-ssm再作为Maven项目导入。导入后先看三样东西根目录的pom.xml、src/main/resources下的Spring配置文件、src/main/webapp/WEB-INF/web.xml。pom.xml里重点关注packaging是不是war以及Spring、SpringMVC、MyBatis三个核心依赖的版本号。老项目经常会遇到javax.servlet还是jakarta.servlet的差异问题——SSM时代用的是javax如果你本地的Tomcat 10以上默认走jakarta直接冲突。所以别贪新Tomcat 8.5配javax.servlet最稳妥。web.xml是SSM整合的入口里面通常配置了ContextLoaderListener加载Spring根容器、DispatcherServlet加载SpringMVC容器以及字符编码过滤器。这三个配置一个都不能少少了就出现“Service为null”或“中文乱码”。filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping注意观察你的源文件里有没有这段配置。很多毕设项目在代码里做了request.setCharacterEncoding(UTF-8)但那个只对POST请求有效而过滤器能处理所有请求的编码。如果漏配且代码里没手动处理表单提交的中文基本必乱。参数上编码过滤器要放在所有过滤器最前面确保后续任何环节读到的参数都是解码后的正确UTF-8字符串。3.3 初始化数据库导入SQL脚本的两种方式和验证压缩包里的SQL文件命名通常是entertainment.sql或lyys_db.sql。先看清楚里有没有CREATE DATABASE语句。如果有直接命令行导入即可如果没有需要先手动建库再导入。我一般用第二种方式因为建库名和字符集可以由自己控制避免脚本里写死在奇怪的地方。MySQL命令行执行mysql -u root -p -e CREATE DATABASE IF NOT EXISTS entertainment_db DEFAULT CHARACTER SET utf8mb4; mysql -u root -p entertainment_db entertainment.sql导入后验证进入MySQL执行USE entertainment_db; SHOW TABLES;正常能看到用户表sys_user、演员表actor、节目表program、合同表contract之类的业务表。如果表数量明显偏少说明SQL脚本执行过程中有过报错别直接进入下一步回头检查是不是字符集问题导致中途失败。顺带说一句这版的SQL脚本里表名和字段名都是小写英文字母没有用任何MySQL关键字所以不需要额外加反引号。万一你拿到的脚本表名正好叫order记得要么改表名要么所有SQL都加反引号否则执行到那一段就会报语法错误。4. 核心模块落地登录鉴权、影视节目CRUD和角色控制4.1 写登录逻辑别只在Controller里比对用户名密码很多SSM毕设项目的登录就是一条SQL查出来比对登录成功后往Session里塞一个用户对象就完事。这么做跑通是能跑通但有两个问题一是密码明文存放在数据库里库里数据一泄露全部账号裸奔二是没有任何拦截器用户直接在浏览器输入内页URL就能绕过登录。虽然毕设对安全性的要求不高但如果你之后拿着这个项目去面试这两点都是被追问的地方。登录Controller的写法我一般这样处理Controller RequestMapping(/login) public class LoginController { Autowired private SysUserService sysUserService; RequestMapping(value /doLogin, method RequestMethod.POST) public String doLogin(String username, String password, HttpSession session, Model model) { SysUser user sysUserService.login(username, DigestUtils.md5DigestAsHex(password.getBytes())); if (user ! null) { session.setAttribute(loginUser, user); return redirect:/program/list; } model.addAttribute(error, 用户名或密码错误); return login; } }逻辑说明这里把密码的比对放到了Service层Controller只负责取参数、调服务、决定返回视图。DigestUtils是Spring自带的MD5工具类避免自己手写加密算法。但注意MD5本身并不安全只能防“明文存储”这种最低级的问题如果你想加分可以改成BCrypt加密Spring Security里自带BCryptPasswordEncoder但集成起来会多不少配置毕设项目按需取舍。参数说明DigestUtils.md5DigestAsHex接收的是字节数组所以先用password.getBytes()把字符串转成字节再加密。实际项目中还会拼接盐值再加密比如password user.getSalt()这里从简。登录失败返回login视图同时把错误信息塞进ModelJSP页面用${error}显示提示。另一个需要处理的点是“记住我”功能。如果项目里有这个选项常规做法是用Cookie存一个加密后的用户标识但加密时机和登录态失效逻辑容易出错。我的建议是毕设里先不做Cookie版只在Session层面做代码量小且不容易暴露问题。4.2 登录拦截器不加这个你前面写的登录等于白写只写了登录接口还不够要确保没登录的人访问不了内页。SSM里最简洁的做法是写一个HandlerInterceptor在web.xml里不需要额外配置因为它是SpringMVC层面的而是在spring-mvc.xml里注册。拦截器代码public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); SysUser user (SysUser) session.getAttribute(loginUser); if (user null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }逻辑说明preHandle在Controller方法执行前被调用返回false表示请求被拦下true放行。这里判断Session里有没有登录用户没有就重定向到登录页。注意写request.getContextPath()而不是写死路径项目部署时上下文路径改了也能正常工作。spring-mvc.xml里配置拦截器注意放行登录相关的URL和静态资源mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/css/**/ mvc:exclude-mapping path/js/**/ mvc:exclude-mapping path/images/**/ /mvc:interceptor /mvc:interceptors参数说明路径匹配用Ant风格。/**匹配所有路径/css/**放行样式资源。很多人漏了静态资源放行会导致登录页样式全丢看起来像网页坏掉。拦截器注册的位置要在spring-mvc.xml里和视图解析器、注解驱动在同一个配置文件。如果项目里同时有多个拦截器比如还有个管理员权限校验器执行顺序和配置顺序一致注意别把权限拦截器放在登录拦截器前面否则没登录的用户直接被权限拦截器挡了根本走不到登录判断。4.3 影视节目CRUDMyBatis动态SQL是关键影视公司的核心业务数据是节目包含节目名称、类型电影/电视剧/综艺、导演、主演、上线日期、状态筹备中/已上线/已下架等字段。列表页需要支持按类型筛选、按名称模糊查询这就是动态SQL发挥作用的地方。先看Mapper接口定义public interface ProgramMapper { ListProgram selectByCondition(Param(programName) String programName, Param(programType) Integer programType); Program selectById(Integer id); int insert(Program program); int update(Program program); int deleteById(Integer id); }对应的XML文件片段select idselectByCondition resultTypeProgram SELECT * FROM program where if testprogramName ! null and programName ! AND program_name LIKE CONCAT(%, #{programName}, %) /if if testprogramType ! null AND program_type #{programType} /if /where ORDER BY create_time DESC /select逻辑说明where标签会自动处理第一个条件前的AND——如果条件都不成立这条SQL就退化成无条件的全表查询对应的SQL是SELECT * FROM program ORDER BY create_time DESC如果有条件成立MyBatis会自动去掉第一个条件之前的AND。这里用LIKE CONCAT(%, #{programName}, %)而不是直接在Java里拼好字符串防止SQL注入同时CONCAT确保参数中即使包含%或_只被当作普通字符处理的可能性也提高了严格来说还要转义但毕设项目做到这个程度基本够了。参数说明Param注解定义了XML中引用的参数名。programType用Integer包装类型而不是int这个细节决定了条件判断里! null是否有效。如果用基本类型intMyBatis会把0和null混在一起判断导致类型值为0时条件不生效。这类问题如果遇到“查询条件明明选了类型结果全部数据显示出来了”基本就是包装类型和判断条件的锅。insert语句需要注意主键回填影视节目的id是自增主键插入后可能需要用到这个id做关联处理。在XML里配置insert idinsert parameterTypeProgram useGeneratedKeystrue keyPropertyid INSERT INTO program (program_name, program_type, director, leading_actor, release_date, status, create_time) VALUES (#{programName}, #{programType}, #{director}, #{leadingActor}, #{releaseDate}, #{status}, NOW()) /insertuseGeneratedKeystrue表示使用数据库生成的主键keyPropertyid告诉MyBatis把生成的主键值写回传入实体对象的id字段。这样在Service层执行完insert后直接program.getId()就能拿到新纪录的id省去一次额外查询。4.4 角色控制管理员和普通员工的权限差异影视公司管理系统通常有两种角色管理员可以删除数据和管理用户账号普通员工只能做数据录入和查看。这个用拦截器也能做在Session里存用户的role字段然后针对特定路径做判断。更讲究一点可以在数据库表设计时就用一个role字段区分。我一般会在Service层做权限判断而不只是在拦截器里写死路径。因为拦截器只能判断URL路径控制不到“同一个人对不同数据实体的操作权限”。假设一个普通员工想删除某条节目数据拦截器放行后Controller调用了删除Service你在Service里再判断一次当前登录用户角色是管理员才执行deleteById这样防御纵深更可靠。判断时从SecurityUtils这类工具类取当前登录用户这个类我通常放在common包里本质是从ThreadLocal或Session里取用户信息。public void deleteProgram(Integer id, SysUser operator) { if (!ADMIN.equals(operator.getRole())) { throw new BusinessException(只有管理员才能删除节目数据); } programMapper.deleteById(id); }逻辑说明把operator作为参数传入Service比在Service里直接拿Session更利于测试——单元测试时可以直接构造一个用户对象传入而不需要mock整个Session。这里用了自定义的BusinessException来抛业务错误全局异常处理器捕获后转向错误提示页面避免了500页面直接裸露给用户。5. 避坑与排查SSM项目跑不起来的五个常见问题5.1 Tomcat启动报错ClassNotFoundException: org.springframework.web.context.ContextLoaderListener现象启动Tomcat后项目部署失败日志里明确找不到ContextLoaderListener这个类。原因Spring的jar包没有发布到Tomcat的WEB-INF/lib目录下。IDEA里虽然Maven依赖列表里能看到Spring的包但部署时没有“打包进war”的动作。本质上是项目的打包配置或Artifacts配置不对。解决检查IDEA的项目结构中Artifacts设置确认Output Layout里包含了lib目录并且所有Maven依赖被选中。最简单的方式是直接跑mvn clean package打war包看war文件的WEB-INF/lib下有没有spring-web-*.jar。如果没有回到pom.xml确认scopeprovided/scope没有误加在Spring依赖上——这个scope通常只用在servlet-api这类容器自带的依赖上。5.2 启动成功但页面全是404控制台没有任何报错现象Tomcat正常启动访问登录页却404控制台也没有异常输出。原因项目没有被部署到Tomcat的webapps下。IDEA里虽然配置了Tomcat但Deployment里没加Artifact或者加了但Application context设置成了带版本号的路径。解决在IDEA的Run Configuration里确认Deployment页签下有exploded war的ArtifactApplication context设置为/。这样访问地址就是http://localhost:8080/login而不是http://localhost:8080/xxx_war_exploded/login。题外话这里顺带说一句很多SSM毕设项目的Controller上标注的RequestMapping(/login)是从类路径开始的如果项目上下文带了额外路径所有URL都要在前面拼上项目名这是新手最容易困惑的一个点。5.3 数据库连接报错Access denied for user rootlocalhost现象页面能打开但只要一查数据库就报这个错或者启动时数据源初始化失败。原因项目的jdbc.properties里配置的数据库账号密码和本地的MySQL不一致。SSM压缩包里配置的密码经常是作者的密码比如123456而你本机的root密码可能不一样。解决打开src/main/resources/jdbc.properties修改jdbc.username和jdbc.password为本机MySQL的实际账号密码。注意jdbc.properties里如果有jdbc.url中包含时区参数serverTimezoneAsia/Shanghai确认MySQL版本是否支持MySQL 5.7的驱动不需要这个参数但也不报错MySQL 8.0则必须指定否则报时区错误。5.4 页面中文乱码数据库里存的也是乱码现象插入的中文数据变成???或者影视这种乱码。原因链路中某个环节的字符集不是UTF-8。可能涉及四个方面JSP页面编码、请求编码过滤器、数据库表字符集、MySQL连接URL的字符集参数。少一个环节都可能导致最终落库乱码。解决按顺序排查——JSP页面顶部确认contentTypetext/html; charsetUTF-8和pageEncodingUTF-8web.xml确认编码过滤器已配置且url-pattern是/*数据库表用SHOW TABLE STATUS LIKE program看Collation是否为utf8mb4_general_cijdbc.url里加上characterEncodingutf8。改完重启Tomcat重新插入数据测试。如果数据库里已经坏了的数据直接DELETE掉重新来没必要修复。5.5 修改了Java代码但运行还是旧效果现象改完Controller代码重新部署但行为没变化。原因IDEA的web项目热部署没生效或者Tomcat缓存了旧的class文件。SSM项目因为是传统war包方式Spring的注解扫描是在容器启动时完成的改了Java代码必须重启Tomcat才能生效。改JSP不需要重启因为JSP会被实时编译。解决检查Run Configuration里On frame deactivation是否选的是Update resources这个选项只能更新静态资源和JSP想改Java代码就自动重启的话选Update classes and resources但依然会触发Tomcat的reload。最稳妥的还是在IDEA控制台里手动重启Tomcat别依赖热部署。如果你正在debug模式下用IDEA的DevTools功能也会失效因为SSM没有默认集成DevTools留意别把Spring Boot的习惯带进来。6. 进阶验证与美化给SSM项目加测试、加日志、提质量6.1 写一个Spring集成测试验证Mapper能不能查通很多人验证SSM项目的方式是启动Tomcat然后手动点页面。这个方法能覆盖80%的功能验证需求但有个盲区——Service层和Mapper层的逻辑只能依赖页面间接验证出错时定位困难。更有效的方式是写一个Spring集成测试直接测试Mapper和Service。RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations {classpath:spring/spring-dao.xml, classpath:spring/spring-service.xml}) public class ProgramMapperTest { Autowired private ProgramMapper programMapper; Test public void testSelectByCondition() { ListProgram list programMapper.selectByCondition(流浪地球, null); Assert.assertNotNull(list); Assert.assertTrue(list.size() 0); } }逻辑说明ContextConfiguration指定Spring的配置文件位置。注意这里只加载了dao层和service层的配置文件没有加载spring-mvc.xml因为测试不涉及Web层。如果项目配置文件的命名不一样按实际路径改。参数说明classpath:前缀表示从classes目录下找配置文件。测试运行前确保Maven的test阶段能访问到src/test/resources下的配置文件同时确保测试类不会被Maven打包进war里默认就不会。测试类放在src/test/java目录对应包名与主代码一致。6.2 给登录模块写一个接口验证用例避免每次手动造数据除了做数据库层面的测试控制层的请求路径和参数也需要有验证手段。SSM项目里最不折腾的方式是配置MockMvc来模拟请求而不需要真正启动Tomcat。看配置RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations {classpath:spring/spring-mvc.xml, classpath:spring/spring-dao.xml, classpath:spring/spring-service.xml}) public class LoginControllerTest { private MockMvc mockMvc; Before public void setup() { mockMvc MockMvcBuilders.standaloneSetup(new LoginController()).build(); } Test public void testLoginSuccess() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post(/login/doLogin) .param(username, admin) .param(password, 123456)) .andExpect(MockMvcResultMatchers.status().is3xxRedirection()); } }逻辑说明这里用standaloneSetup手动构建了LoginController的MockMvc环境不走完整的Spring容器加载优点是测试启动快缺点是无法覆盖到拦截器和AOP逻辑。如果想验证登录拦截器是否生效需要使用webAppContextSetup配合完整的WebApplicationContext。参数说明.param()设置的参数名要和Controller方法入参名一致。is3xxRedirection()是因为登录成功后的逻辑是redirect:/program/list返回的是302重定向状态码isOk()对应200。两张断言要分清不然会得到一个“测试失败了”的误导性结果。6.3 加一段日志输出打印SQL和参数排查效率直接翻倍SSM项目里排查问题的最大障碍是——不知道MyBatis执行了什么SQL、传入了什么参数、查出了多少条数据。很多人面对“查询结果不对”时只能靠猜。其实MyBatis打印SQL的日志配置很简单核心在于logimpl这个参数。# mybatis-config.xml 或 spring-dao.xml 中的数据源配置 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl配置在spring-dao.xml里通常是这样bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mybatis/mapper/*.xml/ property nameconfigLocation valueclasspath:mybatis-config.xml/ /bean然后在mybatis-config.xml里设置configuration settings setting namelogImpl valueSTDOUT_LOGGING/ /settings /configuration逻辑说明STDOUT_LOGGING表示MyBatis把SQL日志直接输出到控制台不需要额外的日志框架配合。配置后每次执行Mapper方法控制台会输出 Preparing:和 Parameters:两行前者是带?占位符的实际SQL后者是对应参数值。参数说明logImpl的可选值有SLF4J、LOG4J、STDOUT_LOGGING、NO_LOGGING等。毕设项目里直接选STDOUT_LOGGING最小化配置改动如果项目里已经集成了Log4j 2并配置了log4j2.xml那么换成SLF4J并确认mapper的namespace下日志级别为DEBUG。注意修改mybatis-config.xml后需要重建项目让配置生效。这条配置保存调试时间的效果立竿见影。我印象最深的一次是我刚接触SSM时遇到一个查询条件不生效的bug不断怀疑是自己SQL写错了但SQL看起来就是正确的。后来打开日志一看实际执行的SQL里条件根本没拼进去——问题不是SQL错而是传入的条件参数是null。从那一刻起我养成了先开日志再调试的习惯。6.4 上线前最后过一遍从这份清单查漏补缺项目做完准备演示或部署到服务器之前有几件事值得按顺序过一遍。数据库连接密码不要用太简单的组合至少不要和源码里示例密码完全相同检查JSP页面中是否有硬编码的绝对路径比如写了/upload/xxx.jpg部署后上下文路径变化会导致图片404测试账号的密码如果用了MD5加密确认注册时加密逻辑和登录时一致否则会出现“注册成功但登录永远失败”的现象。部署到服务器时Linux上MySQL默认大小写敏感Windows不敏感所以表名字段名的大小写一致性也要检查避免出现本机能跑服务器上却报“表不存在”的情况。不会改Linux防火墙就先把Tomcat端口确认一下用curl http://localhost:8080自测这一步过了再对外提供服务。回头看看刚开始拿到这个毕设压缩包时的那种无从下手其实就是缺少一个有序的拆解路径。先解决环境和依赖再按链路把登录、CRUD、拦截器逐个跑通最后用日志和测试把隐患找出来。这套方法不只能跑通这一个影视管理系统换成图书管理、酒店管理、二手交易套路都一样。SSM这套体系虽然老了但分层的思想、配置的思路、排错的手段换到Spring Boot上依然能用。希望帮到你。本文还有配套的精品资源点击获取