1. 项目概述与开发环境搭建
图书管理系统是JavaWeb入门级项目的经典案例,它涵盖了用户认证、数据增删改查、前后端交互等核心功能。这个项目特别适合刚学完JavaWeb基础的同学练手,我当年第一个能跑起来的项目就是图书管理系统,虽然界面丑得没法看,但功能跑通时的成就感至今难忘。
1.1 技术选型说明
我们采用最经典的Servlet+JSP组合,这是JavaWeb最原始但最有效的技术方案。有同学可能会问为什么不用SpringBoot?其实对于初学者来说,先理解底层原理更重要。就像学开车要先学手动挡,掌握了Servlet才能更好理解后来的框架。
开发环境需要准备:
- JDK 1.8(别用新版,避免兼容性问题)
- Tomcat 8.5(实测9.0也行但配置更麻烦)
- MySQL 5.7(8.0版本需要改驱动配置)
- Eclipse/IDEA(推荐IDEA社区版,免费够用)
1.2 数据库设计实战
图书管理系统的核心是这几张表:
CREATE TABLE books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, author VARCHAR(50), category VARCHAR(30), status TINYINT DEFAULT 1 COMMENT '1可借阅 0已借出' ); CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(30) UNIQUE NOT NULL, password VARCHAR(32) NOT NULL, role TINYINT DEFAULT 0 COMMENT '0读者 1管理员' ); CREATE TABLE borrow_records ( id INT PRIMARY KEY AUTO_INCREMENT, book_id INT NOT NULL, user_id INT NOT NULL, borrow_time DATETIME DEFAULT CURRENT_TIMESTAMP, return_time DATETIME, FOREIGN KEY (book_id) REFERENCES books(id), FOREIGN KEY (user_id) REFERENCES users(id) );建表时踩过的坑提醒:
- 密码字段要用CHAR(32)存MD5值,千万别明文存储
- 外键关联一定要加,这是数据完整性的保障
- 给常用查询字段加索引,比如books.title
2. 核心功能实现详解
2.1 用户认证模块
登录功能看着简单,但安全细节很多。来看我优化后的Servlet代码:
@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String rawPassword = request.getParameter("password"); // 参数校验 if(StringUtils.isEmpty(username) || StringUtils.isEmpty(rawPassword)) { request.setAttribute("error", "用户名密码不能为空"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } // 密码加密比对 String encryptedPwd = DigestUtils.md5Hex(rawPassword + "salt"); User user = userDao.findByUsernameAndPassword(username, encryptedPwd); if(user == null) { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } else { // 会话管理 HttpSession session = request.getSession(); session.setAttribute("currentUser", user); response.sendRedirect(user.isAdmin() ? "/admin/home" : "/user/home"); } } }几个关键点:
- 密码加盐加密(重要!)
- 使用Session维持登录状态
- 前后端参数校验
- 管理员与普通用户路由分离
2.2 图书管理CRUD
图书增删改查要注意事务处理,这里用JDBC事务示例:
public class BookService { public boolean addBook(Book book) { Connection conn = null; try { conn = DBUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 // 检查图书是否已存在 if(bookDao.exists(book.getIsbn())) { throw new RuntimeException("ISBN已存在"); } // 主表插入 int bookId = bookDao.insert(book); // 库存记录 inventoryDao.insert(new Inventory(bookId, 1)); conn.commit(); return true; } catch (Exception e) { if(conn != null) { conn.rollback(); } throw e; } finally { DBUtil.close(conn); } } }3. 前端页面优化技巧
3.1 JSP避免脚本污染
很多教程的JSP页面充斥着Java代码,应该用JSTL标签替代:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table class="table"> <c:forEach items="${bookList}" var="book"> <tr> <td>${book.title}</td> <td> <c:if test="${book.status == 1}"> <span class="badge badge-success">可借阅</span> </c:if> <c:if test="${book.status == 0}"> <span class="badge badge-danger">已借出</span> </c:if> </td> </tr> </c:forEach> </table>3.2 分页查询实现
后端分页逻辑(MySQL语法):
public Page<Book> queryBooks(int pageNum, int pageSize) { String sql = "SELECT * FROM books LIMIT ?,?"; List<Book> data = jdbcTemplate.query( sql, new BeanPropertyRowMapper<>(Book.class), (pageNum-1)*pageSize, pageSize ); int total = jdbcTemplate.queryForObject( "SELECT COUNT(*) FROM books", Integer.class); return new Page<>(data, pageNum, pageSize, total); }前端分页组件配合:
<div class="pagination"> <c:forEach begin="1" end="${page.totalPage}" var="i"> <a href="?page=${i}" class="${i == page.pageNum ? 'active' : ''}">${i}</a> </c:forEach> </div>4. 项目部署与调试
4.1 Tomcat配置要点
在IDEA中配置Tomcat的注意事项:
- Deployment选项卡要添加war exploded
- Application context要设置为/
- 建议勾选"Update classes and resources"热部署
- 端口冲突时修改conf/server.xml
4.2 常见问题排查
中文乱码问题:
- JSP页面头加
<%@ page contentType="text/html;charset=UTF-8" %> - Servlet加
request.setCharacterEncoding("UTF-8") - 数据库连接串加
?useUnicode=true&characterEncoding=utf8
- JSP页面头加
404错误排查步骤:
- 检查URL拼写
- 确认web.xml配置或注解配置
- 查看Tomcat日志catalina.out
数据库连接失败:
- 检查mysql-connector-java版本
- 确认数据库服务已启动
- 测试账号权限
这个项目源码我已经打包好,包含数据库脚本和详细配置文档。建议先按照文档把环境搭起来,然后跟着核心模块逐个实现,遇到问题可以查看源码中的注释说明。