Java+Servlet+JSP+MySQL新闻发布系统:从建表到部署完整案例

发布时间:2026/11/2 10:30:55

Java+Servlet+JSP+MySQL新闻发布系统:从建表到部署完整案例 简介这是一套面向Java Web初学者与课程设计开发者的完整新闻发布系统源码基于Servlet、JSP、MySQL与JDBC技术栈实现采用MVC架构分离模型、视图与控制器涵盖用户登录认证、新闻增删改查、权限管理、图片上传及分页展示等核心模块适合用于毕业设计、实训项目或Java Web入门练手。压缩包共269个文件约6.13MB包含56个java源文件、50个jsp页面、112个class编译文件以及10个jar依赖、9个xml配置、6个css与14个png等静态资源另附1个sql建库脚本目录结构清晰便于对照源码理解请求处理与数据交互流程。目前已有3432人学习下载。通过阅读代码可掌握Servlet请求分发、JSP动态渲染、JDBC预编译防注入及session状态保持等实用技能并借鉴其分层设计与安全优化思路快速搭建可运行的新闻管理后台。1. JavaServletJSPMySQL 新闻发布系统从建表到部署一套能跑通的完整路径很多 Java Web 初学者在搜「javaweb项目完整案例mysql」时找到的要么是只有几张截图的课设要么是缺了关键配置的半成品。这套 JavaServletJSPMySQL 的新闻发布系统解决的就是「学完 Servlet 生命周期和 JSP 入门语法之后怎么把它们串成一个真正能增删改查的 Web 应用」这个问题。它适合正在做课程设计、毕设选题或者想从零理解传统 MVC 请求流转的人。整套东西不依赖 Spring 框架请求从浏览器发出经过 Servlet 处理调用 JDBC 操作 MySQL再把数据交回 JSP 渲染——每一步都看得见、改得动。下面按建库、搭工程、写后端、做前端、部署排错的顺序把这条链路完整走一遍。2. 数据库设计与 MySQL 环境落地新闻表、用户表和连接池怎么定2.1 新闻发布系统的表结构设计新闻发布系统的核心数据就两块新闻内容和操作用户。表不用多但字段类型和约束要想清楚不然后面写 JDBC 代码时全是类型转换的坑。先看新闻表news。标题用VARCHAR(200)正文用TEXT因为新闻正文可能很长VARCHAR在 MySQL 里有长度限制TEXT更合适。发布时间用DATETIME默认值设为CURRENT_TIMESTAMP这样插入时不用手动传时间。分类字段用VARCHAR(50)存中文分类名比用数字 ID 再关联一张分类表更简单适合课设规模。CREATE DATABASE IF NOT EXISTS news_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE news_db; CREATE TABLE news ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, content TEXT NOT NULL, category VARCHAR(50) DEFAULT 综合, author VARCHAR(50) NOT NULL, publish_time DATETIME DEFAULT CURRENT_TIMESTAMP, view_count INT DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role VARCHAR(20) DEFAULT editor ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有几个参数值得说清楚。字符集用utf8mb4而不是utf8因为 MySQL 的utf8实际只支持三字节存不了 emoji 和部分生僻字新闻标题里出现特殊符号就会报错。view_count默认值设为 0对应热搜词里「mysql设置默认值为0」的场景插入时不传这个字段也不会变成 NULL。username加了UNIQUE约束注册重名时数据库层直接拦截不用只靠 Java 代码判断。2.2 MySQL 安装配置与连接验证Windows 下装 MySQL 8官网下载安装包后安装向导里认证方式选Use Strong Password Encryption设好 root 密码。装完把bin目录加到系统 PATH方便命令行调用。mysql -u root -p # 输入密码后进入 mysql 命令行 SHOW DATABASES; USE news_db; SHOW TABLES;如果连接时报error 2002 (hy000): cant connect to local mysql server through socket说明 MySQL 服务没启动。Windows 下在服务管理器里启动MySQL80Linux 下执行systemctl start mysqld。这个报错和密码错误是两回事先确认服务状态再看密码。连接池方面课设规模用原生 JDBC 加一个简单的连接管理类就够了。但如果想贴近生产可以引入 Druid 或 HikariCP。热搜词里「mysql的数据库连接池」关注度不低这里给一个 HikariCP 的最小配置思路在src下建db.properties写 JDBC URL、用户名、密码和连接池参数再用一个工具类读取。连接池的核心价值是复用连接避免每次请求都走 TCP 三次握手和 MySQL 认证新闻列表页并发一高差距就出来了。提示JDBC URL 里加上useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8能避开 SSL 连接错误和时区导致的八小时偏差。3. 用 IDEA 搭 ServletJSP 工程目录结构、依赖和 web.xml 配置3.1 工程创建与目录结构在 IDEA 里新建项目选Java Enterprise勾选Web Application。如果 IDEA 版本较新没有这个选项就建普通 Maven 项目手动加webapp目录和WEB-INF/web.xml。热搜词里「idea新建jsp项目」和「vscode编写servlet代码需要怎么配置环境」都指向同一个问题Servlet 不是普通 Java 类它需要 Web 容器才能跑。VSCode 写 Servlet 代码可以但调试和部署还是得靠 Tomcat所以建议直接用 IDEA 或 Eclipse 这类带 Web 支持的 IDE。标准目录结构如下news-system/ ├── src/main/java/ │ └── com/news/ │ ├── dao/ # 数据库操作 │ ├── servlet/ # 控制器 │ ├── model/ # 实体类 │ └── util/ # 工具类 ├── src/main/webapp/ │ ├── WEB-INF/ │ │ └── web.xml │ ├── css/ │ ├── js/ │ ├── index.jsp │ ├── news_list.jsp │ └── news_detail.jsp └── pom.xmlWEB-INF目录下的 JSP 不能被浏览器直接访问必须通过 Servlet 转发这是做权限控制的基础。新闻编辑页面放在WEB-INF里未登录用户就访问不到。3.2 Maven 依赖与 Servlet 版本对应pom.xml里核心依赖就三个Servlet API、JSP API、MySQL 驱动。Servlet 版本要和 Tomcat 版本匹配Tomcat 9 对应 Servlet 4.0Tomcat 10 对应 Servlet 5.0 且包名从javax.servlet变成jakarta.servlet这个不匹配会直接导致 404 或 ClassNotFound。dependencies dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependenciesscope设为provided是因为 Tomcat 自带 Servlet 和 JSP 的 jar 包打包时不需要重复放进去否则可能冲突。MySQL 驱动不需要provided它必须跟着应用走。3.3 web.xml 与注解两种映射方式Servlet 映射有两种写法。老项目用web.xml集中配置新项目用WebServlet注解。两种都行但要知道它们的关系。web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee version4.0 servlet servlet-nameNewsListServlet/servlet-name servlet-classcom.news.servlet.NewsListServlet/servlet-class /servlet servlet-mapping servlet-nameNewsListServlet/servlet-name url-pattern/news/list/url-pattern /servlet-mapping /web-app用注解的话在类上写WebServlet(/news/list)就行不用改web.xml。但注意如果web.xml里metadata-completetrue注解会被忽略这是很多人配了注解却不生效的原因。我一般建议课设项目统一用注解代码集中改起来不用在两个文件之间跳。4. Servlet 处理请求与 JDBC 操作新闻数据从列表到详情4.1 新闻列表查询的完整 Servlet 流程一个新闻列表请求的流转是这样的浏览器访问/news/listTomcat 根据映射找到NewsListServlet调用它的doGet方法方法里通过 DAO 查数据库把结果存进request域再转发给news_list.jsp渲染。WebServlet(/news/list) public class NewsListServlet extends HttpServlet { private NewsDao newsDao new NewsDao(); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置编码防止中文标题乱码 req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); try { ListNews newsList newsDao.findAll(); req.setAttribute(newsList, newsList); // 转发到 JSP浏览器地址栏不变 req.getRequestDispatcher(/news_list.jsp).forward(req, resp); } catch (SQLException e) { // 记录日志并给用户友好提示 e.printStackTrace(); req.setAttribute(error, 新闻列表加载失败); req.getRequestDispatcher(/error.jsp).forward(req, resp); } } }setCharacterEncoding必须在读取任何参数之前调用否则 POST 中文会乱码。forward和redirect的区别要清楚forward 是服务器内部跳转request 域里的数据能带到目标页面redirect 是让浏览器重新发请求request 域数据丢失。列表页需要携带数据所以用 forward。4.2 DAO 层 JDBC 查询与参数绑定DAO 层负责所有 SQL 操作Servlet 不直接写 JDBC 代码。这样分层的好处是以后换数据库或加缓存只改 DAOServlet 不动。public class NewsDao { public ListNews findAll() throws SQLException { ListNews list new ArrayList(); String sql SELECT id, title, category, author, publish_time, view_count FROM news ORDER BY publish_time DESC; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { News n new News(); n.setId(rs.getInt(id)); n.setTitle(rs.getString(title)); n.setCategory(rs.getString(category)); n.setAuthor(rs.getString(author)); n.setPublishTime(rs.getTimestamp(publish_time)); n.setViewCount(rs.getInt(view_count)); list.add(n); } } return list; } }用PreparedStatement而不是Statement一是防 SQL 注入二是预编译后重复执行效率更高。try-with-resources保证连接、语句、结果集自动关闭不写finally也不会泄漏。ORDER BY publish_time DESC让最新新闻排最前这是新闻列表的默认排序逻辑。4.3 新闻详情页与浏览量自增详情页比列表多一步根据 ID 查单条新闻同时把view_count加一。这两步要么放在一个事务里要么先更新再查询避免并发时计数丢失。public News findById(int id) throws SQLException { String updateSql UPDATE news SET view_count view_count 1 WHERE id ?; String querySql SELECT * FROM news WHERE id ?; try (Connection conn DBUtil.getConnection()) { conn.setAutoCommit(false); try (PreparedStatement ups conn.prepareStatement(updateSql); PreparedStatement qps conn.prepareStatement(querySql)) { ups.setInt(1, id); ups.executeUpdate(); qps.setInt(1, id); try (ResultSet rs qps.executeQuery()) { if (rs.next()) { News n new News(); n.setId(rs.getInt(id)); n.setTitle(rs.getString(title)); n.setContent(rs.getString(content)); n.setAuthor(rs.getString(author)); n.setViewCount(rs.getInt(view_count)); conn.commit(); return n; } } conn.commit(); } catch (SQLException e) { conn.rollback(); throw e; } } return null; }setAutoCommit(false)开启事务更新和查询要么都成功要么都回滚。view_count view_count 1在数据库层面做自增比先查出来再加一写回去更安全不会因为并发丢更新。4.4 JSP 页面渲染与 JSTL 循环JSP 里尽量少写 Java 代码用 JSTL 和 EL 表达式。热搜词里「jsp个人信息展示页面」和「jsp入门」都涉及这个点JSP 的本质是模板不是写业务逻辑的地方。% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html headtitle新闻列表/title/head body h2新闻发布系统/h2 c:forEach varnews items${newsList} div classnews-item a href${pageContext.request.contextPath}/news/detail?id${news.id} ${news.title} /a span${news.author} | ${news.publishTime} | 阅读 ${news.viewCount}/span /div /c:forEach /body /html${pageContext.request.contextPath}拿到的是应用上下文路径部署到 Tomcat 后如果应用名不是 ROOT直接写/news/detail会 404。用这个表达式拼路径换部署环境不用改代码。c:forEach遍历 request 域里的newsList这是 JSP 里最常用的循环标签。5. 避坑与排查编码、404、连接失败的高频翻车现场5.1 中文乱码POST 和 GET 要分开处理现象表单提交的中文标题存进数据库变成问号或者页面显示乱码。原因POST 请求的编码由request.setCharacterEncoding(UTF-8)控制但 GET 请求的参数编码由 Tomcat 的server.xml里Connector的URIEncoding决定。只设了 request 编码GET 请求照样乱码。解决POST 在 Servlet 里设setCharacterEncodingGET 要么在 Tomcatserver.xml的 Connector 上加URIEncodingUTF-8要么在代码里手动转码。数据库连接 URL 也要带characterEncodingutf8三层编码一致才不会乱。5.2 404Servlet 映射和部署路径对不上现象浏览器访问/news/list报 404但类明明写了WebServlet(/news/list)。原因常见有三种。一是web.xml里metadata-completetrue注解被忽略二是 IDEA 的 Artifact 没把编译后的 class 放进WEB-INF/classes三是访问路径没带应用上下文比如应用部署名是news-system实际路径应该是/news-system/news/list。解决先看 Tomcat 启动日志里 Servlet 有没有注册成功再检查 Artifact 配置最后确认访问 URL 是否带上下文路径。用${pageContext.request.contextPath}拼路径能避免第三种。5.3 MySQL 连接失败驱动、时区、SSL 三个常见原因现象启动时报No suitable driver found或Communications link failure。原因No suitable driver通常是 MySQL 驱动 jar 没放进WEB-INF/lib或者Class.forName的类名写错。MySQL 8 的驱动类是com.mysql.cj.jdbc.Driver不是老的com.mysql.jdbc.Driver。Communications link failure多半是 URL 里没配时区或 SSL。解决确认pom.xml里驱动版本是 8.xURL 写成jdbc:mysql://localhost:3306/news_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8。如果还是连不上用mysql -u root -p在命令行验证账号密码排除数据库本身的问题。5.4 JSP 页面修改后不生效现象改了 JSP 文件刷新浏览器还是旧内容。原因Tomcat 会缓存编译后的 JSP Servlet有时候热部署没触发重新编译。解决在 IDEA 里点Build Rebuild Project或者直接重启 Tomcat。生产环境不会频繁改 JSP但开发阶段这个缓存很烦人。另外确认浏览器没有强缓存用CtrlF5强制刷新。5.5 连接池耗尽连接没关导致后续请求卡死现象系统跑一段时间后所有数据库请求都超时重启 Tomcat 又好了。原因某个 DAO 方法里 Connection 没关闭连接池里的连接被占满新请求拿不到连接就一直等。解决所有 JDBC 操作都用try-with-resourcesConnection、PreparedStatement、ResultSet 都在 try 的括号里声明。如果用了连接池在配置里设leakDetectionThreshold超过阈值没归还的连接会打日志方便定位是哪段代码漏了。6. 从课设到能演示打包 WAR、部署 Tomcat 和几个提效技巧把项目跑通之后下一步是让它能脱离 IDE 独立运行。传统 JSP 项目打包成 WAR 是标准做法热搜词里「传统jsp项目打包war」说的就是这个。在pom.xml里把打包方式设为war执行mvn clean packagetarget目录下会生成news-system.war。把这个文件丢进 Tomcat 的webapps目录启动 Tomcat访问http://localhost:8080/news-system/news/list就能看到页面。WAR 包的好处是自带所有依赖和 JSP换一台装了 Tomcat 和 MySQL 的机器改一下数据库连接配置就能跑。部署时有一个容易忽略的点数据库连接信息不要硬编码在 Java 里。我一般放在db.properties打包前根据目标环境改这个文件。如果目标机器上 MySQL 端口不是 3306或者密码不同只改配置文件就行不用重新编译。再给一个提效技巧新闻列表页如果数据量大不要一次全查出来。在 DAO 的 SQL 里加LIMITServlet 里接收page参数算出offset。比如每页 10 条第 2 页就是LIMIT 10 OFFSET 10。这个改动很小但演示时翻页流畅比一次性加载几百条新闻体面得多。最后一个血泪经验答辩或演示前一定在目标机器上完整走一遍「启动 MySQL → 启动 Tomcat → 访问列表 → 点进详情 → 新增一条新闻」。我见过太多次在开发机上好好的换台电脑就因为 MySQL 没启动或者 WAR 包没放对位置而翻车。提前跑一遍比现场调试省心得多。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/11/2 10:30:55

Python+bert文本相似度检测系统:从原理到落地实践

简介:这份资源是面向Python开发者与高校学生的深度学习文本相似度检测系统完整项目包,基于BERT模型与Django框架构建,适合作为毕业设计参考或Web开发实战练习。项目聚焦后端开发与数据库集成,帮助有一定编程基础的读者理解可扩展管…

2026/11/2 10:25:55

机器人与多智能体系统技术演进与RMAS 2026会议前瞻

1. 机器人与多智能体系统领域的技术演进 机器人与多智能体系统(Multi-Agent Systems, MAS)作为人工智能和自动化领域的重要分支,近年来呈现出快速发展的态势。从工业机器人到服务机器人,从单一智能体到复杂多智能体协作&#xff0…

2026/11/2 10:25:54

COMSOL求解器配置实战:选型、非线性收敛与后处理

1. 求解器不是黑盒:先搞清楚它在替我们做什么刚接触 COMSOL 那阵子,我习惯性地点完“计算”,然后盯着进度条发呆。模型跑完了就看个云图,跑不动了就加内存、换电脑,实在不行就把网格划粗一点。后来被一个多物理场耦合的…

2026/11/2 11:31:07

双馈风力发电系统控制策略与MPPT实现详解

1. 双馈风力发电系统概述与核心架构 双馈感应发电机(DFIG)系统作为现代风力发电的主流解决方案,其核心优势在于允许发电机转速在30%范围内波动时仍能保持恒频输出。这个特性使得系统能够更高效地捕获风能,特别是在风速变化频繁的场…

2026/11/2 11:31:07

PyTorch原型网络实战:小样本分类的episode训练与避坑

简介:面向小样本学习方向的学习者与研究者,这份 PyTorch 实现对应 Prototypical Networks 论文思路,可用于理解原型网络在少样本分类中的建模方式,并作为课程实验、课题复现或算法入门的参考代码。压缩包共 12 个文件、约 135KB&a…

2026/11/2 11:31:07

eNSP校园网拓扑实战:VLAN、DHCP、OSPF与VRRP配置指南

简介:这份「网络技术期末设计 .rar」面向计算机网络课程设计与期末实训,围绕某中学的校园网展开,使用 eNsp 完成网络拓扑规划、设备选型与仿真验证,适合需要完成课程设计或巩固组网配置的学生参考。压缩包共 21 个文件&#xff0c…

2026/11/2 11:31:07

分布式队列服务代码更新策略与实战经验

1. 队列代码更新后的执行策略解析 在分布式系统开发中,队列服务作为解耦生产者和消费者的核心组件,其代码更新后的执行策略直接关系到系统稳定性。不同于普通服务的滚动更新,队列消费者需要特殊处理消息积压、重复消费和顺序保证等问题。我曾…

2026/11/2 11:31:07

企业级Agent技术:从对话到业务落地的突破

1. 企业级Agent技术演进与现状剖析 2018年第一代对话式Agent出现时,我曾天真地以为这就是企业服务的未来。直到去年在某制造业客户现场,亲眼目睹他们的"智能客服"对着生产线故障报警只会回复"我理解您的困扰",才彻底认清…

2026/11/2 11:26:04

C#监听ARP包实时检测局域网IP冲突

简介:本资源是一个基于C#开发的局域网ARP包抓取与分析工具,面向网络运维人员、C#初学者及网络安全实践者,用于快速发现局域网内活跃设备并精准识别IP地址冲突主机。项目采用SharpPcap库实现底层ARP数据包捕获,封装为可复用的C#类&…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

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

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

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

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

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

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑