基于Thymeleaf+Servlet的图书管理系统开发实战
1. 项目概述这个基于ThymeleafMavenServletMySQL的图书管理系统框架是我在实际开发中总结的一套完整解决方案。它采用了Java Web开发中最经典的架构组合特别适合中小型图书管理系统的快速开发。我在多个实际项目中验证过这套框架的稳定性和扩展性今天就来详细拆解它的技术实现。2. 技术栈选型解析2.1 为什么选择ThymeleafThymeleaf作为现代Java模板引擎相比JSP有显著优势自然模板特性直接在浏览器打开就能预览无需启动服务器强大的表达式语言支持复杂的页面逻辑处理与Spring生态完美集成虽然我们这里用Servlet但Thymeleaf依然表现出色实际开发中我常用这些Thymeleaf特性!-- 数据绑定示例 -- div th:text${book.title}/div !-- 循环处理 -- tr th:eachbook : ${books} td th:text${book.id}/td /tr !-- 条件判断 -- span th:if${book.stock} 0 th:text库存${book.stock}/span2.2 Maven的依赖管理Maven的pom.xml配置是项目基石。关键配置要点dependencies !-- Servlet API -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- Thymeleaf核心 -- dependency groupIdorg.thymeleaf/groupId artifactIdthymeleaf/artifactId version3.0.12.RELEASE/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.25/version /dependency /dependencies注意MySQL 8.x版本驱动类名已改为com.mysql.cj.jdbc.Driver与5.x的com.mysql.jdbc.Driver不同2.3 Servlet的核心作用在这个框架中Servlet承担着控制器(Controller)的角色。我通常采用一个前端控制器模式WebServlet(/*) public class DispatcherServlet extends HttpServlet { private TemplateEngine templateEngine; Override public void init() { // 初始化Thymeleaf模板引擎 ServletContextTemplateResolver resolver new ServletContextTemplateResolver(getServletContext()); resolver.setPrefix(/WEB-INF/templates/); resolver.setSuffix(.html); templateEngine new TemplateEngine(); templateEngine.setTemplateResolver(resolver); } protected void doGet(HttpServletRequest request, HttpServletResponse response) { String path request.getRequestURI().substring(request.getContextPath().length()); switch(path) { case /books: showBookList(request, response); break; // 其他路由处理... } } }3. 数据库设计与实现3.1 MySQL表结构设计图书系统的核心表结构设计CREATE TABLE books ( id int(11) NOT NULL AUTO_INCREMENT, isbn varchar(20) NOT NULL, title varchar(100) NOT NULL, author varchar(50) NOT NULL, publisher varchar(50) DEFAULT NULL, publish_date date DEFAULT NULL, price decimal(10,2) DEFAULT NULL, stock int(11) DEFAULT 0, category_id int(11) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY isbn_unique (isbn) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE categories ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL, description varchar(200) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 DAO层实现我推荐采用JDBC连接池的方式public class BookDAO { private DataSource dataSource; public BookDAO() { // 使用HikariCP连接池 HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/library); config.setUsername(root); config.setPassword(password); dataSource new HikariDataSource(config); } public ListBook findAll() throws SQLException { String sql SELECT * FROM books; try (Connection conn dataSource.getConnection(); PreparedStatement stmt conn.prepareStatement(sql)) { ResultSet rs stmt.executeQuery(); ListBook books new ArrayList(); while (rs.next()) { Book book new Book(); book.setId(rs.getInt(id)); book.setTitle(rs.getString(title)); // 其他字段... books.add(book); } return books; } } }4. 前后端交互实现4.1 控制器到视图的数据传递Servlet中处理请求并渲染视图的典型流程protected void showBookList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { ListBook books bookDAO.findAll(); request.setAttribute(books, books); WebContext ctx new WebContext(request, response, getServletContext(), request.getLocale()); ctx.setVariable(books, books); templateEngine.process(book/list, ctx, response.getWriter()); } catch (SQLException e) { throw new ServletException(Database error, e); } }4.2 Thymeleaf页面展示对应的Thymeleaf模板示例!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head title图书列表/title /head body h1图书库存/h1 table thead tr thID/th th书名/th th作者/th th价格/th th库存/th /tr /thead tbody tr th:eachbook : ${books} td th:text${book.id}/td td th:text${book.title}/td td th:text${book.author}/td td th:text${#numbers.formatDecimal(book.price, 1, 2)}/td td th:text${book.stock}/td /tr /tbody /table /body /html提示Thymeleaf的#numbers.formatDecimal可以方便地格式化数字显示第一个参数是小数位数第二个是整数部分最小位数5. 项目部署与优化5.1 Maven打包配置war包打包配置示例build finalNamelibrary/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version /plugin /plugins /build使用命令打包mvn clean package5.2 性能优化建议模板缓存生产环境开启Thymeleaf缓存resolver.setCacheable(true); templateEngine.setCacheManager(new StandardCacheManager());连接池配置合理设置连接池参数config.setMaximumPoolSize(20); config.setMinimumIdle(5); config.setConnectionTimeout(30000);静态资源处理配置默认Servlet处理静态资源servlet-mapping servlet-namedefault/servlet-name url-pattern/static/*/url-pattern /servlet-mapping6. 常见问题解决方案6.1 MySQL连接问题问题现象Communications link failure解决方案检查MySQL服务是否启动确认连接URL格式正确MySQL 8.x需要时区参数jdbc:mysql://localhost:3306/library?useSSLfalseserverTimezoneAsia/Shanghai检查用户名密码是否正确6.2 Thymeleaf模板解析错误问题现象TemplateResolutionException: Template could not be resolved排查步骤确认模板文件放在/WEB-INF/templates/目录下检查模板文件后缀是否与配置一致确认ServletContext路径正确6.3 Maven依赖冲突问题现象NoSuchMethodError 或 ClassNotFoundException解决方案使用mvn dependency:tree查看依赖树排除冲突依赖dependency groupIdgroup/groupId artifactIdartifact/artifactId exclusions exclusion groupIdconflict-group/groupId artifactIdconflict-artifact/artifactId /exclusion /exclusions /dependency7. 扩展与进阶7.1 添加分页功能实现思路DAO层添加分页参数public ListBook findPage(int page, int size) { String sql SELECT * FROM books LIMIT ?, ?; // 使用(preparedStatement.setInt(1, (page-1)*size)等) }控制器计算分页信息int total bookDAO.count(); int totalPages (int) Math.ceil((double)total / size); request.setAttribute(currentPage, page); request.setAttribute(totalPages, totalPages);页面添加分页导航div classpagination a th:href{/books(page${currentPage}-1)} th:unless${currentPage} 1上一页/a span th:eachi : ${#numbers.sequence(1, totalPages)} a th:href{/books(page${i})} th:text${i} th:classappend${i currentPage} ? active/a /span a th:href{/books(page${currentPage}1)} th:unless${currentPage} totalPages下一页/a /div7.2 文件上传功能Servlet 3.0的文件上传实现表单设置form th:action{/upload} methodpost enctypemultipart/form-data input typefile namefile button typesubmit上传/button /formServlet处理MultipartConfig WebServlet(/upload) public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) { Part filePart request.getPart(file); String fileName Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); try (InputStream fileContent filePart.getInputStream()) { // 保存文件到服务器 Files.copy(fileContent, Paths.get(/uploads, fileName)); } } }这套框架经过多次项目实战检验在中小型图书管理系统开发中表现稳定可靠。特别是在快速开发原型系统时这种轻量级架构能大大缩短开发周期。我在实际使用中发现合理组织项目结构后后续功能扩展也非常方便。

相关新闻

BepInEx模组框架零基础实战指南:3步让Unity游戏用上插件

BepInEx模组框架零基础实战指南:3步让Unity游戏用上插件

BepInEx模组框架零基础实战指南:3步让Unity游戏用上插件 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 看到别人游戏里多出神秘新功能、全新UI,自己却只会…

2026/8/18 23:04:34 阅读更多 →
掌握Python开发的五个关键阶段,帮你少走弯路

掌握Python开发的五个关键阶段,帮你少走弯路

夜深人静,你对着屏幕上跳动的报错信息,第三次怀疑自己是不是选错了路。Python号称“最简单的编程语言”,但简单只是它的表象,真正让你困在原地的,从来不是语法,而是那种“我好像会了,又好像什么…

2026/8/17 20:33:39 阅读更多 →
后端接口性能优化,我优先排查这五个地方

后端接口性能优化,我优先排查这五个地方

数据库的慢查询日志往往最能说明问题。如果你发现某个接口的耗时与数据量成正比,或者随着业务增长越来越慢,第一步就该去看它执行的SQL。我见过很多接口优化案例,最终都归结为一条走了全表扫描的SQL。用EXPLAIN查看执行计划时,重点…

2026/8/20 23:30:23 阅读更多 →

最新新闻

3 分钟把 NCM 转 MP3

3 分钟把 NCM 转 MP3

3 分钟把 NCM 转 MP3 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump 是一个免费的 NCM 转 MP3 工具,在本机把网易云下载的 .ncm 文件解开成通用 MP3,给想在播放器、车机、剪辑软件里用自己的歌的人。…

2026/8/24 9:49:15 阅读更多 →
FastAPI-MCP:FastAPI 接口转 MCP 工具网关部署实践指南

FastAPI-MCP:FastAPI 接口转 MCP 工具网关部署实践指南

FastAPI-MCP:FastAPI 接口转 MCP 工具网关部署实践指南 【免费下载链接】fastapi_mcp Expose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth! 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp 需要把已有的 Fast…

2026/8/24 9:49:15 阅读更多 →
文本摘要评估框架sumeval完全解析:ROUGE/BLEU一站搞定,多语言支持让评测不再头疼

文本摘要评估框架sumeval完全解析:ROUGE/BLEU一站搞定,多语言支持让评测不再头疼

文本摘要评估框架sumeval完全解析:ROUGE/BLEU一站搞定,多语言支持让评测不再头疼 【免费下载链接】sumeval Well tested & Multi-language evaluation framework for text summarization. 项目地址: https://gitcode.com/gh_mirrors/su/sumeval …

2026/8/24 9:49:15 阅读更多 →
cloudflare-operator安全加固完全指南:最小权限API Token与Cloudflare Access ZTNA防护实践

cloudflare-operator安全加固完全指南:最小权限API Token与Cloudflare Access ZTNA防护实践

cloudflare-operator安全加固完全指南:最小权限API Token与Cloudflare Access ZTNA防护实践 【免费下载链接】cloudflare-operator A Kubernetes Operator to create and manage Cloudflare Tunnels and DNS records for (HTTP/TCP/UDP*) Service Resources 项目…

2026/8/24 9:49:15 阅读更多 →
Bitnodes如何维护上万个比特币节点长连接:ping.py与gevent绿色线程并发模型深度剖析

Bitnodes如何维护上万个比特币节点长连接:ping.py与gevent绿色线程并发模型深度剖析

Bitnodes如何维护上万个比特币节点长连接:ping.py与gevent绿色线程并发模型深度剖析 【免费下载链接】bitnodes Bitnodes estimates the size of the Bitcoin peer-to-peer network by finding all of its reachable and unreachable nodes. 项目地址: https://gi…

2026/8/24 9:49:15 阅读更多 →
图增强联想记忆GAAMA:解决AI智能体记忆碎片化难题

图增强联想记忆GAAMA:解决AI智能体记忆碎片化难题

1. 项目概述:当智能体需要“记忆”时,我们谈什么?如果你最近在折腾AI智能体(Agents),尤其是那些需要处理复杂任务、进行多轮对话或决策的,大概率会遇到一个核心痛点:记忆问题。智能体…

2026/8/24 9:48:11 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →