news 2026/6/10 19:40:49

JavaWeb实战:从零构建图书管理系统(含完整源码与部署指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaWeb实战:从零构建图书管理系统(含完整源码与部署指南)

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) );

建表时踩过的坑提醒:

  1. 密码字段要用CHAR(32)存MD5值,千万别明文存储
  2. 外键关联一定要加,这是数据完整性的保障
  3. 给常用查询字段加索引,比如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"); } } }

几个关键点:

  1. 密码加盐加密(重要!)
  2. 使用Session维持登录状态
  3. 前后端参数校验
  4. 管理员与普通用户路由分离

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的注意事项:

  1. Deployment选项卡要添加war exploded
  2. Application context要设置为/
  3. 建议勾选"Update classes and resources"热部署
  4. 端口冲突时修改conf/server.xml

4.2 常见问题排查

  1. 中文乱码问题:

    • JSP页面头加<%@ page contentType="text/html;charset=UTF-8" %>
    • Servlet加request.setCharacterEncoding("UTF-8")
    • 数据库连接串加?useUnicode=true&characterEncoding=utf8
  2. 404错误排查步骤:

    • 检查URL拼写
    • 确认web.xml配置或注解配置
    • 查看Tomcat日志catalina.out
  3. 数据库连接失败:

    • 检查mysql-connector-java版本
    • 确认数据库服务已启动
    • 测试账号权限

这个项目源码我已经打包好,包含数据库脚本和详细配置文档。建议先按照文档把环境搭起来,然后跟着核心模块逐个实现,遇到问题可以查看源码中的注释说明。

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

本地部署太难?试试GLM-4.6V-Flash-WEB一键脚本

本地部署太难&#xff1f;试试GLM-4.6V-Flash-WEB一键脚本 你是不是也经历过&#xff1a;看到一个惊艳的视觉大模型&#xff0c;兴致勃勃点开文档&#xff0c;结果卡在第一步——环境装不起来、依赖报错、CUDA版本对不上、模型权重下到一半断连……最后关掉终端&#xff0c;默…

作者头像 李华
网站建设 2026/6/10 11:18:49

Open-AutoGLM控制智能家居,语音指令秒执行

Open-AutoGLM控制智能家居&#xff0c;语音指令秒执行 你有没有想过&#xff0c;对着手机说一句“把空调调到26度、打开加湿器、关掉卧室灯”&#xff0c;三台设备就自动响应&#xff1f;这不是科幻电影——Open-AutoGLM 已经让这件事在真实安卓手机上稳定运行。它不依赖厂商SD…

作者头像 李华
网站建设 2026/6/10 13:07:21

麦克风权限问题解决,科哥ASR镜像使用小贴士

麦克风权限问题解决&#xff0c;科哥ASR镜像使用小贴士 1. 为什么麦克风总是“拒绝合作”&#xff1f; 你点开「实时录音」Tab&#xff0c;鼠标悬停在那个醒目的麦克风图标上&#xff0c;满怀期待地准备开口说话——结果浏览器弹出一个模糊的提示框&#xff0c;或者干脆什么反…

作者头像 李华
网站建设 2026/6/9 22:29:49

阿里达摩院GTE中文大模型部署案例:中文电子病历症状描述标准化映射

阿里达摩院GTE中文大模型部署案例&#xff1a;中文电子病历症状描述标准化映射 在医疗AI落地实践中&#xff0c;一个常被忽视却极为关键的瓶颈浮出水面&#xff1a;医生手写的电子病历中&#xff0c;对同一症状的描述五花八门——“胸口闷”“心口发紧”“前胸压榨感”“像石头…

作者头像 李华
网站建设 2026/6/10 13:13:18

零售行业创新:InstructPix2Pix驱动虚拟试穿体验

零售行业创新&#xff1a;InstructPix2Pix驱动虚拟试穿体验 1. 这不是滤镜&#xff0c;是能听懂你说话的AI修图师 你有没有想过&#xff0c;顾客在手机上点一下&#xff0c;就能“穿上”一件新衣服&#xff0c;连衣摆飘动的角度、面料反光的质感都真实得像站在试衣镜前&#…

作者头像 李华
网站建设 2026/6/10 13:10:20

快速理解ST7789显示模块:核心要点解析

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。我以一位长期深耕嵌入式显示驱动开发的工程师视角,重新组织逻辑、强化实践导向、剔除AI腔调,并大幅增强可读性、教学性与工程落地感。全文已彻底去除模板化标题、空洞总结和机械分段,代之以自然流畅的技术…

作者头像 李华