简介:面向 Java Web 初学者的 JSP+MySQL 个人日记本完整项目源码,可用于课程设计、毕业设计或入门练手。项目业务围绕日记的增删改查、分类管理、登录验证与个人中心展开,覆盖 JSP/Servlet、JDBC、Session 会话管理和 MVC 分层等常见知识点,能直观看到动态页面与数据库交互的完整实现,也涉及表单提交、文件上传等实用细节。压缩包共 90 个文件,大小约 256KB,包含 27 个 HTML 页面、18 个 Java 类、8 个 JSP 视图、21 张 PNG 图片,以及 SQL/配置文件和 README 文档,前端页面、后端逻辑与资源素材分区清楚,便于按需查阅。目前已有 223 人学习下载。通过源码可获得建表脚本、登录注册与日记管理模块的代码写法、文件结构组织方式,配合文档说明即可部署运行并二次改造,支持按分类管理日记,便于扩展为个人博客或笔记系统,是学习传统 Java Web 开发的不错参考。
1. 这个基于 JSP+MySQL 的个人日记本源码,到底能拿来干什么
如果你搜到这个标题,大概率是在准备 Java 课程设计、毕业设计,或者在找一份能完整跑通的传统 JSP 项目练手。这个“基于 jsp+mysql 的 JSP 个人日记本源码”不是那种花哨的后台管理系统,它就是一个标准到不能再标准的 Java Web 增删改查项目:用户注册登录,写日记、看列表、编辑、删除,数据全部存进 MySQL。正因为它简单,才特别适合用来搞懂 JSP 项目的请求流转、数据库连接、Servlet 写法,以及 Tomcat 部署这套基本功。
真正有价值的地方在于:这套源码把 JSP + Servlet + MySQL 的经典三层结构摆在明面上,没有 Spring、没有 MyBatis,所有细节都裸露着。你跟着跑通一次,以后再看 SSM、Spring Boot 项目,很多概念都能对得上。它能解决新手“看懂了教程但不会落一个完整项目”的痛点,也是老师最喜欢布置的那类题目。适合的人群很具体:要交课程设计的学生、刚开始学 JavaWeb 想找个完整案例的开发者、以及想把老项目改成 IDEA + Tomcat 部署形式的兼职开发。
2. 先把环境搭起来:JDK、Tomcat、MySQL 和 IDEA 的版本组合
这套 JSP 源码是十年前的典型产物,最大的坑不是代码本身,而是你的开发环境和它不匹配。见过太多人一上来用 JDK 17 + Tomcat 10 + MySQL 8 去跑 JSP 老项目,结果被 jakarta.servlet 和 javax.servlet 的差异直接劝退。所以第一步不是打开源码,而是先把版本矩阵固定下来。
2.1 版本选型:为什么 JDK 8 + Tomcat 8.5 + MySQL 5.7 是黄金组合
传统 JSP 项目基于 javax.servlet 规范编写,而 Tomcat 10 开始把 javax 替换成 jakarta,老源码里的import javax.servlet.http.HttpServlet会直接编译失败。常见做法是选择 Tomcat 8.5 或 9.0,它们仍然使用 javax 命名空间,兼容性最好。JDK 用 8 就够了,哪怕你的 IDEA 已经装了 JDK 17,也可以在 Project Structure 里给这个项目单独指定 JDK 8,不影响其他新项目。
MySQL 方面,5.7 是最省事的,驱动用mysql-connector-java-5.1.49.jar或者 8.0.11 版本都能连。如果机器上已经装了 MySQL 8.0,问题也不大,需要把驱动换成 8.0 系列的 jar,并且连接 URL 加上serverTimezone=Asia/Shanghai。我建议第一次跑源码直接用 5.7,可以把变量降到最低。
提示:如果你只装了 MySQL 8.0,不想换,那也可以跑,但一定要改驱动和 URL,后面避坑章节会专门说。
2.2 用 IDEA 新建 JSP 项目并导入源码包的步骤
拿到带.zip的源码包后,先解压到一个没有中文和空格的路径,比如D:\diary。然后用 IntelliJ IDEA 导入,推荐直接用 “Open” 打开解压后的文件夹,IDEA 会自动识别为项目。如果源码里带了.idea目录,说明别人用 IDEA 配置过,直接打开就能看到 Tomcat 配置;如果没有,就按下面步骤手动配置。
打开后先检查目录结构,一个标准的传统 JSP 项目应该有 src 源码目录、web 目录(或 webapp 目录)、WEB-INF、lib、jsp 页面。如果没有 Maven 的pom.xml,这就是一个普通的 Web 项目,不是 Maven 结构。IDEA 里需要先给它添加 Web 框架支持,方法如下:
- 右键项目根目录,选择 “Add Framework Support”。
- 勾选 “Web Application”,注意不要勾选 “Create web.xml” 如果是旧版 IDEA 会自动生成。
- 确认
WEB-INF/web.xml存在,Servlet 映射都写在里面。
接着配置 JDK 和编译输出。打开File -> Project Structure -> Project,把 SDK 指向 1.8,语言级别也选 8。再打开Modules -> Paths,确认编译输出目录是target/classes还是WEB-INF/classes,无所谓,只要最后部署配置里选对就行。
2.3 修改数据库连接配置:db.properties 或 DBUtil.java
源码里数据库连接通常写在db.properties文件里,或者直接硬编码在DBUtil.java中。两种都要检查。如果是 properties 文件,内容基本长这样:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/diary?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=123456注意这里的characterEncoding=utf-8,缺了它中文写入数据库就会变成问号。密码改成你本机 MySQL 的 root 密码。如果你是 MySQL 8.0,还需要把驱动改成com.mysql.cj.jdbc.Driver,并在 URL 末尾加serverTimezone=Asia/Shanghai&useSSL=false,对应关系就是:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/diary?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false如果源码把连接写在 Java 类里,比如DBUtil.java,那就打开文件,把Class.forName那行和DriverManager.getConnection那行的参数改成同样的内容。很多课程设计源码喜欢把代码和配置混在一起,你改完 Java 文件后记得重新编译。
2.4 初始化数据库:把 diary.sql 导入 MySQL
源码包内通常附带diary.sql或diary_db.sql文件,这是建库建表脚本。打开 MySQL 命令行或者 Navicat,执行这条命令导入:
mysql -u root -p < D:/diary/diary.sql按回车后输入密码,如果脚本里没有CREATE DATABASE语句,你需要在执行前手动建库:
mysql -u root -p进入 MySQL 后执行:
CREATE DATABASE diary DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE diary; SOURCE D:/diary/diary.sql;注意看 SQL 脚本里是直接USE diary还是CREATE DATABASE IF NOT EXISTS。如果脚本里已经写了建库语句,那直接导入即可。导入完成后可以用SHOW TABLES;验证,正常情况下能看到t_user、t_diary之类的表。
提示:如果导入时报错,多半是脚本里的字符集和 MySQL 实际默认字符集不一致,可以用记事本打开 SQL 文件,把所有
utf8mb4替换成utf8再试一次,或者反过来。
3. 代码结构拆解:从 index.jsp 到 DiaryServlet 的请求流转
环境跑通之后,先别急着点按钮,把代码结构看懂。这套个人日记本源码虽然小,但它包含了一个完整的 JavaWeb 请求闭环:浏览器发送请求 -> web.xml 找映射 -> Servlet 处理 -> 调用 DAO -> 操作 MySQL -> 跳转 JSP -> 渲染页面。搞清楚这条链路,你就能改任何功能。
3.1 前端页面:JSP 里 HTML、Java 代码和 CSS 的分层
打开web目录下的 JSP 文件,比如index.jsp、login.jsp、register.jsp、diaryList.jsp。这些页面大多是直接在 JSP 里写 HTML,再用<% %>嵌 Java 代码取数据。典型的写法是这样:
<% User user = (User) session.getAttribute("user"); if (user == null) { response.sendRedirect("login.jsp"); return; } %> <h2>欢迎你,<%= user.getUsername() %></h2>这段代码的作用是防止未登录用户直接访问日记列表。逻辑不复杂,但从现代开发角度看,JSP 里混 Java 代码是坏味道,只是传统项目都是这么写的。你在模板上看到的<form action="DiaryServlet?action=add" method="post">,就是提交日记表单到 Servlet 的入口。整个前端没有框架,手写 CSS 和 JavaScript 控制样式、弹窗、确认删除。
这里有一个关键点:很多新手改页面时,只看到 JSP 文件里的 HTML,却没注意到这些页面是经过 JSP 引擎编译的。你改了 HTML 部分后,不需要重启 Tomcat,只要刷新浏览器就行,因为 IDEA 的 Tomcat 插件默认是热部署 JSP 的。但如果你改了 Java 类,通常需要重启或者重新编译。
3.2 Servlet 层:DiaryServlet 如何分发增删改查操作
打开src目录下的DiaryServlet.java,你会看到类似这样的结构:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); if ("add".equals(action)) { addDiary(request, response); } else if ("delete".equals(action)) { deleteDiary(request, response); } else if ("update".equals(action)) { updateDiary(request, response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("list".equals(action)) { listDiary(request, response); } else if ("view".equals(action)) { viewDiary(request, response); } else { listDiary(request, response); } }这是典型的 Action 分发模式。所有请求都打到同一个 Servlet,然后根据action参数路由到不同方法。好处是 web.xml 里只需要配置一个 Servlet 映射,坏处是随着功能增多,这个类会越来越臃肿。但在这个个人日记本项目里,这个设计是够用的。
逻辑说明:doPost处理有副作用的数据变更操作,比如新增、修改、删除;doGet处理查询和页面跳转。为什么删除放在doPost?因为用doGet接受删除请求容易被 CSRF 攻击,虽然课程设计不要求安全性,但习惯上还是把修改数据的操作放 post。有些源码会把删除写成doGet,这不算错,但你能看出来作者的功底。
参数说明:action是 Servlet 识别操作类型的关键参数,对应的 JSP 表单里隐藏字段或者 JS 中会带上?action=add。如果你在浏览器地址栏手动输入DiaryServlet?action=delete&id=3,就相当于直接删掉 id 为 3 的日记。这也是为什么后面要强调,真实环境必须做权限校验。
3.3 数据库访问层:DBUtil 和 DAO 模式的实现
数据库访问层通常集中在DBUtil.java和DiaryDao.java两个文件。DBUtil负责获取连接和关闭连接,核心代码如下:
public class DBUtil { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/diary?useUnicode=true&characterEncoding=utf-8"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }逻辑说明:静态代码块保证驱动只注册一次。getConnection()每次调用都新建一个连接,性能很差,但满足课程设计的需求。抽取成工具类之后,DAO 层不用关心驱动怎么加载,只专注 SQL 操作。
DiaryDao.java里是具体的增删改查语句,常见的就是这种:
public int addDiary(Diary diary) { String sql = "insert into t_diary(title, content, user_id, create_time) values(?,?,?,?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, diary.getTitle()); ps.setString(2, diary.getContent()); ps.setInt(3, diary.getUserId()); ps.setTimestamp(4, new Timestamp(System.currentTimeMillis())); return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); return 0; } }这里用了PreparedStatement做参数化查询,可以防止 SQL 注入,是必须坚持的写法。如果你在源码里看到直接拼接字符串的版本,建议你自己改成PreparedStatement版本。逻辑说明:?占位符按顺序绑定参数,executeUpdate()返回受影响行数,大于 0 说明插入成功。参数说明:setTimestamp用来处理 MySQL 的datetime类型,避免用字符串导致的格式问题。
这个层是整个源码最值得复用的部分,因为 DAO 的 CRUD 方法写得规整,你换成连接池或者换成 MyBatis 后,Service 层可以不用动。
4. 部署运行与验收:让日记本在浏览器里真正跑起来
环境配好、代码看懂之后,要落到能点开网页。这里从 IDEA 配置 Tomcat 开始讲,再讲独立部署的 WAR 包流程,最后给一张功能验收清单,帮助你确认项目是真的完整跑通了,而不是“页面出来但功能全是坏的”。
4.1 用 IDEA 配置 Tomcat 并启动项目
如果你直接用 IDEA 打开项目,并且没有现成的 Tomcat 配置,那么这样操作:
- 打开菜单
Run -> Edit Configurations。 - 点击左上角
+,选择 “Tomcat Server -> Local”。 - 在
Application server处点击Configure,选择你本机的 Tomcat 8.5 目录,IDEA 会识别出版本号。 - 切换到
Deployment页签,点击+,选择Artifact,然后选中项目名:war exploded。 Application context一般填/diary,或者直接填/,这个对应浏览器访问路径。Server页签里的HTTP port保持 8080 不变,AJP port不用管。
启动前,检查项目的编译是否正确。IDEA 中按Ctrl+Shift+F9编译项目,如果控制台没有报错,说明代码层面的问题不大。如果报错说找不到javax.servlet等类,说明缺少 Tomcat 运行时依赖,需要在Project Structure -> Modules -> Dependencies里加上 Tomcat 的库,或者把servlet-api.jar放到WEB-INF/lib下。
配置完成后,点击运行按钮,IDEA 会启动 Tomcat 并自动部署。浏览器访问http://localhost:8080/或者http://localhost:8080/diary/,看到首页说明部署成功。
注意:如果 8080 端口被占用,启动日志会报
Port 8080 was already in use。解决办法是关掉占用端口的进程,或者把 Tomcat 的 HTTP port 改成 8081。
4.2 功能验收清单:注册、登录、写日记、编辑、删除,一个不能少
项目跑起来后,按正常用户路径走一遍,才能确认源码质量。我列了一张清单,每项都要实际点一遍。
| 验收项 | 操作路径 | 预期结果 |
|---|---|---|
| 注册 | 首页点击注册,填写用户名和密码 | 注册成功跳转登录页,数据库 t_user 表多一条记录 |
| 登录 | 用刚注册的账号登录 | 跳转到日记列表页,session 里有 user 对象 |
| 写日记 | 点击“写日记”,输入标题和内容提交 | 列表页出现新日记,数据库新增记录 |
| 编辑 | 在某条日记上点击“修改” | 表单回填原内容,保存后列表刷新 |
| 删除 | 点击“删除”,弹确认框后确认 | 该条日记从列表消失,数据库记录删除 |
| 未登录拦截 | 直接访问 diaryList.jsp | 跳回登录页,不会显示空白页面 |
| 分页 | 日记超过一页(每页 5 条或 10 条) | 列表底部出现页码,点击能翻页 |
如果某一项失败,先记住是在哪个步骤断掉的。大多数人失败在写日记提交后 500,或者登录后列表页报错。这时候要看 Tomcat 控制台的堆栈信息,定位到 DAO 层还是 Servlet 层。别慌,后面避坑章节有集中排查。
4.3 把传统 JSP 项目打包成 WAR 并在独立 Tomcat 部署
课程设计交作业时,老师通常会要一个 WAR 包,方便他在自己机器上丢进 Tomcat 就能跑。传统 JSP 项目打包 WAR 其实很简单。在 IDEA 中打开Project Structure -> Artifacts,点击+,选择Web Application: Archive,名字设为diary.war。在Output Layout中确认把WEB-INF下所有内容打进去,然后Build -> Build Artifacts -> Build。
生成的 WAR 文件在项目目录下的out/artifacts/diary_war里。把这个 WAR 复制到 Tomcat 的webapps目录下,然后启动 Tomcat(在 bin 目录下执行startup.bat)。Tomcat 会自动解压 WAR 并部署,访问地址是http://localhost:8080/diary/。
这里有个常见错误:有些源码包里的WEB-INF下面缺少web.xml,导致部署后 404。如果你遇到这个问题,可以检查webapps/diary/WEB-INF/web.xml是否存在。如果缺失,需要从源码包里找回或者新建一个最简的 web.xml,并把 Servlet 映射写进去。传统 JSP 项目不写 web.xml 是不行的,除非你用的是 Servlet 3.0 以上的注解方式。
5. 避坑指南:源码跑不起来的 5 个血泪原因
这一章是重点,这些坑我基本都踩过,而且每次帮别人调这套源码,翻来覆去就是这几个问题。每一条我都按“现象 -> 原因 -> 解决”的顺序写,你可以直接对照排查。
5.1 数据库连接失败:ClassNotFoundException 与责任链排查
现象:启动项目后,访问登录页正常,但点击“登录”按钮后报错,控制台出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,或者Unknown database 'diary'。
原因:驱动 jar 没有放到WEB-INF/lib目录,或者数据库名不对,又或者 MySQL 服务没启动。这三种情况表象极像,都是连接异常。
解决:先确认 MySQL 服务正在运行,任务管理器里能看到mysqld.exe或mysql.exe进程。然后检查驱动 jar 是否存在于WEB-INF/lib下,IDEA 部署时有时不会自动带上 lib 目录。如果 jar 在,但项目是 Maven 结构,还需要检查依赖是否引入。最后用命令验证数据库是否存在:
SHOW DATABASES;如果没有diary,就用第 2 章讲的方法重新导入 SQL。这一套查下来,90% 的连接问题都能解决。
5.2 MySQL 8 和 MySQL 5.7 的驱动不兼容
现象:你用 MySQL 8.0 数据库,但源码里是com.mysql.jdbc.Driver,连接时报错Loading class 'com.mysql.jdbc.Driver' is deprecated或者Communications link failure。
原因:MySQL 8.0 驱动把主类改成了com.mysql.cj.jdbc.Driver,同时要求 URL 里必须指定serverTimezone,否则会报 CST 时区异常。
解决:如果不想改代码,就重新装 MySQL 5.7。想保留 MySQL 8,需要同时改两处:驱动类名和 URL。另外,jar 包要换成mysql-connector-java-8.0.11.jar或更新的版本。改完后务必重启 Tomcat,光刷新页面没用,因为驱动类已经加载过了。
5.3 中文乱码:JSP 页面、请求参数、数据库三处必须统一
现象:注册用户名后,数据库里显示“???”,或者日记内容变成乱码,但页面本身中文正常。
原因:Tomcat 默认使用 ISO-8859-1 解码 POST 参数,数据库连接 URL 没指定 UTF-8,或者建表的时候字符集是 latin1。
解决:三处缺一不可。第一,JSP 页面顶部需要写上:
<%@ page contentType="text/html; charset=UTF-8" language="java" %>第二,Servlet 里的doPost和doGet第一行都要加上:
request.setCharacterEncoding("UTF-8");第三,数据库 JDBC URL 里加useUnicode=true&characterEncoding=utf-8。最后再用ALTER TABLE t_diary CONVERT TO CHARACTER SET utf8;修复已经建错的表。这样改完,中文写入和读出都会正常。
5.4 Tomcat 10 的 jakarta 命名空间导致编译报错
现象:你把源码放到 Tomcat 10 里,编译时大量报错,比如Package jakarta.servlet does not exist提示,实际上源码里写的是javax.servlet。
原因:Tomcat 10 是第一个采用 Jakarta EE 9 规范的版本,彻底把javax.servlet改成了jakarta.servlet。传统 JSP 源码基于老规范,无法直接运行。
解决:最省事的办法是改用 Tomcat 8.5 或 9.0,这俩在 JavaWeb 老项目场景下最稳。如果你非要用 Tomcat 10,那就得全局替换源码和 JSP 里的import javax.servlet为import jakarta.servlet,但这样项目失去“传统”意义,而且很多教程和课程答辩环境不认。我的建议是:装个 Tomcat 8.5,一劳永逸。
5.5 端口冲突和项目路径访问 404
现象:IDEA 启动 Tomcat 时提示Port 8080 is already in use,或者启动成功后浏览器访问一直 404。
原因:端口被占用时,Tomcat 起不来自然 404。项目路径不对时,比如上下文是/diary,你却访问http://localhost:8080/,也会 404。
解决:端口冲突时,用netstat -ano | findstr 8080找出占用 PID,然后到任务管理器结束进程;如果你不想动其他服务,把 Tomcat 的端口改成 8081 即可。路径问题最简单:在 IDEA 的 Deployment 配置里看Application context是什么,就访问什么路径。如果它是/,访问http://localhost:8080/index.jsp;如果是/diary,访问http://localhost:8080/diary/index.jsp。
注意:修改端口或路径后,一定要重启 Tomcat,不能只刷新网页。因为 Deployment 配置是在启动时读取的。
6. 进阶改造:从“能跑”到“像产品”的三个方向
如果这个日记本源码你已经跑通并完成了作业,不要急着删掉。它底子虽然老,但改造空间很大。这里给三个投入产出比最高的方向,做完之后,简历和课程设计报告都能多写两页。
6.1 用 JSTL + EL 把 JSP 里的 Java 代码抽干净
源码里的 JSP 页面到处是<% %>和<%= %>,这种写法在十年前很常见,但现在看起来技术债太重。改造方法很简单:在 JSP 头部引入 JSTL 标签库,然后把循环输出列表的部分替换成 EL 表达式。
比如日记列表,原来的写法可能是:
<% List<Diary> list = (List<Diary>) request.getAttribute("diaryList"); for (Diary d : list) { %> <tr> <td><%= d.getTitle() %></td> <td><%= d.getCreateTime() %></td> </tr> <% } %>改造后变成:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:forEach items="${diaryList}" var="d"> <tr> <td>${d.title}</td> <td>${d.createTime}</td> </tr> </c:forEach>逻辑说明:${diaryList}取出 Servlet 放进 request 的数据,var="d"是每一条记录的变量名,d.title会调用Diary类的getTitle()方法。这样做的好处是 JSP 页面里不再有 Java 代码,前端和后端的职责更清楚。参数说明:你需要把jstl-1.2.jar放到WEB-INF/lib下,并且保证 Servlet 里用的是request.setAttribute("diaryList", list),名字和 EL 里的 key 完全一致。
6.2 引入连接池替代裸 JDBC 连接
当前DBUtil每次请求都新建数据库连接,在测试环境没毛病,但如果你把项目往服务器上一放,并发一上来就会连接超时。用 DBCP 连接池改造非常简单,把DBUtil换成这样:
private static BasicDataSource dataSource = new BasicDataSource(); static { dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/diary?useUnicode=true&characterEncoding=utf-8"); dataSource.setUsername("root"); dataSource.setPassword("123456"); dataSource.setInitialSize(5); dataSource.setMaxTotal(20); dataSource.setMaxIdle(10); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); }逻辑说明:BasicDataSource是 Apache Commons DBCP 的类,启动时初始化 5 个连接,最多扩展到 20 个。以后getConnection()不再新建连接,而是从池里借一个,用完归还。参数说明:initialSize是初始连接数,maxTotal是最大连接总数,maxIdle是最大空闲连接数。并发量不高的日记本项目,5/20/10 足够。改造完成后,原来DBUtil.getConnection()的调用方式不用动,DAO 代码零修改,这是连接池设计带来的好处。
6.3 给日记加 Markdown 编辑和全文搜索
这是最出彩的方向。日记本不是纯技术 demo,真实用户需要舒服的书写体验。可以在写日记的页面引入一个小的 Markdown 编辑器,把日记内容以 Markdown 格式存储,展示时用开源 JS 库(如 marked.js)渲染 HTML。后端只需要改两个地方:存储时原样保存 Markdown 文本,查询时按原样输出到 JSP,由前端渲染。
全文搜索则需要用 MySQL 的 LIKE 加上一个输入框:
SELECT * FROM t_diary WHERE user_id = ? AND (title LIKE ? OR content LIKE ?)对应的 DAO 方法:
public List<Diary> searchDiary(int userId, String keyword) { List<Diary> list = new ArrayList<>(); String sql = "SELECT * FROM t_diary WHERE user_id = ? AND (title LIKE ? OR content LIKE ?) ORDER BY create_time DESC"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, userId); ps.setString(2, "%" + keyword + "%"); ps.setString(3, "%" + keyword + "%"); ResultSet rs = ps.executeQuery(); while (rs.next()) { // 构造 Diary 对象并加入 list } } catch (SQLException e) { e.printStackTrace(); } return list; }逻辑说明:LIKE '%关键词%'是最简单的全文搜索,虽然效率不高,但日记本数据量小,完全够用。参数说明:搜索条件是模糊匹配标题或内容,ORDER BY create_time DESC让最新的日记排在最前面。Servlet 里新增一个action=search分支,读取request.getParameter("keyword"),调用 DAO 并传回 JSP 显示。
这三步做完,这个 JSP 个人日记本就从一个“课程设计模板”变成了“有价值的小产品”。最后一个建议:每次改完一段代码,都先用第 4 章的功能验收清单跑一遍,防止改出回归 bug。这是我做老项目改造的习惯,翻车太多次了,就知道回归测试比写新功能更省时间。希望这个项目能成为你理解 JavaWeb 的一块跳板,也希望能帮到你顺利跑通第一版。
本文还有配套的精品资源,点击获取