1. 项目背景与技术选型
这个图书管理系统项目采用了Java Web开发的经典技术栈组合:Thymeleaf作为模板引擎,Maven进行依赖管理,Servlet处理业务逻辑,MySQL作为数据存储。这种技术组合在中小型Web应用中非常常见,特别适合需要快速开发、易于维护的校园图书馆、企业图书借阅等场景。
为什么选择这个技术栈?从我的实际项目经验来看,这套组合有几个明显优势:
- Thymeleaf的天然模板特性可以直接在浏览器中预览,大大简化了前后端协作的复杂度
- Maven的依赖管理能有效解决Java项目中的Jar包冲突问题
- Servlet作为Java EE标准组件,具有极好的兼容性和稳定性
- MySQL作为开源关系型数据库,在数据一致性和事务支持方面表现优异
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与项目搭建
2.1 Maven环境配置
首先需要确保开发环境已正确配置Maven。我推荐使用Maven 3.6.x版本,这个版本在稳定性和兼容性方面表现最好。配置时需要注意几个关键点:
- 设置本地仓库路径时,建议不要使用包含中文或空格的目录
- 配置阿里云镜像可以大幅提升依赖下载速度:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
2.2 MySQL数据库准备
图书管理系统通常需要设计以下几个核心表:
- 图书信息表(book_info):存储图书基本信息
- 用户表(user):管理系统用户
- 借阅记录表(borrow_record):记录借阅信息
建表示例:
sql复制CREATE TABLE `book_info` (
`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,
`status` tinyint(1) DEFAULT '1' COMMENT '1-可借 0-已借出',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_isbn` (`isbn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. Servlet核心逻辑实现
3.1 图书查询功能
图书查询是系统的核心功能,需要处理分页查询和条件查询。在Servlet中实现时要注意:
- 使用GET方法接收查询参数
- 对查询参数进行合法性校验
- 分页参数要设置默认值
典型实现代码:
java复制protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int page = 1;
int size = 10;
try {
page = Integer.parseInt(request.getParameter("page"));
size = Integer.parseInt(request.getParameter("size"));
} catch (NumberFormatException e) {
// 使用默认值
}
String title = request.getParameter("title");
String author = request.getParameter("author");
BookService service = new BookService();
PageResult<Book> result = service.queryBooks(title, author, page, size);
request.setAttribute("bookList", result.getData());
request.setAttribute("total", result.getTotal());
request.getRequestDispatcher("/book/list.html").forward(request, response);
}
3.2 借阅业务处理
借阅业务需要考虑并发控制和事务管理。关键点包括:
- 使用数据库事务确保数据一致性
- 添加乐观锁防止超借
- 记录完整的操作日志
4. Thymeleaf模板开发技巧
4.1 列表展示与分页
在Thymeleaf中展示图书列表并实现分页:
html复制<table class="table">
<thead>
<tr>
<th>ISBN</th>
<th>书名</th>
<th>作者</th>
<th>出版社</th>
<th>价格</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr th:each="book : ${bookList}">
<td th:text="${book.isbn}"></td>
<td th:text="${book.title}"></td>
<td th:text="${book.author}"></td>
<td th:text="${book.publisher}"></td>
<td th:text="${#numbers.formatDecimal(book.price, 1, 2)}"></td>
<td>
<span th:if="${book.status == 1}" class="badge bg-success">可借</span>
<span th:if="${book.status == 0}" class="badge bg-danger">已借出</span>
</td>
</tr>
</tbody>
</table>
<nav>
<ul class="pagination">
<li class="page-item" th:classappend="${currentPage == 1} ? 'disabled'">
<a class="page-link" th:href="@{/book/list(page=${currentPage-1},size=${pageSize})}">上一页</a>
</li>
<li class="page-item" th:each="i : ${#numbers.sequence(1, totalPages)}"
th:classappend="${i == currentPage} ? 'active'">
<a class="page-link" th:href="@{/book/list(page=${i},size=${pageSize})}"
th:text="${i}"></a>
</li>
<li class="page-item" th:classappend="${currentPage == totalPages} ? 'disabled'">
<a class="page-link" th:href="@{/book/list(page=${currentPage+1},size=${pageSize})}">下一页</a>
</li>
</ul>
</nav>
4.2 表单处理与验证
图书添加/编辑表单需要注意:
- 使用Thymeleaf的th:object绑定表单对象
- 客户端和服务端双重验证
- 合理的错误提示展示
示例表单:
html复制<form th:action="@{/book/save}" th:object="${book}" method="post">
<div class="mb-3">
<label for="isbn" class="form-label">ISBN</label>
<input type="text" class="form-control" id="isbn" th:field="*{isbn}"
required minlength="10" maxlength="20">
<div class="invalid-feedback" th:if="${#fields.hasErrors('isbn')}"
th:errors="*{isbn}"></div>
</div>
<div class="mb-3">
<label for="title" class="form-label">书名</label>
<input type="text" class="form-control" id="title" th:field="*{title}"
required maxlength="100">
</div>
<!-- 其他表单字段 -->
<button type="submit" class="btn btn-primary">保存</button>
</form>
5. 项目部署与优化
5.1 使用Tomcat部署
将项目打包成war文件部署到Tomcat时需要注意:
- 确保web.xml中配置了正确的servlet映射
- 数据库连接池配置要放在合适的位置
- 静态资源路径要正确配置
5.2 性能优化建议
- 数据库连接池配置(推荐使用HikariCP):
properties复制# application.properties
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
- 启用Thymeleaf缓存(生产环境):
properties复制spring.thymeleaf.cache=true
- 静态资源版本控制:
html复制<link th:href="@{/css/style.css(v=${@environment.getProperty('app.version')})}"
rel="stylesheet">
6. 常见问题排查
6.1 Thymeleaf模板解析失败
可能原因及解决方案:
- 模板文件位置不正确 - 确保放在src/main/resources/templates目录下
- 变量未正确传递 - 检查Servlet中request.setAttribute()调用
- 表达式语法错误 - 使用IDE的Thymeleaf插件检查语法
6.2 MySQL连接问题
典型错误及解决方法:
- 时区问题 - 连接URL添加serverTimezone=Asia/Shanghai
- 驱动版本不匹配 - 使用与MySQL版本对应的驱动
- 连接泄露 - 确保所有Connection、Statement、ResultSet都正确关闭
6.3 Maven依赖冲突
解决方法:
- 使用mvn dependency:tree查看依赖树
- 使用exclusions排除冲突依赖
- 使用dependencyManagement统一管理版本
7. 项目扩展建议
- 添加Redis缓存热门图书信息
- 实现Elasticsearch全文检索
- 开发RESTful API供移动端使用
- 集成Spring Security实现细粒度权限控制
- 使用Quartz实现定时任务(如逾期提醒)
在实际开发中,我发现这套技术栈虽然传统但非常稳定可靠。特别是对于学校或小型机构的图书管理系统,完全能够满足需求。如果项目规模扩大,可以考虑逐步引入Spring Boot等框架来简化配置。
