JavaWeb新闻发布系统实战:从数据库设计到部署答辩全链路
简介这是一套基于JavaWeb的新闻发布系统完整项目资料面向计算机专业学生、Java初学者及需要项目实战经验的开发者可用于毕业设计参考、课程设计模板或求职作品积累。资源包含完整源代码、数据库SQL脚本与配套毕业论文覆盖新闻管理、评论、用户、链接、图片上传等核心模块Servlet与DAO分层结构清晰便于理解JavaWeb开发流程。压缩包共556个文件约11.65MB以js脚本、png与gif图片、css样式、html与jsp页面为主另有java源码、class文件、jar依赖、xml配置及sql建库脚本前端资源与后端逻辑齐备。目前已有123人学习下载。通过研读源码与论文读者可掌握新闻发布系统的整体架构、数据库表设计、Servlet请求处理与页面交互实现并借助部署说明快速运行项目适合作为二次开发或功能扩展的起点。1. JavaWeb新闻发布系统从建库到部署一套能写进毕业论文的完整链路很多计算机专业的学生在做毕业设计时都会遇到同一个尴尬选题定了“新闻发布系统”代码从网上拉了一份数据库也导入了但真到答辩时被问一句“你这个权限表怎么设计的”“SQL注入怎么防的”就答不上来。问题不在于系统有多复杂而在于整个链路是拼凑的不是自己跑通的。JavaWeb新闻发布系统这个题目本身并不新鲜但它恰好覆盖了JavaWeb开发中最核心的几个环节JSP/Servlet请求流转、JDBC数据库操作、会话管理、分页查询、前后台权限隔离。把这套东西从头搭一遍比看十篇理论文章都管用。这篇文章面向两类人一是需要完成毕业论文和项目交付的本科生二是刚转JavaWeb方向、想找一个完整案例练手的开发者。接下来我会按“建库→搭工程→写核心功能→避坑→进阶”的顺序把每个环节的关键参数和常见翻车点讲清楚。2. 数据库SQL设计新闻发布系统的表结构怎么定才不返工2.1 五张核心表撑起整个系统新闻发布系统的数据库设计不需要太复杂但也不能只有一张新闻表。常见做法是拆成五张表用户表、新闻分类表、新闻表、评论表、角色权限表。这样拆的好处是后续加功能时不用大改结构。先看用户表。字段包括user_id主键自增、username登录名唯一索引、password存MD5或BCrypt哈希不要明文、real_name、role_id外键关联角色表、create_time。这里有个容易忽略的点username要加唯一索引否则注册时并发插入会出现重复用户名。CREATE TABLE t_user ( user_id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 登录名, password VARCHAR(128) NOT NULL COMMENT BCrypt哈希值, real_name VARCHAR(50) DEFAULT NULL, role_id INT NOT NULL DEFAULT 2 COMMENT 1管理员 2普通编辑, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (user_id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;新闻表是核心。字段设计上title用VARCHAR(200)content用TEXT或MEDIUMTEXTcategory_id关联分类表author_id关联用户表status用TINYINT表示草稿/已发布/下架publish_time记录发布时间view_count记录阅读量。这里注意content字段如果预计超过64KB必须用MEDIUMTEXT否则会被截断。CREATE TABLE t_news ( news_id INT NOT NULL AUTO_INCREMENT, title VARCHAR(200) NOT NULL, content MEDIUMTEXT NOT NULL, category_id INT NOT NULL, author_id INT NOT NULL, status TINYINT DEFAULT 0 COMMENT 0草稿 1已发布 2下架, view_count INT DEFAULT 0, publish_time DATETIME DEFAULT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (news_id), KEY idx_category (category_id), KEY idx_status_publish (status, publish_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;评论表需要支持嵌套评论的话加一个parent_id字段指向父评论。分类表就是category_id和category_name两个核心字段。角色权限表可以简化为role_id和role_name如果要做细粒度权限控制再加一张role_permission关联表。2.2 索引和字符集的两个硬性决定字符集必须用utf8mb4不要用utf8。MySQL的utf8其实是utf8mb3存不了emoji和部分生僻字新闻内容里出现特殊符号就会报错。这个坑我在三个项目里都遇到过血泪经验就是建库时直接指定utf8mb4。索引方面新闻列表页最常用的查询是“按状态和发布时间倒序分页”所以建联合索引idx_status_publish(status, publish_time)。注意索引顺序不能反status区分度高且查询条件里等值匹配放前面publish_time用于排序放后面。如果反过来建排序时用不到索引数据量上万后分页会明显变慢。提示建完表后执行 EXPLAIN 看一下新闻列表查询的执行计划确认 type 不是 ALLExtra 里没有 Using filesort。3. 工程搭建与核心功能实现从IDEA配置到分页查询落地3.1 IDEA运行JavaWeb项目的关键配置现在用IDEA跑JavaWeb项目常见做法是Maven管理依赖加Tomcat插件或外置Tomcat。先说依赖pom.xml里至少要引这几个javax.servlet-apiscope设为provided、mysql-connector-java、jstl、druid连接池。版本选择上MySQL 8.x对应connector 8.0.xMySQL 5.7对应connector 5.1.x版本不匹配会报“Unknown system variable”或时区错误。dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.20/version /dependency dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependencyIDEA里配置Tomcat的步骤Run → Edit Configurations → 加Tomcat Server → Local → 在Deployment标签页加Artifact选war exploded→ Application context设成“/news”。这里有个高频翻车点如果Artifact里没有war exploded选项说明Project Structure → Artifacts里没配置需要手动加Web Application: Exploded → From Modules。数据库连接配置建议单独放一个druid.properties文件不要硬编码在Java里。配置项包括url、username、password、initialSize、maxActive、validationQuery。url里必须加useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai否则中文乱码和时间差8小时两个问题会同时出现。3.2 新闻列表分页查询的SQL与Java实现分页是新闻系统里最核心的查询逻辑。MySQL分页用LIMIT offset, size但offset大了之后性能会下降。常见优化做法是先查主键再回表不过对于毕业设计级别的数据量几千到几万条直接LIMIT就够了。SELECT n.news_id, n.title, n.view_count, n.publish_time, c.category_name, u.real_name FROM t_news n LEFT JOIN t_category c ON n.category_id c.category_id LEFT JOIN t_user u ON n.author_id u.user_id WHERE n.status 1 ORDER BY n.publish_time DESC LIMIT ?, ?;Java层用PreparedStatement设置参数offset (pageNum - 1) * pageSize。pageSize一般设10或15pageNum从请求参数里取要做边界校验如果pageNum小于1就设为1如果超过总页数就设为总页数。总页数通过一条COUNT查询得到。public PageResultNewsVO queryByPage(int pageNum, int pageSize) { if (pageNum 1) pageNum 1; int total newsDao.countPublished(); int totalPages (int) Math.ceil((double) total / pageSize); if (pageNum totalPages totalPages 0) pageNum totalPages; int offset (pageNum - 1) * pageSize; ListNewsVO list newsDao.selectByPage(offset, pageSize); PageResultNewsVO result new PageResult(); result.setList(list); result.setPageNum(pageNum); result.setTotalPages(totalPages); result.setTotal(total); return result; }参数说明pageNum是当前页码pageSize是每页条数offset是SQL跳过的行数。注意LIMIT后面的两个参数都是int不要传字符串否则MySQL会报语法错误。另外countPublished和selectByPage的WHERE条件必须一致否则会出现“总数对不上列表条数”的玄学问题。3.3 新闻发布与富文本内容的入库处理发布新闻的Servlet接收表单参数后先做三件事校验title非空且长度不超过200、校验category_id存在、对content做XSS过滤。XSS过滤可以用Jsoup的clean方法保留基本标签去掉script和on事件属性。String safeContent Jsoup.clean(rawContent, Safelist.basicWithImages());入库时用PreparedStatement不要用Statement拼接SQL。拼接SQL是SQL注入的直接原因答辩时被问到这一点答不上来会很扣分。publish_time在status设为1时取当前时间草稿状态设为null。注意如果content里包含HTML标签数据库字段用MEDIUMTEXTJSP页面输出时用c:out value${news.content} escapeXmlfalse/escapeXml设为false才能渲染HTML但前提是已经做过XSS过滤。4. 避坑与排查新闻发布系统开发中最容易翻车的5个点4.1 中文乱码现象是页面显示问号原因是字符集链路没统一现象新闻标题在数据库里看是正常的但页面上显示成“???”或乱码。原因通常有三层数据库连接url没加characterEncodingutf8、JSP页面pageEncoding没设UTF-8、Tomcat的server.xml里Connector没加URIEncodingUTF-8。解决方法是三层都检查一遍缺哪层补哪层。最稳妥的做法是建库时就指定utf8mb4连接url加useUnicodetruecharacterEncodingutf8JSP顶部加% page contentTypetext/html;charsetUTF-8 languagejava %。4.2 数据库连接报时区错误现象是启动时报The server time zone value原因是MySQL 8.x默认时区与JVM不一致现象项目启动或第一次查数据库时抛异常“The server time zone value ?D1ú±ê×?ê±?? is unrecognized”。原因是MySQL 8.x的默认时区是系统时区而JDBC驱动需要明确的时区标识。解决方法是在url后面加serverTimezoneAsia/Shanghai。如果用的是MySQL 5.7加不加都行但建议统一加上避免换环境后出问题。4.3 分页查询总数与列表不一致现象是最后一页多出空数据或漏数据原因是COUNT和SELECT的WHERE条件不一致现象新闻列表显示共23条每页10条但翻到第3页只有2条或者第3页显示的是重复数据。原因通常是count查询用了status1而select查询忘了加status1或者JOIN的表不同导致行数变化。解决方法是把WHERE条件抽成一个常量或方法count和select共用。另外如果用了LEFT JOIN且关联表有一对多关系count要用COUNT(DISTINCT n.news_id)。4.4 富文本内容被截断现象是长新闻保存后只剩前半段原因是字段类型用了TEXT而不是MEDIUMTEXT现象一篇带图片和长段落的新闻发布后再编辑时发现后半段内容丢了。原因是MySQL的TEXT类型最大64KButf8mb4下大约只能存16000个汉字超过就被截断。解决方法是把content字段改成MEDIUMTEXT最大16MB如果还不够就用LONGTEXT。改字段用ALTER TABLE t_news MODIFY content MEDIUMTEXT NOT NULL;。4.5 会话失效后操作报空指针现象是登录后放置一段时间再点发布页面报500原因是session过期后未做拦截现象用户登录后去泡了杯咖啡回来点“发布新闻”页面直接500错误后台日志显示NullPointerException。原因是session超时后request.getSession().getAttribute(user)返回null后续代码直接调用了user.getUserId()。解决方法是在发布、编辑、删除等需要登录的Servlet里先判断session中user是否为空为空则重定向到登录页。更好的做法是加一个LoginFilter统一拦截/admin/*路径。5. 从能跑到能答辩三个让论文和项目都加分的进阶技巧5.1 用Druid监控面板证明你懂连接池调优很多同学的论文里写“使用了连接池”但答辩时被问“连接池参数怎么设的”就卡住了。Druid自带一个监控页面配置好后可以实时看到活跃连接数、SQL执行时间、慢查询记录。在web.xml里加Druid的StatViewServlet访问/druid/index.html就能看到。论文里可以放一张监控截图说明initialSize设为5、maxActive设为20的依据是“开发环境并发用户约10人按每人1-2个连接估算”。这比空写“使用了连接池”有说服力得多。servlet servlet-nameDruidStatView/servlet-name servlet-classcom.alibaba.druid.support.http.StatViewServlet/servlet-class init-param param-nameloginUsername/param-name param-valueadmin/param-value /init-param init-param param-nameloginPassword/param-name param-valueadmin123/param-value /init-param /servlet servlet-mapping servlet-nameDruidStatView/servlet-name url-pattern/druid/*/url-pattern /servlet-mapping5.2 论文里怎么写出有信息量的“系统测试”章节毕业论文的系统测试章节常见写法是“点击按钮功能正常”。这种写法没有信息量。建议改成表格形式列出测试项、输入数据、预期结果、实际结果、是否通过。比如分页查询测试输入pageNum1、pageSize10预期返回前10条已发布新闻实际返回10条且按发布时间倒序通过。再比如边界测试输入pageNum0预期自动修正为1实际返回第1页数据通过。这样写既展示了测试思维也留下了可复现的记录。测试项输入预期结果实际结果结论分页首页pageNum1, pageSize10返回10条已发布新闻返回10条按时间倒序通过分页越界pageNum999自动修正为最后一页返回最后一页数据通过空搜索keyword返回全部已发布新闻返回全部通过XSS注入content含script标签script标签被过滤仅保留p标签通过5.3 源代码和SQL交付前的自查清单交付前跑一遍这个清单能避免大部分“在我电脑上能跑”的尴尬。第一把数据库导出成SQL文件时确认包含建表语句和初始数据字符集是utf8mb4。第二检查代码里有没有硬编码的数据库密码有的话抽到配置文件里。第三确认web.xml或注解里的URL映射没有冲突。第四把Tomcat的context path和代码里的重定向路径对齐避免部署后404。第五如果论文里引用了参考文献格式按学校要求统一不要混用GB/T 7714和APA。我自己带学生做毕设时最常提醒的一句话是不要等到答辩前三天才第一次完整部署。提前两周在另一台电脑上从零跑一遍把遇到的每个报错记下来这些就是你论文“遇到的问题与解决方案”章节最好的素材。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

轻量终端工作流:从概念到实践的高效编码指南

轻量终端工作流:从概念到实践的高效编码指南

1. 从"t3code"这个名字说起:它到底指什么第一次看到"t3code"这个词,很多人会一头雾水。它不像"React""Vue"那样有明确的官方文档,也不像某个大厂的开源项目那样自带流量。我在几个技术社区翻了一圈&…

2026/10/12 12:59:09 阅读更多 →
基于飞腾D2000与银河麒麟的110英寸实验室国产化看板部署实践

基于飞腾D2000与银河麒麟的110英寸实验室国产化看板部署实践

1. 项目缘起与整体设计思路1.1 为什么要在实验室场景做一块110英寸的国产化看板实验室这个场景对显示设备的要求,跟普通会议室、展厅完全不是一回事。我接触过不少高校和科研院所的实验室改造项目,大家一开始都觉得"买块大电视挂墙上不就完了"…

2026/10/15 21:15:25 阅读更多 →
N100迷你主机UEFI启动故障深度诊断与修复

N100迷你主机UEFI启动故障深度诊断与修复

1. 这不是普通日志排查:N100真机上EOS启动失败的“五层穿透式”诊断现场你手头有一台Intel N100迷你主机,刷了EOS(Elementary OS)系统,开机卡在黑屏、GRUB菜单不出现、或者刚进GRUB就报invalid signature、error: no s…

2026/10/16 14:23:06 阅读更多 →

最新新闻

PB12票据打印实战:DataWindow套打对齐与PrintSend切纸钱箱控制

PB12票据打印实战:DataWindow套打对齐与PrintSend切纸钱箱控制

简介:面向PowerBuilder 12开发者的票据打印实现方案,聚焦自定义纸张票据打印,解决PB应用中票据模板设计、数据窗口布局、打印参数控制与动态数据填充等问题。压缩包共18个文件,涵盖PBL工程对象、PBT工程文件、HTML操作页面、GIF演…

2026/10/16 21:24:43 阅读更多 →
NX二次开发实战:UF_VEC3_distance计算两点距离与避坑指南

NX二次开发实战:UF_VEC3_distance计算两点距离与避坑指南

简介:本资源面向UG/NX二次开发初学者与需要定制几何计算功能的工程师,围绕UFUN函数库中UF_VEC3_distance的调用展开,解决三维空间中两点欧几里得距离的计算与集成问题。压缩包共25个文件,约3.4MB,包含cpp源代码、vcxpr…

2026/10/16 21:24:43 阅读更多 →
用音乐喜好构建用户画像:从听歌数据到智能选品推荐系统

用音乐喜好构建用户画像:从听歌数据到智能选品推荐系统

深夜加班回到家,我习惯把耳机戴上,随手点开一首歌。音乐一响,整个人就松弛了。那天我正盯着购物车里的三款降噪耳机犹豫——一款偏动次打次、一款偏人声解析、一款主打温润耐听。我突然冒出一个念头:与其反复看评测、刷评论&#…

2026/10/16 21:24:43 阅读更多 →
Python删除字典字段全攻略:del、pop、popitem与遍历删除实用技巧

Python删除字典字段全攻略:del、pop、popitem与遍历删除实用技巧

先跟大家说个事儿:如果你写过哪怕一点点Python,大概率逃不过“删除字典字段”这个操作。字典的增删改查是开箱即用的基本功,但真要动手删的时候,很多人会卡在“到底用del还是pop”“遍历的时候删键怎么老报错”“删完字典内存是不…

2026/10/16 21:24:43 阅读更多 →
MATLAB中NAR时间序列预测的工业级实现与避坑指南

MATLAB中NAR时间序列预测的工业级实现与避坑指南

简介:本资源是一份面向数据分析师与MATLAB初学者的实战型时间序列预测教学文档,聚焦非线性自回归(NAR)模型在MATLAB中的完整实现流程,解决从零构建、训练到评估预测模型的核心问题。资源为单文件docx格式,共…

2026/10/16 21:24:43 阅读更多 →
xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

xsync集群分发工具原理与实战:基于rsync的生产级配置同步方案

1. 为什么集群环境下“复制粘贴”根本走不通——xsync不是炫技,而是生存刚需刚接手某高校实验室的分布式计算平台时,我面对的是12台物理节点组成的Hadoop模拟集群。最开始,我习惯性地用scp一条条往每个节点传配置文件:scp core-si…

2026/10/16 21:23:43 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →