基于SSM框架的视频分类管理系统设计与实现要点 1. 项目概述与选题定位1.1 视频分类管理系统到底是做什么的毕业设计选题目很多计算机专业的学生都会纠结一个问题选一个太简单的怕过不了答辩选一个太复杂的又怕自己搞不定。视频分类管理系统正好卡在中间这个合适的位置既不是纯增删改查的“管理系统”那么单薄又不像电商秒杀系统那样动不动就要分布式架构、高并发、缓存一致性这些让本科生头疼的东西。先说清楚这个系统是干什么的。视频分类管理系统本质上是一个带权限控制的多用户视频资源管理平台核心职责包括视频信息的上传与维护视频重命名、简介编辑、封面图替换视频分类的树形管理一级分类、二级分类、分类排序按分类、关键词对视频进行检索和过滤用户的注册与登录、管理员后台的统一管理播放量、收藏量等基础数据的统计展示前端可浏览、可播放后台可管理、可审核也就是说它是一个“前台展示 后台管理”的完整Web应用。前台面向普通访客或注册用户后台面向管理员两者在权限上做了区分这正好对应了毕业设计考核里“需求分析—模块设计—数据库设计—编码实现—测试部署”这条完整链路。1.2 为什么这个选题每年都有人做但每年都值得做先别急着说“老套”。我在线下带过几届学生的毕业设计每年都有人提交类似选题但做得好和做得差的差距非常大。原因在于这个系统有两个隐性要求第一它必须有一个完整的前后端交互流程。视频列表、分页加载、分类筛选、详情查看、后台管理每一步都涉及请求如何从浏览器出发经过控制器、服务层、持久层最终回到页面渲染。这套流程吃透以后无论换成什么技术栈都是同一套思维。第二它天然适合展示SSM框架的分层优势。SSM指的是Spring、SpringMVC、MyBatis这三个框架的组合是Java Web领域非常有代表性的轻量级开发框架组合。Spring负责对象管理SpringMVC负责请求分发MyBatis负责数据库操作三层各司其职。而视频分类这类业务数据关系清晰、逻辑适中用SSM来做正好能把这些分层体现得明明白白既不显得生搬硬套又能让答辩老师看到你确实理解了框架的用法。1.3 适合什么人参考这份项目如果你是下面这几类人这个项目解剖起来会很有参考价值计算机相关专业的本科生正在选题或者已经选了类似系统需要一份能讲清楚设计思路的参考自学的同学打算用SSM框架练手想找一个小而完整的项目作为学习路线上的里程碑想转Java开发方向、但苦于没有项目经历的求职者这类系统虽然不算高深但足够帮你走通“项目—部署—演示”的闭环我写这篇文章不会把一大堆代码贴上来就完事。重点放在设计思路、数据库表结构的设计原因、核心功能的实现逻辑以及我在实际开发和调试中踩过的坑。你能顺着这篇文章把一个模糊的系统标题逐步拆解成可落地的代码结构那这篇内容的目标就算达成了。2. 整体架构设计与技术选型2.1 为什么选用SSM而不用更“轻”的方案很多同学会问现在都2026年了Spring Boot都出到第三版了为什么毕业设计还在用SSM这里要分清两个概念开发效率和学东西的深度是两回事。Spring Boot确实把大量配置自动完成了写起来很爽但它同时也把“这背后发生了什么”这件事给遮蔽了。SSM的每一个配置文件、每一条映射关系都是显式的你需要自己理解Spring容器是怎么启动的、SpringMVC是怎么把一个URL映射到方法的、MyBatis是怎么动态拼接SQL的。答辩的时候老师最喜欢问的一个问题就是“你的SSM框架三个框架分别承担什么职责”如果是用Spring Boot做的项目这个问题就变成了“你用的这个脚手架底层是怎么工作的”后者的难度明显高不少。而从学习的角度看SSM的很多理念被Spring Boot继承了先弄懂SSM再去看Spring Boot基本是降维打击。另外从运行环境的角度来说SSM项目通常打成WAR包部署在Tomcat上这种部署方式在很多老系统中仍然大量存在。你不是在学一个“被淘汰的技术”而是在学一个“还在支撑大量生产环境的成熟组合”。严肃一点说框架会变但分层思想、事务控制、ORM映射这些底层能力是长存的。2.2 系统功能模块的拆分与职责划分在动手写代码之前我建议你先在纸上画出功能模块图。视频分类管理系统最基础、最稳妥的模块拆分是下面这样登录注册模块用户注册、用户登录、管理员登录、退出登录密码采用加密存储视频分类模块管理视频的一级分类和二级分类支持分类的增删改查视频信息管理模块视频信息的上传录入、编辑、删除、批量上下架前台展示模块视频列表展示、按分类展示、视频详情页、模糊搜索、分页浏览收藏与播放模块用户收藏视频、管理员或内容维护者查看播放数据评论管理模块前台视频评论、后台评论审核与删除你仔细看这里的模块划分其实是按照“功能职责”而不是按“用户级别”来切的。开发的时候每个模块对应一个Controller、一组Service接口及其实现类、一组Mapper接口和XML映射文件。一个模块开发完再进入下一个模块心里会非常清楚自己现在在写哪一块也不会出现代码纠缠的问题。当然这个模块列表不是唯一的。你可以根据自己的需求增加“公告管理”“友情链接”“轮播图”等模块。但我的建议是功能不要贪多。把上面这七个模块做深做透每张表都有完整的字段每个页面都有对应用的功能比挂了十个功能但每个都是空壳子要好得多。2.3 二类分类与树形结构的设计思考视频分类管理系统里“分类”两个字是核心中的核心。为什么这么说因为整个系统的检索逻辑都是建立在分类体系上的。如果分类设计得不好后续做按分类筛选时就会出现要么查不到、要么查得非常慢的问题。在实际设计中我推荐采用“两级分类”模式。第一级是大的类别比如“电影”“电视剧”“纪录片”“综艺”第二级是更细致的分类比如“电影”下面分“动作”“科幻”“爱情”或者按地区分“国产”“欧美”“日韩”。为什么是两级而不是三级、四级因为对于毕业设计而言两级分类既能展示“父级—子级”的关联查询和页面上的树形展示效果又不至于让递归逻辑复杂到把自己绕进去。数据库层面分类表的设计有两种思路一种是所有分类存放在同一张表里通过parentId字段区分层级另一种是一级分类一张表、二级分类另一张表。我更推荐第一种也就是统一的分类表加一个parentId字段上级分类的parentId为0。这种设计的好处是后期想扩展成三级分类时不需要改表结构只要加数据就行。页面上展示的时候先查询parentId为0的一级分类再在循环中通过一级分类的id查询对应的二级分类。虽然会多几次查询但数据量不大性能完全够用而且逻辑非常直观。如果把分类和视频表关联起来就比较关键了。通常的做法是视频表只保存二级分类的id然后通过二级分类表关联到一级分类。为什么不让视频表直接保存一级分类id因为这样会导致数据冗余同一个视频既存了一级分类又存了二级分类如果某一天你要修改分类层级就得把整个视频表里的数据全部更新一遍。只存二级分类一级分类由关联关系动态推导就规避了这个问题。2.4 开发环境与工具清单做这个项目环境搭建议不要出幺蛾子。我整理了一个个人推荐的清单直接照着配就行工具/环境推荐版本说明JDK1.8SSM项目最常见的Java版本稳定兼容性最好Maven3.6.x依赖管理和项目构建比手动导jar包省太多事Tomcat8.5稳定版本JDK1.8配Tomcat8.5是最常见组合MySQL5.7教学中使用率最高的数据库版本IDEA任意较新版本开发使用的集成开发环境前端技术JSP JSTL CSS JavaScript与SSM整合最方便的前端方案值得说一下的是确实有一些同学喜欢把前端改成Vue、用前后端分离的方式来做。这个思路本身没有问题但如果你是为了毕业设计求稳我建议绝大部分页面用JSP和模板就够了。原因很简单SSM和JSP的整合是一条非常成熟且资料极多的路线模板引擎渲染服务端数据尤其方便答辩时你演示一个页面刷新就能看到查询结果逻辑链条一目了然。引入了Vue以后你还要额外处理跨域、前后端数据格式约定、异步加载顺序等问题等于把项目的复杂度抬了一个台阶。3. 核心功能实现详解3.1 视频上传与信息录入的实现细节做视频分类管理系统最核心的功能除了分类浏览之外就是视频信息的录入。这里要明确一个容易理解偏差的地方视频分类管理系统通常不会像视频网站那样真的把视频文件上传到自己的服务器尤其是大文件视频动辄几百MBTomcat默认的文件大小限制根本扛不住。在毕业设计这个场景下我建议采用这样的方案视频主文件存放在外部对象存储上传页面只保存视频的URL地址和封面图URL地址。表面上看这是个妥协的简化方式但实际上更贴近真实的业务模式——现在很多内容平台也是这么干的把不需要算力的资源放在对象存储服务上应用服务器只处理业务逻辑和数据存储。如果确实想实现文件上传到本地服务器那么必须调整SpringMVC的文件上传配置同时注意Tomcat对POST请求大小的限制。常见的做法是在springmvc.xml中配置CommonsMultipartResolver然后把maxUploadSize参数设置成一串内存中看起来很大的数字。这里我提醒一个细节如果你做了视频文件本地上传一定要在运维层面做磁盘容量监测。很多学生项目跑在个人电脑上磁盘满了以后用户上传视频接口会突然全部返回失败而且Tomcat日志里只有一片令人绝望的栈异常信息很难排查。3.2 视频列表的加载方案一个视频分类管理系统视频列表页面是最常被打的地方。用户进入系统看到的第一个页面上要展示一堆视频每个视频有封面、标题、分类、播放量看起来没什么特别的但这里有一个很重要的设计矛盾是把全部视频一次性加载出来还是分页加载很多同学为了图省事习惯写一个selectList方法把整张视频表的数据全部查出来再在JSP页面循环输出。这种做法在数据量只有几十条的时候完全看不出问题但当你录入几百条测试数据后页面加载速度会明显变慢浏览器渲染大量DOM节点时的卡顿感也会让答辩演示变得非常尴尬。这里我推荐使用PageHelper分页插件来实现。它本身就是为MyBatis量身定制的分页组件在使用上极其简单。在查询视频列表之前调用PageHelper.startPage(pageNum, pageSize)紧接着执行的MyBatis查询会自动被拦截并生成带LIMIT参数的SQL。你不需要自己改SQL、不需要手动拼接动态条件这对初学者来说非常友好。我之前见过一些同学为了表达自己“理解原理”手写了基于拦截器的分页工具类结果在答辩时一页能查出20条但总记录数始终不对折腾了半天。对于毕业设计来说能稳的人才是真的专业。搜索功能同理。在前台页面上做模糊查询直接使用LIKE CONCAT(%, #{keyword}, %)这样的写法和参数绑定。这里注意一个使用细节使用${}直接拼接字符串确实也能实现但会产生SQL注入风险。虽然当下页面可能没有恶意用户但这个问题一旦被答辩老师问到你你一定要能立刻回答出区别。3.3 后台管理模块的权限控制思路前台页面和后台页面可以放在同一个项目里但权限控制必须划分清楚。最简单的实现方案是使用SpringMVC的拦截器机制自定义一个HandlerInterceptor在请求进入Controller之前检查session中是否存在已登录的管理员信息。如果不存在直接重定向到登录页面。如果存在再放行。这个方案虽然简陋但它是理解权限控制的一个很好起点。如果你愿意更进阶一点可以在数据库中加入一张管理员角色表、在管理员表里加角色字段然后扩展拦截器实现“不同角色看到不同菜单”的粗略权限控制。我不建议在毕业设计阶段引入Spring Security或Shiro这类安全框架不是因为它们不好而是因为它们会让你的项目多出大量配置和理解成本而且答辩时很难三言两语把你的实现逻辑讲清楚反而让自己陷入被追问细节的困局。后台管理页面的设计上我倾向于采用经典的左侧菜单栏、右侧内容区布局。左侧高亮当前选中的菜单右侧通过iframe嵌入对应功能页面。这个布局方式虽然经典老派但胜在结构清晰评审老师一眼就能看出来你做了后台框架的布局工作。3.4 分类管理树形结构的页面渲染分类管理页面的难点是如何在页面上展示无限层级的树形结构。很多同学一想到“树形”就觉得必须用zTree插件或者ElementUI的Tree组件其实对于只有两级分类的系统来说直接使用前端页面嵌套循环就能解决。后台分类管理页面上你可以用两层的嵌套循环第一层遍历一级分类列表第二层遍历每个一级分类下的二级分类列表。每个分类项旁边都放置“编辑”和“删除”两个按钮并把分类id传到后台以便后续执行修改和删除操作。这里有一个很典型的坑专门提醒你注意删除一级分类时如果它下面还有二级分类你不能直接把一级分类删除干净了事。否则数据库里会出现一批“孤儿”二级分类它们指向一个不存在的上级分类。视频数据更是如此你的一级分类一删底下所有视频的归属就全乱了。合理的设计是删除一级分类之前先检查该分类下是否存在二级分类如果存在前端弹出提示要求先清空或迁移子分类同时也要检查该分类下是否有视频数据。如果视频表里大量数据的分类id都指向这个即将被删除的分类最简单可靠的做法是直接禁止删除。我当时带一个学生做了类似的系统他信心满满地把分类删除功能写完然后拿了一批测试数据去删“电影”这个分类结果“电影”下面还有“科幻”“动作”两个子分类。由于他没有做检查程序直接把“电影”删了后续用户访问视频列表时根据视频表里保存的二级分类id去关联一级分类名称怎么都关联不上页面上所有的分类名全部显示为空白。排查了好几个小时才反应过来是孤儿数据造成的。3.5 用户收藏与视频播放记录如果你想让自己的项目在功能上更有亮点可以在用户端增加“收藏”功能。用户在前台视频详情页点击收藏后端就往收藏表里插入一条用户id与视频id的关联记录。这个功能虽然简单但它涉及一个设计问题同一个用户重复点击收藏时程序应该怎么办比较好的做法是在收藏表上对user_id和video_id这两个字段建立唯一索引然后在Service层执行插入操作之前先做一次查询。如果发现当前用户已经收藏过这个视频就直接返回一个“请勿重复收藏”的提示。这种做法虽然多了一次查询但对毕业设计来说比直接依赖数据库异常捕获要更稳妥也更容易讲清楚逻辑。如果你想做得更有技巧一点可以在前端页面根据当前用户是否已收藏该视频来动态切换按钮文案未收藏时显示“收藏”已收藏时显示“已收藏”点击时再通过Ajax发送请求给后端实现收藏或者取消收藏。这个改动不复杂但能明显提升系统交互的丰富程度是答辩演示里的一个加分项。播放量统计也是同类道理。在视频详情页被请求时执行一条update video set play_count play_count 1 where id #{id}即可。这里千万别用“先查询原播放量再加一”的方式并发情况下数据会不对。直接用SQL的字段自增写法最安全、最简洁。3.6 数据库核心表的结构设计数据库设计是整个项目的地基。地基不牢后面全在打补丁。下面我把最核心的几张表罗列出来并简单说明字段设计的意图。分类表category字段名类型说明idint主键自增namevarchar(50)分类名称parent_idint父级分类id一级分类为0sort_orderint排序值数值越小越靠前create_timedatetime创建时间视频信息表video字段名类型说明idint主键自增titlevarchar(100)视频标题category_idint所属二级分类idcover_urlvarchar(255)封面图地址video_urlvarchar(255)视频播放地址descriptiontext视频简介play_countint播放量statustinyint状态0下架1上架create_timedatetime创建时间用户表user字段名类型说明idint主键自增usernamevarchar(50)用户名唯一passwordvarchar(100)密码加密存储nicknamevarchar(50)昵称create_timedatetime创建时间管理员表admin结构和用户表类似但字段可以增加一个level或者role用来区分超级管理员和普通管理员。实际操作中更常见的做法是分开两张表管理员表就是管理员表用户表就是用户表两者不混在一起。因为和用户相比管理员的身份和权限约束都不一样单独成表在后台管理模块的登录和权限校验中会清爽很多。另外两张表收藏表和评论表字段设计就相对常规了。收藏表里保存user_id和video_id加一个唯一索引评论表里保存视频id、用户id、评论内容、评论时间、状态字段。如果想让评论支持审核就在评论表里加一个status字段0表示待审核1表示已通过2表示已驳回。后台管理员可以修改这个状态这也让“评论管理”模块有了存在的价值。3.7 MyBatis映射与多表关联查询SSM项目里MyBatis的XML映射文件是写SQL的主战场。多表关联查询在这个项目中主要体现在三个场景查询视频列表时需要关联出视频所属的一级分类名称和二级分类名称查询评论列表时需要关联出评论者的昵称查询收藏列表时需要关联出被收藏视频的标题和封面图对应的SQL核心思想都是用JOIN来关联而不是先查A表再循环查B表。以视频列表查询为例你Ideally可以写成这样SELECT v.*, c2.name AS categoryName, c1.name AS parentCategoryName FROM video v LEFT JOIN category c2 ON v.category_id c2.id LEFT JOIN category c1 ON c2.parent_id c1.id WHERE 1 1 ORDER BY v.create_time DESC这段SQL用两个LEFT JOIN一次性把视频、二级分类、一级分类三张表的数据都捞出来。在MyBatis中返回结果使用ResultMap将数据库字段映射到实体对象即可。如果你在画类图、写Mapper的时候觉得这个JOIN链有点绕可以先把SQL语句在数据库的图形化工具里跑通再往XML文件里放。这是最直接的做法不要直接把一条没验证过的SQL贴进去然后反反复复做重启、测试的循环。3.8 Spring事务与数据一致性视频分类管理系统的业务逻辑里有一些操作涉及多条数据表的修改。最典型的例如删除一个视频时除了把video表里的记录删掉还要把它对应的收藏记录和评论记录也一并处理掉。否则后面统计视频数据、关联查询时会出现一些莫名其妙的情况。这种情况下我建议在Service层的方法上直接标注Spring的Transactional注解。这样同一个方法内的所有数据库操作就都处于一个事务中一旦任何一步失败前面的操作全部回滚数据不会出现“主表删了子表数据还留着”的局面。这里有一个容易被忽略的问题Spring的默认事务控制只在抛出运行时异常时才回滚。如果你在Service层手动catch了异常并且没有把它重新抛出去事务是不会回滚的。所以要么不抓异常要么在catch块里面手动抛一个RuntimeException的子类要么使用Transactional(rollbackFor Exception.class)将回滚条件扩展到所有异常。这个小细节很多工作了两年的人都会踩面试和答辩中被问到的频率其实偏高。4. 开发过程与论文写作要点4.1 数据库建表与测试数据准备很多同学拿到项目任务后第一件事是打开IDEA开始写代码。我的建议是反过来先把数据库表和测试数据准备好再做编码工作。原因很简单代码写到最后就是数据的加工与流动。数据长什么样代码才能照着什么写。没有一张清晰的表结构写出来的Service层代码很容易反复推倒重来。建表时建议使用SQL脚本而不是直接在数据库图形化工具里建表。把建表语句和初始数据放在一个init.sql文件里提交到版本管理工具中。这样做有几个明显好处如果你的数据库不小心弄坏了重新执行一遍脚本就能恢复换一台电脑继续开发也不需要重头一条一条录数据论文里面写“系统测试数据样本”时还能直接引用这个脚本说明数据的构成。测试数据的数量也不建议太少。视频表里至少造一百条记录分类数据再多造几个层级。演示的时候有真实感的列表页远比空荡荡的白页面说服力强。4.2 项目目录结构与代码组织在SSM项目中包结构直接决定代码的可维护性和答辩观感。我这里给出一套标准的目录组织方式src/main/java ├── com/example/videosite │ ├── controller │ │ ├── AdminController.java │ │ ├── CategoryController.java │ │ ├── VideoController.java │ │ ├── UserController.java │ │ └── CommentController.java │ ├── service │ │ ├── VideoService.java │ │ └── impl │ │ └── VideoServiceImpl.java │ ├── dao │ │ ├── VideoMapper.java │ │ └── CategoryMapper.java │ ├── entity │ │ ├── Video.java │ │ ├── Category.java │ │ ├── User.java │ │ └── Comment.java │ ├── interceptor │ │ └── LoginInterceptor.java │ └── common │ └── PageResult.java src/main/resources ├── mappers │ ├── VideoMapper.xml │ └── CategoryMapper.xml └── spring ├── applicationContext.xml ├── spring-mvc.xml └── mybatis-config.xmlController层只负责接收参数、调用Service、返回视图或数据不直接写SQL。Service层负责业务逻辑的处理包括事务控制和数据校验。DAO层只负责数据库的读写。实体类或者DTO用来在层与层之间传递数据。这套组织方式不是我的发明但它比较合理且容易在答辩时被老师认可。很多水平不怎么样的学生项目Controller里直接塞SQLService里到处弹alert页面打开还全是乱码。你只要按照分层组织代码就已经超过一批人了。4.3 论文结构与撰写侧重点这部分是不是不太像技术文不要急我只会讲要点因为论文有没有内容很大程度上取决于你项目的实际工作量。论文结构上标准的毕业设计论文框架大概是摘要、绪论背景、意义、国内外现状、需求分析、系统设计架构设计、功能设计、数据库设计、系统实现核心页面截图与核心代码讲解、系统测试功能测试、性能测试、测试结论、总结致谢、参考文献。写论文时我强烈建议你把核心精力放在“数据库设计”和“系统测试”这两个章节。数据库设计章节可以画出E-R图、表结构说明、表关系说明这些东西都是确定的内容踏实写就行。系统测试章节你不要只写“系统运行正常”这种空话而是把测试用例列出来输入数据、预期结果、实际结果一张表格写清楚。这些内容既好写又能在答辩时体现你的严谨态度。系统实现章节也不要贴大段代码。实际上老师的阅读习惯是看图不怎么看代码。截图配合简洁的文字说明展示出每个页面实现了什么功能、逻辑是什么就足够了。代码贴太多反而会让老师觉得你在凑字数。4.4 论文查重与降重提示还有一个大概率你会遇到的麻烦查重。毕设论文里技术描述部分很容易和网上已有的SSM教程重复。我的建议是描述技术原理时换一种表达方式。例如“Spring是一个轻量级的控制反转和面向切面的容器框架”这句话满网都是你最好把它转化成自己的理解后再写出来。一个可行的办法是用“自己的项目场景”来倒推技术描述。比如不要写“SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架”而是写“在本系统的设计中当用户在视频列表页点击某个视频的标题时请求由DispatcherServlet接收并分发到VideoController中对应的处理方法该方法再调用Service层获取视频详情数据并返回至视图页面”。这样一来同样的知识点体现的就是你在项目中的实际运用而不是教材原文的复制。5. 常见问题与避坑指南5.1 数据库连接相关的坑视频分类管理系统里几乎所有模块都依赖数据库。数据库连接一旦出问题系统就会“看起来完全跑不动”。最常见的错误有这么几类MySQL连接地址写错jdbc:mysql://localhost:3306/videosite这个地址里的数据库名要和实际一致端口号默认3306。很多人用的是MySQL8.x但驱动版本还是5.x的这样连接时会报通讯链路异常。解决方案是换用对应的新版本驱动同时把URL中加上useSSLfalseserverTimezoneAsia/Shanghai。密码编码问题MySQL连接串里的serverTimezone参数没有设置时可能会报时区错误。这类错误网上方案很多了但实际工作中我发现最简单的办法就是在URL里面加上serverTimezone。5.2 Maven依赖下载与版本冲突SSM项目里的依赖数量虽然比Spring Boot少但还是会遇到Jar包冲突。最常见的情况是MyBatis版本和MyBatis-Spring版本对不上导致项目启动时报Mapper接口绑定异常。我的建议是不要随便尝试最新版本直接用网上教程里的经典组合比如MyBatis 3.4.x配合MyBatis-Spring 1.3.x这个组合长期稳定。还有一个非常容易出现的问题是Maven依赖下载半天还是不完整IDEA左下角一直转圈。这时候很多同学会反复reimport但问题始终得不到解决。我的经验是去本地Maven仓库把下载失败的.lastUpdated文件删掉然后重新reimport往往就好了。如果确实因为网络原因持续下载失败可以考虑配置Maven国内镜像。5.3 页面乱码问题JSP页面乱码几乎是每个人都会遇到的问题。这个问题一般有四个层面JSP文件本身的编码、页面ContentType设置、Tomcat接收POST请求的编码、数据库连接串的编码。四个环节有一个不一致就会出现中文乱码。我建议你严格统一使用UTF-8。JSP文件头部加上% page contentTypetext/html;charsetUTF-8 languagejava %在web.xml中配置一个CharacterEncodingFilter把请求和响应都设置为UTF-8。数据库连接串中加上characterEncodingutf-8。表结构在设计时尽量统一为utf8mb4格式。这四步做完一般就不会再遇到中文显示成问号的情况。5.4 运行报404或500的排查顺序项目跑起来之后最让人抓狂的无非是404和500。排查的顺序应该从外到内404先看访问路径对不对再看Controller里RequestMapping的地址有没有写错最后看SpringMVC的组件扫描有没有覆盖Controller所在的包。500错误先把Tomcat日志打开看完整异常栈。我见过的绝大多数500都是空指针异常原因不外乎三种对象没有从session中取出来、根据id查询的对象为null、集合没有判空就直接操作。这三个原因如果都排除了再去看MyBatis的Mapper绑定是否出现异常提示。有时候因为Mapper接口和XML文件放在不同的包下或者XML文件没有在配置文件中注册都会导致Systematy级别启动时就失败。5.5 答辩演示时的几个建议最后分享几条答辩时的实操建议。演示系统时尽量不要只对着一个空库操作提前录入足够的数据让页面一打开就有内容可看。提前测试几次从登录到操作全流程确保每个按钮都能用。答辩前把项目代码的目录结构和数据库的表结构截图准备好老师问起来随手就能展示。回答技术问题的时候如果被问住了优先从“数据表结构”和“请求处理流程”这两个角度回答它们是你对系统最了解的地方而且通常老师更多考核的是你对整体设计是否清晰而不是具体某个API的细节。这个项目做完你会发现视频分类管理这套东西本身没有多少高深算法但它串联了Java Web开发中最常用的一条知识链路从框架整合到数据库设计到前端交互都有实际落地的内容。把这条链路走通一遍你在写代码这件事上的信心会明显不一样。