
简介面向Java Web课程设计与毕业设计场景这份基于JSPMySQL的诗词网站完整工程围绕管理员与普通用户双角色展开。管理员可进行学生账户分配、系统参数设置、资源与论坛管理、交流主题发布普通用户支持登录、资源上传下载和话题讨论权限层级清晰业务模块完整非常适合学习Java Web开发与期末大作业参考。压缩包内含项目源码、毕业论文、开题报告、文献综述、PPT、数据库脚本以及演示视频等主要文件类型整体大小约26.9MB方便对照文档理解设计思路并快速部署演示。目前已有106人学习下载读者可获得整套可运行的工程代码、数据库结构和答辩展示材料项目结构清晰、注释规范便于二次开发与文档对照为完成同类诗词或内容管理类课程项目提供便利。1. 拿到这个 Java 古诗词网站压缩包先确认它能帮你解决什么问题如果你正在为 Java 课程设计或毕业设计发愁手上这个「基于 Java 的古诗词网站源码论文PPT开题报告文献综述数据库文件演示视频.zip」值得认真拆一遍。它不是一个只展示诗词列表的静态页面而是一个带完整权限体系的诗词资源交流平台管理员能管学生账户、论坛版块、上传资源和交流主题普通用户登录后可以下载诗词资源、上传自己收集的诗词、发起话题互相讨论。整套资料把源码、论文、答辩 PPT、开题报告、数据库脚本和演示视频都打包好了适合 JSP 期末大作业和本科毕业设计两个场景。你拿到手不是看它多炫而是看它能不能让你少熬夜、答辩时扛得住问。2. 角色与权限边界管理员六个操作面、普通用户四条使用链路我在帮人调试这类毕业设计时有个习惯拿到代码先不看页面先看权限划分。因为多数 JSP 项目翻车就翻在「谁都能进后台」「用户表只有一张登录进去什么都能干」——答辩老师一问权限设计就露馅。这个古诗词网站把权限拆成管理员和普通用户两级每级各管一摊边界非常清楚这也是它适合当毕设模板的核心原因。2.1 两级权限的设计逻辑为什么它比普通 CRUD 多一点东西普通学生做的图书管理系统一般是单用户表 一个 role 字段用户登录后判断一下是不是管理员能进后台就完事。这个项目不是它的管理员侧有六个操作面分配学生账户、配置网站参数、管理上传资源、管理论坛专区、管理学生账户、设置交流主题。普通用户侧是登录、资源下载、资源上传、交流学习四条链路。这种设计好在哪里好在「管理对象」和「使用对象」被拆开了——管理员不直接参与内容生产他做的是分配、审核、配置、治理用户做的是上传、下载、讨论。这正好对应实际互联网平台的后台与前台分离思路写论文时能往「基于角色的访问控制」方向靠比干巴巴写增删改查有说服力。角色权限点对应业务操作涉及模块管理员学生账户分配给用户创建初始用户名密码用户管理管理员系统设置配置首页公告、诗词推荐、版块活动系统配置管理员资源管理修改、删除学生上传的诗词资源资源管理管理员论坛管理添加、删除、修改话题专区论坛管理管理员学生账户管理修改信息、锁定、删除学生账号用户管理管理员交流主题设置定期推出主题引导用户围绕讨论主题管理普通用户登录每次访问凭用户名密码进入登录认证普通用户资源下载下载站内诗词资源离线学习资源模块普通用户资源上传上传平台上没有的诗词资源模块普通用户交流学习发起话题、互相回复交流论坛模块这张表可以直接抄进论文的「功能需求分析」章节比放截图有用。答辩老师最爱问的就是「你怎么区分管理员和用户」这张表就是你的回答依据。2.2 管理员侧六个权限点的落地形态与管理入口逐个看这六个权限点。第一是学生账户分配注意它和「学生自己注册」不同这里倾向于管理员预先分配用户名密码也就是常说的「开账号」在用户管理页面体现为新增用户表单字段一般是用户名、密码、姓名。第二是系统设置首页公告、诗词推荐、版块活动都做成可配置通常对应一张 notice 表或系统参数表前台首页读取最新一条公告显示后台改完刷新就生效。第三是资源管理学生上传的诗词资源管理员可以修改、删除注意这个操作隐含一层内容审核逻辑——用户上传的内容不是直接展示而是经过管理员确认的这个点答辩时值得展开讲。第四是论坛管理话题专区增删改相当于一个版块分类表用户发帖前必须选择一个专区。第五是学生账户管理和第一点不同这里是「管存量」——修改信息、锁定账号、删除账号锁定用状态字段实现删账号要考虑他发过的帖子和上传资源怎么处理一般做法是保留内容但标记为「已注销用户」。第六是交流主题设置这个最有意思平台每隔一段时间由管理员确定一个主题让学生围绕它讨论这相当于内容运营里的「官方话题」也是古诗词网站区别于普通论坛的差异化功能。我一般会提醒做这个项目的同学答辩时把 2.2 里第六点当作「系统特色」讲因为大部分课程设计项目做不到运营层面的功能。你要说清楚主题不是做死的而是管理员在后台维护、前台展示、用户围绕主题发帖数据模型上用一个独立的主题表去关联帖子这比什么「创新点」都扎实。2.3 用户侧四条链路与登录拦截的代码实现用户侧流程走一遍是这样打开首页 → 登录 → 浏览诗词资源列表 → 点开详情或直接下载 → 上传自己收藏的诗词 → 进入论坛发起话题 → 回复别人的帖子。四条链路里登录是前提资源下载和上传是核心交流是黏性。下载功能在 JSP 里一般是一个下载 Servlet设置响应头 Content-Disposition 让浏览器弹出保存框上传功能是 enctypemultipart/form-data 表单服务端用 Commons FileUpload 或 SmartUpload 接收文件流把文件写到服务器指定目录再把文件路径存进数据库。权限拦截是这个项目最关键的一层绝大多数 JSP 项目的登录漏洞都出在它身上。最常见的实现是写一个过滤器拦截所有请求判断 Session 里有没有登录标志没有就跳回登录页。示例代码如下// LoginFilter.java 登录状态过滤器——所有请求先进这道门 public class LoginFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; // 1. 放行登录页、登录请求、静态资源避免死循环 String uri request.getRequestURI(); if (uri.endsWith(/login.jsp) || uri.endsWith(/login) || uri.contains(/css/) || uri.contains(/js/) || uri.contains(/images/)) { chain.doFilter(request, response); return; } // 2. 检查 Session 里是否有登录标志 Object loginUser request.getSession().getAttribute(loginUser); if (loginUser null) { // 3. 未登录则重定向到登录页链在这里断掉 response.sendRedirect(request.getContextPath() /login.jsp); } else { // 4. 已登录则放行继续走业务逻辑 chain.doFilter(request, response); } } }这段代码的逻辑是把登录判断收敛到单一入口避免每个页面重复判断。注意第 1 步必须放行登录页本身和静态资源否则会出现「重定向次数过多」——这是过滤器最容易犯的错。第 2 步的 Session key 要和登录代码保持一致项目里可能是 loginUser、user、userInfo你拿到源码后先搜session.setAttribute看它存的是哪个名字再回来改过滤器。第 3 步重定向要带request.getContextPath()否则项目部署后路径不对会跳 404。提示过滤器只是第一层防线它保证「未登录不能访问页面」。如果要区分管理员还需在过滤器里加角色判断——登录的 User 对象里有没有 admin 标志或者查角色表。不然普通用户拿到后台 URL 也能进。2.4 登出与会话失效容易被忽略的一条链路还有一条链路大家常忘——登出。登出不是一个链接跳转就完事它必须执行session.invalidate()把会话彻底销毁再重定向到登录页。如果只是removeAttribute(loginUser)会话还在后退按钮还能看到登录前的页面这在答辩现场演示时会很尴尬。另一个坑是会话超时Tomcat 默认 30 分钟。用户挂机半小时后回来点链接Session 已经失效过滤器会把他踢回登录页但表单数据全丢了。我在项目里会在被拦截跳转前加一个提示参数?timeout1登录页读到这个参数就显示「登录已过期请重新登录」这个小细节答辩时讲出来非常加分。3. 数据库文件与表设计六张核心表怎么支撑整个古诗词网站拿到压缩包里的数据库文件不要双击就完事。先把它打开看懂每一张表是干什么的再考虑导入。数据库文件是这个项目的「黑匣子」——页面代码可以倒着猜但表结构看不明白你连登录都配不通。这一章我带你反推表设计并给出一个常见的建表模板方便你对比手里的 .sql 文件。3.1 从功能点反推表结构先列功能再画表标准的做法是从权限表和功能表往反推。管理员要管学生账户那至少有一张用户表再加一张管理员表普通用户要上传和下载诗词资源那有一张诗词资源表论坛要分专区、发话题、回帖那至少有三张表版块表、话题表、回复表首页公告和推荐位是一张配置表交流主题再单独一张。整体下来六到八张表是合理的对应关系如下表名中文名核心字段被谁使用admin管理员表用户名、密码、姓名管理员登录user / student用户表用户名、密码、状态、创建时间普通用户登录、管理poem_info诗词资源表标题、作者、朝代、正文、上传者、状态用户上传下载notice公告配置表标题、内容、类型、发布时间首页公告、推荐位section论坛版块表版块名、描述、排序论坛管理topic话题表标题、内容、发帖人、所属版块、主题ID用户交流reply回复表内容、回复人、对应话题用户回帖exchange_theme交流主题表主题名称、开始时间、结束时间管理员主题设置这张表建议存下来写论文「数据库设计」章节时直接展开画 E-R 图。注意「交流主题表」和「话题表」是主子关系——管理员建一个主题用户发帖时要选择这个主题这就是 2.2 里说的运营功能落地的关键。3.2 核心建表 SQL 拆解字符集、状态字段和时间戳的讲究拿到的 .sql 文件里建表语句大概率是下面这个风格我拆一个你就能举一反三。重点看三张核心表用户表、诗词资源表、交流主题表。-- 创建数据库utf8mb4 保证生僻字和繁体字不乱码 CREATE DATABASE IF NOT EXISTS poetry_site DEFAULT CHARACTER SET utf8mb4; USE poetry_site; -- 用户表普通用户的账号与状态 CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT COMMENT 自增主键, username VARCHAR(50) NOT NULL COMMENT 登录名唯一, password VARCHAR(64) NOT NULL COMMENT 密码毕业设计常见MD5加密, real_name VARCHAR(50) DEFAULT NULL COMMENT 学生真实姓名, class_name VARCHAR(50) DEFAULT NULL COMMENT 班级便于管理员识别, status TINYINT DEFAULT 1 COMMENT 1正常 0锁定 2注销, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 注册时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT普通用户表; -- 诗词资源表用户上传的古诗词内容 CREATE TABLE poem_info ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL COMMENT 诗词标题, author VARCHAR(50) DEFAULT NULL COMMENT 作者如李白, dynasty VARCHAR(20) DEFAULT NULL COMMENT 朝代, content TEXT COMMENT 诗词正文长文本用TEXT, upload_user_id INT NOT NULL COMMENT 上传者ID关联user表, status TINYINT DEFAULT 1 COMMENT 1展示 0下架管理员可改, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT诗词资源表; -- 交流主题表管理员定期推出的讨论话题 CREATE TABLE exchange_theme ( id INT NOT NULL AUTO_INCREMENT, theme_name VARCHAR(100) NOT NULL COMMENT 主题名称如“唐诗中的边塞”, theme_desc VARCHAR(500) DEFAULT NULL COMMENT 主题背景介绍, start_time DATETIME DEFAULT NULL COMMENT 开始时间, end_time DATETIME DEFAULT NULL COMMENT 结束时间, status TINYINT DEFAULT 1 COMMENT 1进行中 0已结束, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT交流主题表;字段上有三个讲究。一是字符集必须用 utf8mb4不要用 utf8因为古诗词里有大量繁体字和生僻字比如「」这种扩展 B 区字符utf8 的 3 字节存不下导入直接报错。二是status字段是软删除和下架的依据用户上传的诗词不是物理删除而是把 status 改成 0这样管理员反悔时还能恢复——这就是「后悔药」。三是时间字段用DEFAULT CURRENT_TIMESTAMP让数据库自动写入不要靠 Java 代码 new Date() 再塞进去省事且统一。3.3 导入顺序与造数技巧先建库、后导数据、再验证拿到 .sql 文件后的操作顺序很关键。常见做法是先打开文件看清楚里面有没有CREATE DATABASE如果没有你先手工建库再切到库下导入否则表会落到默认库里项目连不上。命令行或者 MySQL Workbench 都行# 方式一执行整个 sql 文件等提示 Query OK mysql -uroot -p poetry_site.sql # 方式二如果 sql 文件里没有建库语句先手工建库再进入 mysql -uroot -p mysql CREATE DATABASE poetry_site DEFAULT CHARACTER SET utf8mb4; mysql USE poetry_site; mysql SOURCE /绝对路径/poetry_site.sql;如果 .sql 文件里有外键约束比如 topic 表关联 user 表和 exchange_theme 表导入时要注意顺序——先导父表user、exchange_theme、section再导子表topic、reply、poem_info 里的上传者关联。不过很多毕业设计项目的建表语句根本不写外键靠 Java 代码逻辑保证关联这种情况下顺序就没那么敏感。导入完成后立刻执行三条验证语句查一下 user 表有几条数据、查一下 admin 表里有没有默认管理员账号、在命令行里用SHOW CREATE TABLE exchange_theme看下交流主题表结构。管理员初始账号密码通常写在 SQL 文件的 INSERT 语句里也有可能写死在源码的配置类中跑起来之后第一时间改掉。4. 从 zip 包到能跑起来的网站Eclipse Tomcat MySQL 完整复现这一章是很多新手卡壳的地方。代码本身出错是少数大多数「跑不起来」都出在环境配置和版本匹配上。作为一线带你复现的流程我按我自己的习惯给你排一遍从解压到浏览器出现登录页每步都写明为什么这么做。4.1 先解压核对内部文件再决定用哪个 IDE 打开解压后第一件事不是双击项目而是核对压缩包里有什么。这个 zip 里应当包含源码目录、论文 Word、答辩 PPT、开题报告、文献综述、一个 .sql 数据库文件、一个演示视频。源码目录下要确认两个文件在不在.project和.classpath——它们标识这是一个 Eclipse 的 Dynamic Web Project。如果这两个文件在用 Eclipse 导入是最稳的如果你习惯用 IDEA要用Import Project然后选 Eclipse 模式但转换过程中偶发编码问题不如直接用 Eclipse 省心。版本匹配是这里最大的玄学。我整理了一套不会翻车的组合组件推荐版本说明JDK1.8JDK 8JSP 项目最稳的版本太高会有兼容问题Eclipse任意较新版本自带或单独装 Eclipse IDE for Enterprise JavaTomcat8.5 或 9.0对应 JDK 8别用 Tomcat 10MySQL5.7 或 8.08.0 需要驱动版本匹配5.7 更老练mysql-connector5.1.49 或 8.0.x放在 WEB-INF/lib 下不要放 JDK 目录Tomcat 10 以降改用 Jakarta 命名空间老 JSP 项目里的javax.servlet全都会报告 ClassNotFound这个坑几乎每个照着网上教程装最新版的人都会踩一次。所以老老实实用 Tomcat 8.5 或 9.0配合 JDK 8别追新。4.2 Eclipse 导入与 Tomcat 配置六步走我一般按六个步骤走每一步都有它存在的理由。第一步把解压出的源码文件夹放到全英文路径下比如D:\workspace\poetry_site路径里有中文或空格时 Tomcat 的部署路径解析经常出问题。第二步打开 EclipseFile Import Existing Projects into Workspace选Select root directory指向源码目录Finishing 后项目左侧栏出现且没有红叉。第三步配置 TomcatWindow Preferences Server Runtime Environments点 Add 选 Tomcat 9.0指向你本地 Tomcat 安装目录JDK 选 1.8。第四步右键项目Properties Targeted Runtimes勾上刚配好的 Tomcat——这步不做的话项目编译没报错但部署时会说「Target is not a servlet class」。第五步打开Servers视图新建一个 Server选 Tomcat 9.0把项目 Add 到右侧。第六步启动 Tomcat看 Console 日志。第四步是最多人漏掉的Eclipse 里项目如果没有和 Tomcat 关联启动时会直接抛java.lang.ClassNotFoundException: org.apache.jsp.index_jsp——因为 JSP 编译出来的 Servlet 类没有被正确加载。关联之后Eclipse 会在项目的 Deployment Assembly 里自动加上 WEB-INF 和 lib 的映射。4.3 修改数据库配置密码、编码、上下文根三个必改项跑通之前有连接数据库的配置必须改这步决定你能不能登录。JSP 项目的配置文件名五花八门常见的有jdbc.properties、db.properties、config.properties还有直接写在applicationContext.xml里的。找文件的方法是在源码目录里搜jdbc:mysql全项目只要出现 MySQL 连接串的就是配置所在。打开后一般长这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/poetry_site?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456 maxActive20 initialSize5 maxWait3000这里三个必改项第一jdbc.password改成你本地 MySQL 的密码第二jdbc.url里的poetry_site要和你导入的数据库名一致第三characterEncodingutf8必须保留它是全站中文不乱码的兜底。如果你的 MySQL 是 8.0驱动也要换成com.mysql.cj.jdbc.Driver并且serverTimezoneAsia/Shanghai一定要加不然报The server time zone value异常。如果你的 MySQL 是 5.7驱动还用com.mysql.jdbc.Driver就行serverTimezone也能加不报错。改完配置文件还有一步——上下文根。右键项目Properties Web Project Settings Context root它默认可能是带版本号的项目名改成poetry或一个简短的名字这决定你浏览器访问路径是http://localhost:8080/poetry/还是长长一串。注意改完后清理一下 Tomcat右键 Tomcat ServerClean删掉旧的部署目录再重启。不然改了不生效页面还是 404。启动之后看 Console 有没有输出Deploying web application archive或Starting Servlet Engine之类的日志然后浏览器访问http://localhost:8080/poetry/出现登录页就说明 Web 层通了再尝试登录能跳转就说明数据库层也通了。注意如果登录后跳转地址是http://localhost:8080/poetry/login.jsp而不是项目名的实际路径说明源码里写死了跳转路径你需要全局搜索并替换成你自己的上下文根这是 JSP 项目最常踩的路径坑。5. 复现过程中的避坑记录五个高频问题与解决方式这一章的每一条都是实际跑项目时真实遇到过的不是我从文档里抄的。按「现象 → 原因 → 解决」写你可以直接对照排查。5.1 登录页能打开点登录后报 500 或 ClassNotFoundException现象浏览器能正常显示登录页输入账号密码点登录页面变成 500Tomcat 日志里报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或Communications link failure。原因绝大多数是 mysql-connector 驱动 jar 不在 WEB-INF/lib 目录下。很多人把 jar 硬塞进 JDK 的 lib 目录或者项目的 Classpath 里但 Tomcat 部署时使用的是项目内的WEB-INF/lib外部引用不会带过去。解决确认WEB-INF/lib文件夹下有没有 mysql-connector-java 开头的 jar。没有就从网上找对应版本的驱动放进去然后右键项目Maven Update Project或者RefreshClean Tomcat 后重启。如果用的是 MySQL 8.0 但驱动是 5.x把驱动升级为mysql-connector-java-8.0.x.jar并同步把jdbc.driver改成com.mysql.cj.jdbc.Driver。5.2 页面全是问号或中文乱码编码问题出在三个地方现象登录页本身中文正常但登录后首页、列表页、详情页全显示「???」或者只显示乱码。原因这是 JSP 项目最经典的编码问题链。它可能断在三处JSP 页面文件本身的存储编码不是 UTF-8数据库连接串没加characterEncodingutf8数据库或表建的字符集是 latin1 不是 utf8mb4。任何一环断了中文就出问题。解决三步齐上。第一步确认所有 JSP 文件的pageEncoding是UTF-8有 IDE 的可以全选文件转码保存第二步检查 jdbc.url 是否带useUnicodetruecharacterEncodingutf8不带就加上第三步ALTER DATABASE poetry_site CHARACTER SET utf8mb4;把数据库和关键表都改成 utf8mb4注意表也要逐个改ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;。改完后重启 Tomcat。再用命令行查一遍如果库里查出来是正常中文但网页还乱那就是 Tomcat 接收请求参数时的编码问题——给 Tomcat 的server.xml里的 Connector 加URIEncodingUTF-8属性这是最后一个兜底。5.3 Tomcat 启动崩溃或端口占用现象点 Start 后 Console 秒红报Port 8080 required by Tomcat v9.0 Server at localhost is already in use或者java.net.BindException: Address already in use: JVM_Bind。原因8080 端口被其他程序占用了常见占用者包括之前没关干净的 Tomcat 实例、Oracle 数据库的 HTTP 服务、还有各种本机开发工具的调试端口。解决两个选择——关掉占用进程或换端口。Windows 下netstat -ano | findstr 8080找到占用进程 PIDtaskkill /F /PID 那个PID也可以在 Eclipse 里双击 Tomcat Server把 HTTP/1.1 端口从 8080 改成 8081、8090 这种不常用的改完保存重启。如果改端口后面所有访问地址的端口也要跟着改注意别只改 IDE 里的、项目代码里硬编码了localhost:8080的地方也要全局搜。5.4 登录后跳回登录页进入死循环现象输入正确账号密码页面跳了一下又回到登录页而且没有任何报错Tomcat 日志也是干净的。反复登录它就是进不去。原因这是过滤器拦截链的经典问题。最常见的是 Session 的 key 对不上——登录代码里存的是session.setAttribute(loginUser, user)过滤器里却判断session.getAttribute(user) null永远判断为未登录于是永远踢回登录页。还有一种是过滤器把登录请求本身也拦截了登录 post 还没执行就被跳走。解决第一步全项目搜索setAttribute看清楚登录成功后实际写入的变量名以源码为准改过滤器。第二步确认过滤器的url-pattern是为/*但login.jsp和/login被显式放行参考 2.3 的代码。第三步如果项目用了验证码还要确认过滤器没有拦截验证码图片请求。最笨但最有效的排查方法是在过滤器里加一行System.out.println(uri - loginUser);输出当前路径和用户对象跑一遍看日志哪个路径被拦一目了然。5.5 论文里的表结构和源码对不上现象论文「数据库设计」章节列的用户表字段和 .sql 文件里不一样或者论文里的功能截图和实际运行界面长得不一样答辩前一对就慌了。原因这是毕业设计资源的常见「版本漂移」——论文是按初版写的代码是后面改过的文档没同步。很多网上下载的毕设都存在这个问题不是资源坏是两份产出没对齐。解决以源码和数据库文件为准。先把 .sql 里的表结构导出来和论文里的表对比把论文里的表字段改成和代码一致再把论文里的功能截图重新截一遍替换掉旧图。这个工作量不大但答辩印象分会差很多——老师如果发现你连自己的论文都对不上会很被动。演示视频里的操作步骤也要过一遍如果视频里管理员的入口路径和实际源码不同按源码反向核对视频里的菜单名称能改的视频改不了那就在论文里把功能点描述得和源码一致。6. 让答辩更好讲的三个小改动主题配置化、上传校验与轮换策略项目跑通只是及格线想拿高分需要把几个点从「能用」做成「可运营」。我挑三个改动小、说服力强的地方按优先级排好你有时间就全做没时间至少做前两个。第一个改动是把首页推荐和诗词推荐全改成从配置表读取。很多项目的推荐位是页面写死的要改推荐语还得改 JSP 重新编译。你新建一张recommend_config表字段是 id、type公告/推荐诗词、content、update_time管理员后台维护这张表首页用 JDBC 查最新一条展示。改动只有两个 JSP 页面加一段查询代码但答辩时你可以说「系统的运营位由管理员动态配置不需要改代码」这句话的含金量远高于「我的首页是静态的」。第二个改动是给上传模块加三层校验。第一层校验文件扩展名——白名单只有.txt、.pdf、.jpg、.png避免用户传 .exe 上来第二层用UUID.randomUUID()重命名文件避免中文文件名和重名覆盖第三层限制单文件大小比如设置maxPostSize或读Content-Length超过 10MB 直接拒绝。三层校验加起来约三十行代码能把「上传安全性」这个点讲成一道防线而不是一句带过。具体校验片段可以参考下面这段思路// UploadServlet.java 片段上传前的三层校验示意 String ext fileName.substring(fileName.lastIndexOf(.) 1).toLowerCase(); ListString allowExt Arrays.asList(txt, pdf, jpg, png); // 白名单 if (!allowExt.contains(ext)) { // 第一层扩展名不合法直接返回提示 response.getWriter().write(仅支持 txt/pdf/jpg/png 格式); return; } String newName UUID.randomUUID().toString() . ext; // 第二层UUID 重命名避免中文名乱码和覆盖 // 第三层大小限制在 servlet 的 doPost 里读 request 的 Content-Length超限拒绝第三个改动是把交流主题做成按时间自动轮换。管理员设置开始时间和结束时间前台判断当前时间落在哪个主题区间内就展示哪个过期主题自动下线。这一点配合 3.2 里 exchange_theme 表的start_time和end_time字段写一条 SQL 就能实现SELECT * FROM exchange_theme WHERE status 1 AND NOW() BETWEEN start_time AND end_time ORDER BY start_time DESC LIMIT 1;从那以后我每次接手这类代码第一件事就是解压看数据库脚本、找配置文件、确认版本组合跑通之前不看任何业务代码——项目本身花一天能摸透环境折腾才是真的无底洞。这三个小改动做完你手里这份古诗词网站就不再是纯交作业的水平而是能讲出「权限隔离、动态配置、上传安全、定时轮换」四层设计思路的完整作品答辩老师想刁难你都找不到下手点。希望帮到你。本文还有配套的精品资源点击获取