JavaWeb新闻发布系统实战:从源代码跑通到数据库SQL与毕业论文全链路

发布时间:2026/10/8 13:50:12
JavaWeb新闻发布系统实战:从源代码跑通到数据库SQL与毕业论文全链路 简介这是一套基于JavaWeb的新闻发布系统完整项目资料面向计算机专业学生、Java初学者及需要项目实战经验的开发者可用于毕业设计参考、课程作业提交或框架学习练手。资源包共556个文件压缩后约11.65MB涵盖26个Java源文件、21个JSP页面、27个HTML页面、30个CSS样式表、224个JavaScript脚本以及12个jar依赖包另附1份数据库SQL脚本和1份毕业论文文档前端静态资源与后端Servlet、DAO分层代码齐全结构完整可直接导入运行。内容预览显示系统包含新闻、评论、类型、链接、用户及图片上传等多个Servlet与DAO实现覆盖增删改查、分页、权限等常见业务场景。目前已有123人学习下载适合希望快速理解JavaWeb三层架构、掌握JSPServlet数据库联动开发的读者参考借鉴。1. 从一份能跑通的 JavaWeb 新闻发布系统说起为什么它值得你花时间如果你正在找一套能直接跑起来、能改、能写进毕业论文的 JavaWeb 项目新闻发布系统几乎是命中率最高的选择。它不像电商秒杀那样堆中间件也不像管理系统那样只有增删改查它刚好卡在一个舒服的位置有前台展示、有后台管理、有权限区分、有数据库设计还有一套说得清楚的业务逻辑。你拿到手的通常是一个压缩包里面躺着源代码、一份数据库 SQL 脚本外加一篇毕业论文。很多人第一反应是解压、导入、跑起来然后截图交差。但真正让这套东西产生价值的是你能不能把它拆开、改掉、讲明白。我见过太多人卡在第一步IDEA 导入后一堆红线Tomcat 起不来数据库连不上SQL 脚本执行报错。这些问题不是能力问题是环境配置和版本匹配的坑。这篇笔记就按「先跑通、再拆解、后改造」的顺序把 JavaWeb 新闻发布系统从源代码到数据库 SQL 再到毕业论文这条链路讲透。适合正在做课程设计、毕业设计或者想拿一个完整案例练手 JavaWeb 的开发者。你不需要先精通 Spring但得知道 Servlet 和 JSP 是怎么回事。2. 把源代码跑起来IDEA 配置、Tomcat 部署与数据库 SQL 导入2.1 先看清项目结构再决定用哪种方式导入拿到源代码后别急着点 Open。先解压看目录。典型的 JavaWeb 新闻发布系统分两种形态一种是传统 Servlet JSP JDBC目录里有src、WebContent或web、WEB-INF另一种是 Maven 项目根目录有pom.xml。这两种导入方式完全不同。传统项目用 IDEA 的「New Project from Existing Sources」容易丢 FacetMaven 项目直接 Open 根目录就行。我一般会先确认三件事JDK 版本、Servlet 版本、数据库类型。看web.xml里的version属性4.0 对应 Tomcat 95.0 对应 Tomcat 10。Tomcat 10 把javax.servlet换成了jakarta.servlet如果你拿的是老项目跑在 Tomcat 10 上会报ClassNotFoundException。这不是代码错是包名变了。稳妥做法是 Tomcat 9 JDK 8 或 11兼容性最好。# 查看项目使用的 Servlet 版本决定 Tomcat 版本 # 在 web.xml 头部找到类似配置 # web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee # version4.0 # version 4.0 - Tomcat 9version 5.0 - Tomcat 10上面这段不是让你执行命令而是提醒你打开web.xml核对版本号。这个动作花不了一分钟但能省掉后面半小时的报错排查。版本对不上后面所有配置都是白费。2.2 IDEA 导入与 Tomcat 配置的完整步骤假设你拿到的是传统 Servlet 项目没有pom.xml。在 IDEA 里选「File → New → Project from Existing Sources」指向解压后的根目录类型选 Eclipse 或 Maven 都行关键是后面手动补 Facet。导入后打开「Project Structure」在「Modules」里确认 Sources 根目录是否包含srcWeb 根目录是否指向web或WebContent。接下来配 Tomcat。点「Run → Edit Configurations」加一个 Tomcat Local。在「Deployment」标签页点加号选 Artifact。如果列表里没有 Artifact说明 Web Facet 没配好回去检查WEB-INF/web.xml是否存在。Artifact 类型选「war exploded」这样改 JSP 不用重启。Application context 设成/news之类的短路径别留/。!-- 检查 web.xml 中是否配置了欢迎页和 Servlet 映射 -- welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list servlet servlet-nameNewsListServlet/servlet-name servlet-classcom.news.servlet.NewsListServlet/servlet-class /servlet servlet-mapping servlet-nameNewsListServlet/servlet-name url-pattern/newsList/url-pattern /servlet-mapping这段配置决定了访问路径。如果url-pattern写的是/newsList浏览器里就要用http://localhost:8080/news/newsList。很多人跑起来 404不是 Tomcat 没起是路径拼错了。注意servlet-class必须和src下的包名完全一致大小写敏感。2.3 数据库 SQL 导入先建库再导表字符集别选错数据库 SQL 脚本通常是一个.sql文件里面包含CREATE DATABASE、CREATE TABLE和INSERT初始化数据。我习惯先手动建库再执行脚本避免脚本里的库名和你的连接配置对不上。用 Navicat 或 DBeaver 都行命令行也可以。-- 先创建数据库字符集用 utf8mb4排序规则用通用型 CREATE DATABASE news_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 切换到该数据库 USE news_db; -- 再执行脚本中的建表语句例如新闻表 CREATE TABLE news ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, content TEXT, category_id INT, publish_time DATETIME DEFAULT CURRENT_TIMESTAMP, author VARCHAR(50) ); -- 初始化一条测试数据 INSERT INTO news (title, content, category_id, author) VALUES (测试新闻标题, 这是新闻内容, 1, admin);字符集选utf8mb4而不是utf8因为 MySQL 的utf8是三个字节存不了 Emoji 和部分生僻字。新闻内容里出现特殊符号就乱码排查起来很烦。排序规则用utf8mb4_general_ci够用如果对中文排序要求高可以换utf8mb4_unicode_ci。执行完脚本后用SELECT COUNT(*) FROM news;确认数据进去了。2.4 连接数据库JDBC 配置里的四个必改参数源代码里连接数据库的配置一般在db.properties、c3p0-config.xml或者直接写在 Java 类里。找到url、username、password、driver这四个参数逐个核对。# db.properties 典型配置 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/news_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.password你的密码driver这一项MySQL 8.x 用com.mysql.cj.jdbc.Driver5.x 用com.mysql.jdbc.Driver。写错直接报ClassNotFoundException。url里的serverTimezone必须加否则 MySQL 8 会报时区错误。useSSLfalse是关掉 SSL 警告本地开发无所谓。characterEncodingutf8保证中文不乱码。这四个参数改完八成连接问题就解决了。3. 拆解新闻发布系统的核心代码Servlet、JSP 与 JDBC 三层怎么串3.1 从一次新闻列表请求看 Servlet 的完整生命周期新闻发布系统的核心链路是浏览器请求 → Servlet 处理 → 调 DAO 查数据库 → 返回 JSP 渲染。以新闻列表为例NewsListServlet的doGet方法里通常做三件事调NewsDao.findAll()拿列表把列表塞进request.setAttribute然后forward到newsList.jsp。// NewsListServlet.java 核心逻辑 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码防止中文乱码 request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); // 调用 DAO 层获取新闻列表 NewsDao newsDao new NewsDaoImpl(); ListNews newsList newsDao.findAll(); // 将数据存入 request 域供 JSP 页面读取 request.setAttribute(newsList, newsList); // 转发到列表页注意路径以 / 开头表示从 Web 根目录算起 request.getRequestDispatcher(/admin/newsList.jsp).forward(request, response); }request.setAttribute存的数据只在当前请求内有效转发后 JSP 能取到重定向就取不到。这是新手最容易混的地方。forward是服务器内部跳转浏览器地址栏不变sendRedirect是让浏览器重新发请求地址栏会变。列表页用 forward登录成功跳主页用 redirect这是常见做法。3.2 DAO 层与 JDBC 工具类连接池要不要上DAO 层负责和数据库打交道。简单项目里常见两种写法一种是用DBUtil工具类每次DriverManager.getConnection另一种是配 C3P0 或 Druid 连接池。前者代码简单但性能差每次请求都建连接后者多一个配置文件但连接复用适合稍微正式一点的项目。// DBUtil.java 简易工具类适合课程设计 public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/news_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse; private static final String USER root; private static final String PASSWORD 你的密码; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } // 关闭资源顺序不能错ResultSet - Statement - Connection public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs ! null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (stmt ! null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }关闭顺序必须是ResultSet→Statement→Connection反过来会报错。如果项目里用了连接池close()不是真关闭是归还连接但顺序依然要遵守。课程设计用DBUtil足够毕业论文里如果写了「使用连接池提升性能」那就得把 C3P0 的配置也补上否则答辩时容易被问住。3.3 JSP 页面里取数据的三种方式与乱码根治JSP 里取 Servlet 传过来的数据常见三种写法% request.getAttribute(newsList) %、EL 表达式${newsList}、JSTL 标签c:forEach。前两种适合简单输出列表渲染用 JSTL 最干净。% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table c:forEach items${newsList} varnews tr td${news.id}/td td${news.title}/td td${news.author}/td /tr /c:forEach /table用 JSTL 要在WEB-INF/lib下放jstl.jar和standard.jarTomcat 9 以下通常需要手动加。中文乱码问题记住三处JSP 页面头部% page contentTypetext/html;charsetUTF-8 %Servlet 里request.setCharacterEncoding(UTF-8)数据库连接串里characterEncodingutf8。三处都对了基本不会乱码。如果还乱检查 Tomcat 的server.xml里 Connector 有没有URIEncodingUTF-8。4. 毕业论文与源代码怎么对齐数据库设计、功能模块与查重避坑4.1 论文里的数据库设计章节要跟 SQL 脚本一一对应毕业论文里通常有一章「数据库设计」包含 E-R 图和表结构表格。很多人论文里的表字段和实际 SQL 脚本对不上答辩时被翻出来很尴尬。正确做法是先定稿 SQL 脚本再照着脚本写论文里的表结构。每张表的字段名、类型、约束、注释都要一致。字段名类型约束说明idINT主键自增新闻编号titleVARCHAR(200)非空新闻标题contentTEXT可空新闻正文category_idINT外键所属分类publish_timeDATETIME默认当前时间发布时间authorVARCHAR(50)可空作者上面这张表直接对应 SQL 里的CREATE TABLE news。论文里写「新闻标题字段长度为 200」SQL 里就必须是VARCHAR(200)不能写 255。这种细节答辩老师一眼就能看出来。E-R 图里的实体和关系也要和表对得上别画了五个实体结果数据库只有三张表。4.2 功能模块描述别写成操作手册要写清业务规则论文里的「功能模块设计」章节常见毛病是写成「点击新增按钮输入标题点击保存」。这是操作步骤不是设计。应该写清楚业务规则新闻标题不能为空且不超过 200 字发布后默认状态为待审核管理员审核通过后才在前台展示。这些规则在代码里对应if (title null || title.length() 200)这样的校验。// 新闻新增时的业务校验论文里可以对应描述 public boolean addNews(News news) { // 标题非空且长度校验 if (news.getTitle() null || news.getTitle().trim().isEmpty() || news.getTitle().length() 200) { return false; } // 内容不能为空 if (news.getContent() null || news.getContent().trim().isEmpty()) { return false; } // 默认状态设为待审核 news.setStatus(0); return newsDao.insert(news); }论文里写「系统对新闻标题进行非空和长度校验确保数据完整性」代码里就有对应实现。这样论文和源代码互相印证查重时也不容易和别人撞。很多人论文查重率高就是因为功能描述写得太通用换成任何一个管理系统都能用。4.3 参考文献格式与选题表述的常见翻车点参考文献部分软件工程本科毕业论文一般要求 GB/T 7714 格式。常见错误是混用中英文标点、缺卷期号、网址没写访问日期。建议直接用文献管理工具导出别手打。选题表述上「基于 JavaWeb 的新闻发布系统设计与实现」是标准写法别写成「JavaWeb 新闻发布系统」少了「基于」和「设计与实现」显得不正式。查重方面源代码本身一般不入查重库但论文里的代码注释和功能描述会。把注释改写成自己的话别直接复制网上模板。数据库表结构描述也容易重复因为大家字段名都差不多。可以在说明里加入自己的业务场景比如「考虑到新闻分类可能调整category_id 设计为外键并允许为空」这种带思考的描述重复率低。5. 避坑与排查环境、SQL、论文三条线上的血泪经验5.1 Tomcat 启动报 404 或 ClassNotFoundException现象Tomcat 能启动但访问页面 404或者控制台报ClassNotFoundException: com.mysql.cj.jdbc.Driver。原因404 通常是url-pattern和访问路径不匹配或者 Artifact 没部署。ClassNotFoundException是 MySQL 驱动 jar 没放进WEB-INF/lib或者驱动类名写错。解决先看 Tomcat 日志里有没有「Deployment of web application archive」成功信息。没有就是 Artifact 没配。驱动问题把mysql-connector-java-8.x.jar复制到WEB-INF/lib下IDEA 里再在「Project Structure → Libraries」确认加进去了。别只加在模块依赖里Web 应用运行时只认WEB-INF/lib。5.2 SQL 脚本执行到一半报错表建不全现象导入 SQL 时前面几张表成功后面报Table already exists或Foreign key constraint fails。原因脚本里没有DROP TABLE IF EXISTS重复执行就冲突。外键约束导致建表顺序不能乱子表必须在父表之后建。解决在脚本开头加SET FOREIGN_KEY_CHECKS 0;结尾加SET FOREIGN_KEY_CHECKS 1;先关外键检查再建表。或者按依赖顺序手动调整建表语句。导入前先DROP DATABASE IF EXISTS news_db;再重建保证干净环境。5.3 中文乱码页面、数据库、控制台三处各查一遍现象JSP 页面显示问号或者数据库里存进去就是乱码。原因JSP 页面编码、Servlet 请求编码、数据库连接编码、数据库表编码四处任意一处不对都会乱。解决按顺序查。JSP 头部contentTypetext/html;charsetUTF-8Servlet 里request.setCharacterEncoding(UTF-8)和response.setContentType(text/html;charsetUTF-8)连接串characterEncodingutf8建库时DEFAULT CHARACTER SET utf8mb4。四处都对了还乱检查 IDEA 的「File Encodings」是否全设成 UTF-8。5.4 论文查重率过高功能描述和别人的一模一样现象论文提交查重重复率 40% 以上标红集中在功能模块和数据库设计章节。原因直接套用了网上的通用模板功能描述没有结合自己的代码实现表结构说明也是标准话术。解决把功能描述和具体代码方法对应起来写「在NewsDaoImpl的findByCategory方法中通过category_id字段过滤支持前台按分类浏览」。数据库设计章节加入设计取舍比如「发布时间使用DATETIME而非TIMESTAMP避免 2038 年问题」。这些带个人实现细节的句子查重系统匹配不到。5.5 换台电脑项目就跑不起来环境依赖没记录现象在自己电脑上跑得好好的换到同学电脑或答辩现场各种报错。原因JDK 版本、Tomcat 版本、MySQL 版本、依赖 jar 包没有统一记录换环境就崩。解决在项目根目录放一个README.md写清楚 JDK 8、Tomcat 9.0.x、MySQL 8.0、所需 jar 包列表。把WEB-INF/lib下的 jar 全部随项目一起拷贝别依赖 IDE 的全局库。答辩前在自己的笔记本上完整跑一遍别到现场再配。6. 从能跑到能改给新闻发布系统加一个搜索功能的完整实操把项目跑通只是起点能改才算真正掌握。我拿「给新闻列表加关键词搜索」这个需求走一遍从数据库到前端的完整改动。这个功能不大但涉及 SQL、DAO、Servlet、JSP 四层改完你对整套链路的理解会深一层。先在 DAO 层加方法。用LIKE模糊匹配标题注意参数用PreparedStatement防注入。// NewsDaoImpl.java 新增搜索方法 public ListNews searchByKeyword(String keyword) { ListNews list new ArrayList(); String sql SELECT * FROM news WHERE title LIKE ? ORDER BY publish_time DESC; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { // 前后加 % 实现模糊匹配注意不能直接拼 SQL 字符串 ps.setString(1, % keyword %); ResultSet rs ps.executeQuery(); while (rs.next()) { News news new News(); news.setId(rs.getInt(id)); news.setTitle(rs.getString(title)); news.setAuthor(rs.getString(author)); news.setPublishTime(rs.getTimestamp(publish_time)); list.add(news); } } catch (SQLException e) { e.printStackTrace(); } return list; }LIKE ?配合ps.setString(1, % keyword %)是标准写法。千万别用WHERE title LIKE % keyword %拼接那是 SQL 注入的经典入口。搜索词里带%或_会被当成通配符如果要做精确模糊匹配得用ESCAPE子句转义课程设计里一般不做这么细但要知道这个边界。Servlet 层加一个分支根据请求参数决定调findAll还是searchByKeyword。// NewsListServlet.java 改造 doGet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String keyword request.getParameter(keyword); NewsDao newsDao new NewsDaoImpl(); ListNews newsList; if (keyword ! null !keyword.trim().isEmpty()) { // 有搜索词走搜索逻辑 newsList newsDao.searchByKeyword(keyword.trim()); request.setAttribute(keyword, keyword); } else { // 无搜索词展示全部 newsList newsDao.findAll(); } request.setAttribute(newsList, newsList); request.getRequestDispatcher(/admin/newsList.jsp).forward(request, response); }JSP 页面加一个搜索表单把关键词回填到输入框用户体验好一点。form action${pageContext.request.contextPath}/newsList methodget input typetext namekeyword value${keyword} placeholder输入新闻标题关键词 button typesubmit搜索/button /form${pageContext.request.contextPath}取的是应用上下文路径避免硬编码/news。表单用methodget搜索词会出现在 URL 里方便分享和刷新。如果搜索词包含敏感信息才用 post新闻搜索用 get 没问题。改完这四层重启 Tomcat访问列表页输入关键词测试。搜不到结果时先看 SQL 有没有执行可以在 DAO 里临时System.out.println(sql)确认。再检查数据库里标题是否真的包含关键词LIKE是大小写不敏感的取决于排序规则但中文匹配没问题。这套改法可以复制到分类筛选、时间范围查询、分页等功能上。分页稍微复杂一点要加LIMIT和COUNT但思路一样DAO 加方法Servlet 加参数JSP 加控件。我一般会先把一个功能改透再批量套用到其他功能上比每个功能都重新摸索快得多。最后说个习惯每次改完代码把 SQL 脚本和README同步更新。我吃过亏改完搜索功能忘了在论文里补描述答辩时老师问「你这个搜索是怎么实现的」翻遍论文没写只能现场口述。后来我养成习惯代码改完立刻在论文对应章节补一段数据库改了立刻更新 SQL 文件。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询