news 2026/9/28 5:53:22

Java Web日记系统:MySQL+Tomcat+JSP本地可运行实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Web日记系统:MySQL+Tomcat+JSP本地可运行实战

简介:本资源是一套基于Java开发的个人日记本系统完整实践方案,面向Java初学者与Web开发入门者,解决电子化日记管理场景下的功能实现与工程落地问题。资源包共4个文件,含2个MP4辅导视频(覆盖项目演示与部署流程)、1个SQL数据库脚本(含用户表、日记表等规范化结构设计)及1个源码ZIP(含Servlet/JSP后端逻辑、登录/增删改查等核心模块),整体53MB,结构清晰、开箱即用。目前已有432人学习下载,适合通过真实小项目掌握Java面向对象编程、MySQL数据操作及B/S架构开发全流程。读者可直接导入运行,结合视频理解环境配置、代码分层设计与常见问题调试方法,快速建立从需求分析到系统上线的完整开发认知。

1. 这不是又一个“Hello World”练习:一个能真正在本地跑起来、改得动、查得到、删得掉的Java日记本系统(含完整数据库+部署视频)

你试过下载一个标着“Java个人日记本系统”的压缩包,解压后发现只有3个.class文件、一个空的lib目录、还有一行写着“请自行配置Tomcat”的readme吗?我试过——整整7次。直到这次,我点开Diary.zip,看到src/main/java/com/diary/下整齐的controller/、service/、dao/、entity/四层结构;打开db_diary.sql,发现建表语句里user表有password_salt字段、diary表带create_time和update_time双时间戳、content字段用的是TEXT而非VARCHAR(255);再拖进02-项目的部署.mp4,前12秒就弹出命令行窗口敲mvn clean package,紧接着自动解压war包到tomcat/webapps/——我才确信:这回是真货。它不教你怎么写“面向对象”,而是直接让你站在一个已通过登录校验、支持富文本粘贴、能按日期范围模糊搜索、且所有SQL都预编译防注入的系统上,改一行代码就能让“新建日记”按钮变成红色。适合刚学完Servlet生命周期、正卡在“为什么我的JSP页面总404”的人;也适合想快速搭个内部知识沉淀工具、但不想碰Spring Boot自动配置黑匣子的运维同事。它用最朴素的Java EE技术栈,把“用户-日记-时间”这个最小闭环,焊死在MySQL+Tomcat+JSP这条老但稳的链路上。

2. 从零启动:环境准备、源码编译与数据库初始化三步落地

2.1 环境清单:只认准这四个版本,别碰“最新版”

这个系统不是为Java 17或Tomcat 10设计的。它依赖的是Java 8u202(JDK 1.8.0_202)、Apache Tomcat 8.5.99(注意:不是9.x,更不是10.x)、MySQL 5.7.32(必须是5.7,8.0的默认认证插件会导致连接失败),以及Maven 3.6.3。为什么锁死这些版本?因为pom.xml里<servlet-api.version>3.1.0</servlet-api.version>和<mysql-connector-java.version>5.1.47</mysql-connector-java.version>这两个坐标,决定了底层API契约。我试过用Java 11编译,javax.servlet.http.HttpServletRequest报红;换成Tomcat 9,web.xml里的<jsp-config>被拒绝解析;MySQL 8.0连上去第一句SELECT * FROM user就抛java.sql.SQLException: Client does not support authentication protocol requested by server。所以,请严格按以下顺序操作:

# 1. 下载并安装JDK 8u202(官网已下架,需从Oracle存档库获取) # 2. 设置JAVA_HOME指向该路径,并确保PATH包含%JAVA_HOME%\bin # 3. 下载Tomcat 8.5.99(非zip版,选.tar.gz或.zip均可,解压即用) # 4. 下载MySQL 5.7.32(Windows选.msi,Linux选.tar.gz),安装时务必勾选"Add to PATH" # 5. 下载Maven 3.6.3,解压后设置MAVEN_HOME,追加%MAVEN_HOME%\bin到PATH

提示:验证环境是否到位,只需在命令行依次执行java -version(输出应含1.8.0_202)、mvn -v(显示Apache Maven 3.6.3)、mysql --version(显示mysql Ver 14.14 Distrib 5.7.32)。少一个,后面全白忙。

2.2 源码编译:跳过IDE导入陷阱,用Maven原生命令打war包

很多人卡在Eclipse/IntelliJ导入项目后一堆红叉。根本原因在于:这个项目没用Maven标准目录结构(src/main/java是有的,但webapp/不在src/main/下,而是在根目录)。正确做法是完全绕过IDE,用命令行直编译:

# 进入解压后的Diary目录(即包含pom.xml的目录) cd /path/to/Diary # 执行clean compile package,生成war包 mvn clean package -Dmaven.test.skip=true # 查看target目录,确认生成了diary.war ls target/ # 输出应包含:diary.war diary.war.original maven-archiver/

这一步的关键参数是-Dmaven.test.skip=true。因为项目里src/test/java/下有3个JUnit测试类,但它们依赖一个未提供的mockito-all-1.10.19.jar,跳过测试才能顺利打包。生成的diary.war会自动包含WEB-INF/lib/下的全部jar(包括mysql-connector-java-5.1.47.jar、jstl-1.2.jar、servlet-api-3.1.0.jar),这是后续部署成功的前提。

2.3 数据库初始化:执行sql脚本前必须做的三件事

db_diary.sql不是拿来双击运行的。它需要你手动创建数据库、设置字符集、再导入。漏掉任何一步,都会导致中文乱码或主键冲突:

-- 步骤1:登录MySQL,创建数据库(注意字符集!) CREATE DATABASE diary_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 步骤2:切换到该库 USE diary_db; -- 步骤3:执行建表语句(从db_diary.sql中复制粘贴,或用source命令) -- 注意:sql文件开头有"SET NAMES utf8mb4;",必须保留 SOURCE /path/to/db_diary.sql;

为什么必须用utf8mb4?因为日记内容可能含emoji(如👍、❤️),utf8在MySQL 5.7中实际只支持3字节,无法存储4字节的emoji,会导致插入时报错Incorrect string value。db_diary.sql里所有VARCHAR字段都声明了CHARACTER SET utf8mb4,但数据库层面没设,照样乱码。

执行完后,检查表结构:

SHOW TABLES; -- 应输出:diary user DESCRIBE user; -- 应看到:id(INT, PK), username(VARCHAR, NOT NULL), password(VARCHAR, NOT NULL), salt(VARCHAR, NOT NULL), create_time(DATETIME) DESCRIBE diary; -- 应看到:id(INT, PK), user_id(INT, FK), title(VARCHAR), content(TEXT), create_time(DATETIME), update_time(DATETIME)

3. 部署与访问:Tomcat配置、war包放置与首次登录实操

3.1 Tomcat核心配置:修改server.xml与context.xml两处关键文件

仅仅把diary.war丢进webapps/目录是不够的。Tomcat默认会解压war包,但这个系统依赖context.xml里的JNDI数据源配置。你需要手动编辑两个文件:

第一步:配置JNDI数据源(conf/context.xml)
在<Context>标签内,添加以下内容(位置在</Context>之前):

<!-- Diary系统专用JNDI数据源 --> <Resource name="jdbc/DiaryDB" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" minIdle="5" initialSize="5" maxWaitMillis="10000" validationQuery="SELECT 1" testOnBorrow="true" testWhileIdle="true" timeBetweenEvictionRunsMillis="60000" removeAbandonedOnBorrow="true" removeAbandonedTimeout="60" username="root" password="your_mysql_root_password" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/diary_db?useUnicode=true&amp;characterEncoding=utf8mb4&amp;serverTimezone=GMT%2B8"/>

注意:url中的&amp;是XML转义,不能写成&;serverTimezone=GMT%2B8解决时区问题,否则create_time会比系统时间慢8小时;password填你MySQL root用户的实际密码。

第二步:调整Connector端口(conf/server.xml)
找到<Connector port="8080"这一行,确认port="8080"未被其他程序占用。如果被占用(如Skype),改为port="8081",并记住这个新端口。

3.2 war包部署:解压与权限的隐形雷区

将target/diary.war复制到$TOMCAT_HOME/webapps/目录后,不要手动解压。Tomcat启动时会自动解压。但有个致命细节:Windows下若用资源管理器直接复制,war包可能继承了只读属性,导致Tomcat解压失败,日志里只报SEVERE: Error starting static Resources。解决方案:

# Windows下:用cmd进入webapps目录,用copy命令覆盖 cd %TOMCAT_HOME%\webapps del diary.war copy C:\path\to\Diary\target\diary.war . # Linux/macOS下:用cp -f确保覆盖 cp -f /path/to/Diary/target/diary.war $TOMCAT_HOME/webapps/

3.3 启动与访问:从黑屏到登录页的完整链路

启动Tomcat:

# Windows %TOMCAT_HOME%\bin\startup.bat # Linux/macOS $TOMCAT_HOME/bin/startup.sh

观察logs/catalina.out(Linux/macOS)或logs/catalina.log(Windows):

  • 出现INFO: Server startup in [xxx] ms表示启动成功
  • 若出现Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,说明mysql-connector-java-5.1.47.jar没打进war包,回第2章重打包
  • 若出现SEVERE: Exception sending context initialized event to listener instance of class [com.diary.util.DBUtil],大概率是JNDI配置错误或MySQL服务没开

启动成功后,在浏览器访问:

http://localhost:8080/diary/

注意:URL末尾是/diary/,不是/diary(少斜杠会404),也不是/diary.war(Tomcat自动去掉.war后缀)。首页是login.jsp,输入默认账号:admin/123456(密码明文存于db_diary.sql的INSERT INTO user语句中)。

4. 功能验证与边界测试:五个核心场景的手动压测清单

4.1 日记增删改查全流程验证(含富文本与时间戳)

登录后,点击“写日记”,测试以下动作:

  • 标题输入:输入含中文、数字、符号的标题,如【2024-03-15】春分·茶山行 ☕→ 提交后检查列表页是否完整显示
  • 内容粘贴:从Word复制一段带加粗、列表、图片(base64)的内容粘贴 → 提交后查看详情页,确认格式未丢失(系统用<textarea>接收,但JSP页面用<pre>渲染,实际是纯文本,此处验证的是换行和特殊字符转义)
  • 时间验证:提交后,打开数据库执行SELECT create_time, update_time FROM diary ORDER BY id DESC LIMIT 1;→ 两个时间应一致,且精确到秒(如2024-03-15 14:22:33)
  • 修改操作:点击列表页“编辑”,修改标题和内容,保存 → 再次查数据库,确认update_time已更新,且create_time不变
  • 删除操作:点击“删除”,确认弹窗提示 → 删除后刷新列表,该条目消失,且数据库记录DELETE FROM diary WHERE id = ?执行成功

4.2 用户管理边界测试:密码强度与会话隔离

系统虽简单,但密码逻辑藏在UserDAO.java里:

  • 密码加密:注册新用户时,密码经MD5(salt + password)哈希(salt是随机16位字符串,存于user.salt字段)。用MySQL执行SELECT password, salt FROM user WHERE username = 'test';,再用在线MD5工具验证salt+原始密码是否等于password字段值。
  • 会话隔离:开两个浏览器(Chrome和Firefox),分别登录admin和test用户 → 在Chrome写一篇日记,Firefox刷新列表 → 应只看到自己的日记,看不到对方的(验证WHERE user_id = ?参数化查询生效)

4.3 搜索功能压力测试:日期范围与关键词模糊匹配

在“日记列表”页,测试搜索框:

  • 日期范围:起始日期选2024-01-01,结束日期选2024-12-31→ 应返回所有日记
  • 关键词搜索:输入春→ 应返回标题或内容含“春”的日记(如春分、春风),验证SQL是LIKE '%春%'而非LIKE '春%'
  • 空搜索:搜索框留空,点搜索 → 应返回全部日记(验证WHERE条件动态拼接逻辑)

5. 避坑指南:五个血泪经验总结(现象→原因→解决)

5.1 现象:首页加载空白,浏览器控制台报Uncaught ReferenceError: $ is not defined

原因:login.jsp和index.jsp引用了jQuery,但webapp/js/目录下jquery.min.js文件损坏或路径错误。检查<script src="js/jquery.min.js"></script>,实际文件名可能是jquery-3.6.0.min.js。
解决:打开webapp/js/目录,确认jQuery文件存在且名字匹配;若不匹配,修改JSP中src路径,或重命名JS文件。

5.2 现象:登录成功后跳转到/diary/error.jsp,页面显示“系统异常”

原因:web.xml中<error-page>配置了<exception-type>java.lang.Exception</exception-type>,但LoginServlet.java里catch块调用了request.getRequestDispatcher("error.jsp").forward(request, response);,而error.jsp里<%= exception.getMessage() %>试图打印异常,但exception对象为空。
解决:打开error.jsp,将<%= exception.getMessage() %>改为<%= request.getAttribute("javax.servlet.error.message") %>,并在LoginServlet的catch块里添加request.setAttribute("javax.servlet.error.message", e.getMessage());。

5.3 现象:日记内容中文显示为??,数据库里存的是乱码

原因:MySQL服务端字符集未设为utf8mb4。即使数据库和表设了,若my.cnf里[mysqld]段没配character-set-server=utf8mb4,连接时仍会降级。
解决:编辑MySQL配置文件(Windows是my.ini,Linux是/etc/my.cnf),在[mysqld]下添加:

character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci

然后重启MySQL服务:net stop mysql && net start mysql(Win)或sudo systemctl restart mysqld(Linux)。

5.4 现象:Tomcat启动后diary目录没生成,webapps/下只有diary.war没解压

原因:diary.war文件权限为只读(Windows常见),或磁盘空间不足(war包约12MB,解压后需30MB以上)。
解决:Windows下右键diary.war→ 属性 → 取消“只读”勾选;Linux下chmod 644 diary.war;检查磁盘剩余空间是否>100MB。

5.5 现象:点击“写日记”报404,URL变成http://localhost:8080/diary/write

原因:web.xml中<servlet-mapping>配置错误。原文件里<url-pattern>/write</url-pattern>对应WriteServlet,但WriteServlet.java的doPost方法里response.sendRedirect("index.jsp");硬编码跳转,而index.jsp在webapp/根目录,相对路径应为../index.jsp。
解决:打开src/main/java/com/diary/servlet/WriteServlet.java,将response.sendRedirect("index.jsp");改为response.sendRedirect("../index.jsp");,重新打包部署。

6. 进阶改造:三个可立即落地的增强技巧(附代码与验证步骤)

6.1 技巧一:给日记添加Markdown实时预览(不用改后端,纯前端增强)

系统当前用<textarea>输入,<pre>标签显示,纯文本。想支持Markdown语法(如# 标题、**加粗**),只需替换detail.jsp里的显示逻辑:

<!-- 替换原<pre><%= diary.getContent() %></pre>为以下代码 --> <div id="markdown-preview"></div> <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script> // 获取日记内容(从JSP变量转JS变量) const content = '<%= diary.getContent().replace(/'/g, "\\'").replace(/\r\n/g, "\\n").replace(/\n/g, "\\n") %>'; // 渲染Markdown document.getElementById('markdown-preview').innerHTML = marked.parse(content); </script>

验证步骤:

  1. 在detail.jsp中定位<pre>标签,用上述代码替换
  2. 写一篇新日记,内容输入# 这是标题\n\n**这是加粗**
  3. 保存后查看详情页 → 应显示为H1标题和加粗文字,而非原始文本
  4. 注意:replace链处理了单引号和换行符,防止JS语法错误

6.2 技巧二:导出日记为PDF(用iText 5.5.13.3,兼容Java 8)

Diary系统缺导出功能。添加ExportServlet,依赖itextpdf-5.5.13.3.jar(已放在lib/目录):

// src/main/java/com/diary/servlet/ExportServlet.java @WebServlet("/export") public class ExportServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int diaryId = Integer.parseInt(request.getParameter("id")); Diary diary = new DiaryDAO().getById(diaryId); // 假设DAO有此方法 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=diary_" + diaryId + ".pdf"); Document doc = new Document(); PdfWriter.getInstance(doc, response.getOutputStream()); doc.open(); Font titleFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16); Font contentFont = FontFactory.getFont(FontFactory.HELVETICA, 12); doc.add(new Paragraph(diary.getTitle(), titleFont)); doc.add(new Paragraph("日期:" + diary.getCreateTime(), contentFont)); doc.add(new Paragraph(diary.getContent(), contentFont)); doc.close(); } }

验证步骤:

  1. 编译ExportServlet.java,确保itextpdf-5.5.13.3.jar在WEB-INF/lib/下
  2. 在list.jsp每条日记后添加链接:<a href="export?id=<%= d.getId() %>">导出PDF</a>
  3. 点击链接 → 浏览器下载diary_x.pdf,用Adobe Reader打开,确认标题、日期、内容三要素齐全

6.3 技巧三:启用HTTPS访问(Tomcat 8.5原生支持,无需Nginx)

开发环境用HTTP,但部署到内网服务器需HTTPS。Tomcat 8.5内置SSL,只需生成密钥库:

# 生成keystore(密码设为changeit,与server.xml默认一致) keytool -genkey -alias tomcat -keyalg RSA -keystore conf/.keystore -validity 36500 # 按提示输入: # 密钥库密码:changeit # 姓名:localhost # 组织单位:dev # 组织:company # 城市:beijing # 州:bj # 国家代码:CN # 密码:changeit(两次)

然后编辑conf/server.xml,取消注释<Connector port="8443"段,并确认keystoreFile="conf/.keystore"和keystorePass="changeit"。

验证步骤:

  1. 重启Tomcat
  2. 访问https://localhost:8443/diary/(首次会提示证书不安全,点“高级”→“继续访问”)
  3. 登录成功 → 说明HTTPS生效
  4. 注意:浏览器地址栏显示锁图标,且location.protocol返回https:

从那以后我每次拿到一个标着“Java Web系统”的源码包,第一件事就是打开pom.xml看<properties>里的java.version和<dependencies>里的mysql-connector-java版本,再扫一眼web.xml的servlet-version。这三个数字,比README里写的“功能强大”“界面美观”靠谱一万倍。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 5:52:45

基于MC34063的5V转±12V双路电源设计与仿真调试实战

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

作者头像 李华
网站建设 2026/9/28 5:52:19

毫米波MIMO-OFDM稀疏信道估计实战:ANM与OMP工程落地

简介&#xff1a;本资源面向通信工程专业学生、无线通信方向研究生及科研工程师&#xff0c;聚焦稀疏大规模MIMO-OFDM系统中信道估计这一核心难点&#xff0c;提供可复现的MATLAB仿真方案与实操指导。压缩包共3个文件&#xff08;2个MATLAB源码.m文件用于信道建模、稀疏估计算法…

作者头像 李华
网站建设 2026/9/28 5:51:14

基于JavaWeb的仓库管理系统:十三大模块与部署实战解析

简介&#xff1a;一套基于JavaWeb的仓库管理系统完整项目包&#xff0c;面向Java初学者、系统分析与设计课程学员及企业信息化实践者。系统采用B/S架构&#xff0c;基于Servlet、JSP、JDBC与HTML/CSS/JS实现&#xff0c;并结合人工智能思路支持库存预警与智能预测&#xff0c;覆…

作者头像 李华
网站建设 2026/9/28 5:50:46

Windows基础安全加固:从账户权限到日志审计的完整实践

我在“智榜样一阶段”的02课里学的是Windows操作系统基础安全&#xff0c;这门课没有讲怎么用电脑&#xff0c;也没有教怎么装系统&#xff0c;而是沉下来把Windows当作一个被攻击的目标来看。坦白讲&#xff0c;Windows大概是很多人接触的第一台电脑系统&#xff0c;日常使用太…

作者头像 李华
网站建设 2026/9/28 5:50:46

AI辅助MBA论文写作:9款实用工具搞定开题报告与文献综述

每次带MBA论文班&#xff0c;我都会遇到几乎一模一样的开场白&#xff1a;老师&#xff0c;开题报告不知道怎么写&#xff0c;文献综述更是看了三十篇论文还是一团乱麻。说实话&#xff0c;这个困境我很理解。MBA论文和普通学术论文完全是两种生物&#xff0c;它要求你用学术框…

作者头像 李华