news 2026/9/23 15:06:46

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/9/20 15:11:14

自媒体创作者福音:VibeVoice实现日更播客自由

自媒体创作者福音&#xff1a;VibeVoice实现日更播客自由 你是否经历过这样的深夜&#xff1a; 写完三千字播客稿&#xff0c;却卡在录音环节——反复重录十遍&#xff0c;还是不满意语气&#xff1b; 约好的嘉宾临时失联&#xff0c;整期节目面临停更&#xff1b; 想做系列儿…

作者头像 李华
网站建设 2026/9/20 21:38:56

鸣鸣很忙港股上市:市值超900亿港元 红杉与好想你是股东 腾讯加持

雷递网 雷建平 1月28日休闲食品饮料连锁零售商——湖南鸣鸣很忙商业连锁股份有限公司&#xff08;简称“鸣鸣很忙”&#xff0c;股份代号为01768&#xff09;今日在港交所主板挂牌上市&#xff0c;成为“量贩零食港股第一股”。鸣鸣很忙此次全球发售1551万股&#xff0c;发行23…

作者头像 李华
网站建设 2026/9/19 13:21:41

Qwen3-32B GPU利用率提升方案:Clawdbot网关层请求批处理优化实践

Qwen3-32B GPU利用率提升方案&#xff1a;Clawdbot网关层请求批处理优化实践 1. 问题背景&#xff1a;为什么Qwen3-32B在Clawdbot中“跑不满” 你有没有遇到过这种情况&#xff1a;明明部署了Qwen3-32B这样参数量庞大的模型&#xff0c;显存也够、GPU型号也不差&#xff0c;但…

作者头像 李华
网站建设 2026/9/21 2:49:08

万物识别镜像实测效果:校园场景下物体识别表现

万物识别镜像实测效果&#xff1a;校园场景下物体识别表现 你有没有试过站在大学教学楼前&#xff0c;用手机拍一张照片&#xff0c;然后好奇地问&#xff1a;“AI能认出这张图里有多少种东西&#xff1f;黑板、投影仪、课桌、绿植、甚至角落里的扫把——它真能分得清吗&#…

作者头像 李华
网站建设 2026/9/20 23:48:36

Qwen3-VL-8B-Instruct-GGUF快速上手:谷歌浏览器直连7860端口测试图文问答

Qwen3-VL-8B-Instruct-GGUF快速上手&#xff1a;谷歌浏览器直连7860端口测试图文问答 1. 这个模型到底能干啥&#xff1f;一句话说清 你可能已经听过“多模态大模型”这个词&#xff0c;但真正能在自己电脑上跑起来的&#xff0c;不多。Qwen3-VL-8B-Instruct-GGUF 就是那个“…

作者头像 李华
网站建设 2026/9/19 13:21:42

用VibeVoice做短视频配音,效率提升不止一点点

用VibeVoice做短视频配音&#xff0c;效率提升不止一点点 你有没有遇到过这样的情况&#xff1a;刚剪完一条30秒的带货短视频&#xff0c;正准备配旁白&#xff0c;结果发现—— 找配音员要等两天&#xff0c;自己录又卡顿、忘词、语气生硬&#xff1b; 用普通TTS工具&#xf…

作者头像 李华