基于JSP+Servlet的在线图书销售系统 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-03-014 浏览

文章摘要

本项目是一款基于JSP与Servlet技术栈构建的在线图书销售平台,旨在为图书零售商和广大读者提供一个功能完整、操作便捷的线上购书环境。其核心业务价值在于解决了传统实体书店在空间、时间和地域上的限制,通过数字化商城模式,有效降低了运营成本,并极大地拓展了客户覆盖范围,满足了用户随时随地浏览和购买图书...

在数字化阅读日益普及的今天,传统图书零售行业面临着转型升级的关键节点。一款基于JSP+Servlet技术架构的在线图书销售平台应运而生,该系统被命名为"BookHub Pro",旨在为图书零售商和读者构建一个功能完备、操作便捷的线上购书环境。

BookHub Pro采用经典的三层架构设计,表现层使用JSP技术实现动态页面渲染,业务逻辑层通过Servlet控制器处理各类请求,数据持久层则基于JDBC与MySQL数据库进行交互。这种架构确保了系统的高内聚低耦合特性,为后续功能扩展和维护提供了良好的基础。

数据库设计深度解析

系统共设计20张数据表,覆盖用户管理、图书信息、订单处理等核心业务模块。其中几个关键表的设计体现了良好的数据库规范化理念。

用户表(t_user)采用纵向分表设计,将基础信息与详细资料分离:

CREATE TABLE t_user (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    user_type ENUM('customer', 'admin') DEFAULT 'customer',
    register_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_login_time DATETIME,
    status ENUM('active', 'inactive') DEFAULT 'active'
);

CREATE TABLE t_user_profile (
    profile_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    full_name VARCHAR(100),
    phone VARCHAR(20),
    gender ENUM('male', 'female'),
    birth_date DATE,
    FOREIGN KEY (user_id) REFERENCES t_user(user_id) ON DELETE CASCADE
);

这种设计既保证了查询效率,又避免了单表字段过多的问题,同时支持用户信息的灵活扩展。

图书信息表(t_book)采用星型模式设计,与分类表、出版社表形成关联:

CREATE TABLE t_book (
    book_id INT PRIMARY KEY AUTO_INCREMENT,
    isbn VARCHAR(20) UNIQUE NOT NULL,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    publisher_id INT NOT NULL,
    category_id INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock_quantity INT DEFAULT 0,
    description TEXT,
    cover_image VARCHAR(200),
    publish_date DATE,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_category (category_id),
    INDEX idx_publisher (publisher_id),
    FOREIGN KEY (publisher_id) REFERENCES t_publisher(publisher_id),
    FOREIGN KEY (category_id) REFERENCES t_category(category_id)
);

通过建立适当的索引和外键约束,确保了数据一致性和查询性能。

订单表(t_order)采用主从表结构设计,支持复杂的订单业务逻辑:

CREATE TABLE t_order (
    order_id VARCHAR(32) PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    shipping_address TEXT NOT NULL,
    payment_method ENUM('credit_card', 'paypal', 'bank_transfer') NOT NULL,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_time DATETIME ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_user_status (user_id, status),
    FOREIGN KEY (user_id) REFERENCES t_user(user_id)
);

CREATE TABLE t_order_item (
    item_id INT PRIMARY KEY AUTO_INCREMENT,
    order_id VARCHAR(32) NOT NULL,
    book_id INT NOT NULL,
    quantity INT NOT NULL,
    unit_price DECIMAL(10,2) NOT NULL,
    subtotal DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES t_order(order_id) ON DELETE CASCADE,
    FOREIGN KEY (book_id) REFERENCES t_book(book_id)
);

核心功能实现深度解析

  1. 用户认证与权限管理 系统采用基于Session的认证机制,支持用户注册、登录和权限验证。LoginServlet负责处理用户登录请求:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        UserService userService = new UserService();
        User user = userService.authenticate(username, password);
        
        if (user != null) {
            HttpSession session = request.getSession();
            session.setAttribute("currentUser", user);
            session.setMaxInactiveInterval(30 * 60); // 30分钟超时
            
            if (user.getUserType().equals("admin")) {
                response.sendRedirect("admin/dashboard.jsp");
            } else {
                response.sendRedirect("index.jsp");
            }
        } else {
            request.setAttribute("errorMessage", "用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

用户登录界面

  1. 图书搜索与分类浏览 系统实现多条件图书搜索功能,支持按书名、作者、分类等维度查询。BookSearchServlet处理复杂的查询逻辑:
@WebServlet("/search")
public class BookSearchServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String keyword = request.getParameter("keyword");
        String categoryId = request.getParameter("category");
        String minPrice = request.getParameter("minPrice");
        String maxPrice = request.getParameter("maxPrice");
        int page = Integer.parseInt(request.getParameter("page") != null ? 
                request.getParameter("page") : "1");
        
        BookService bookService = new BookService();
        SearchCriteria criteria = new SearchCriteria(keyword, categoryId, minPrice, maxPrice);
        PageResult<Book> result = bookService.searchBooks(criteria, page, 12);
        
        request.setAttribute("searchResult", result);
        request.setAttribute("searchCriteria", criteria);
        request.getRequestDispatcher("book-list.jsp").forward(request, response);
    }
}

分类浏览界面

  1. 购物车管理 购物车功能采用Session存储临时数据,支持商品添加、数量修改和批量删除:
@WebServlet("/cart")
public class CartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String action = request.getParameter("action");
        HttpSession session = request.getSession();
        ShoppingCart cart = (ShoppingCart) session.getAttribute("shoppingCart");
        
        if (cart == null) {
            cart = new ShoppingCart();
            session.setAttribute("shoppingCart", cart);
        }
        
        if ("add".equals(action)) {
            int bookId = Integer.parseInt(request.getParameter("bookId"));
            int quantity = Integer.parseInt(request.getParameter("quantity"));
            Book book = new BookService().getBookById(bookId);
            
            CartItem item = new CartItem(book, quantity);
            cart.addItem(item);
            
        } else if ("update".equals(action)) {
            // 更新购物车商品数量逻辑
        } else if ("remove".equals(action)) {
            // 移除商品逻辑
        }
        
        response.sendRedirect("cart.jsp");
    }
}

购物车界面

  1. 订单处理流程 订单生成涉及库存检查、价格计算、支付状态跟踪等复杂业务逻辑:
@WebServlet("/checkout")
public class CheckoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("currentUser");
        ShoppingCart cart = (ShoppingCart) session.getAttribute("shoppingCart");
        
        if (user == null) {
            response.sendRedirect("login.jsp");
            return;
        }
        
        OrderService orderService = new OrderService();
        try {
            // 库存验证
            if (!orderService.validateStock(cart.getItems())) {
                request.setAttribute("errorMessage", "部分商品库存不足");
                request.getRequestDispatcher("cart.jsp").forward(request, response);
                return;
            }
            
            // 生成订单
            Order order = orderService.createOrder(user, cart, 
                    request.getParameter("shippingAddress"),
                    request.getParameter("paymentMethod"));
            
            // 清空购物车
            session.removeAttribute("shoppingCart");
            
            response.sendRedirect("order-confirmation.jsp?orderId=" + order.getOrderId());
            
        } catch (BusinessException e) {
            request.setAttribute("errorMessage", e.getMessage());
            request.getRequestDispatcher("checkout.jsp").forward(request, response);
        }
    }
}

订单提交界面

  1. 后台管理系统 管理员界面提供完整的商品管理、订单处理、用户管理等功能:
@WebServlet("/admin/books")
public class BookManagementServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 权限验证
        if (!isAdmin(request)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return;
        }
        
        String action = request.getParameter("action");
        BookService bookService = new BookService();
        
        switch (action) {
            case "add":
                Book newBook = extractBookFromRequest(request);
                bookService.addBook(newBook);
                break;
            case "update":
                Book updatedBook = extractBookFromRequest(request);
                bookService.updateBook(updatedBook);
                break;
            case "delete":
                int bookId = Integer.parseInt(request.getParameter("bookId"));
                bookService.deleteBook(bookId);
                break;
        }
        
        response.sendRedirect("book-management.jsp");
    }
}

图书管理界面

实体模型设计

系统采用面向对象的设计思想,构建了完整的实体模型体系。核心实体包括:

public class Book {
    private int bookId;
    private String isbn;
    private String title;
    private String author;
    private Publisher publisher;
    private Category category;
    private BigDecimal price;
    private int stockQuantity;
    private String description;
    private String coverImage;
    private Date publishDate;
    // 省略getter/setter方法
}

public class User {
    private int userId;
    private String username;
    private String password;
    private String email;
    private UserType userType;
    private Date registerTime;
    private UserProfile profile;
    // 省略getter/setter方法
}

public class Order {
    private String orderId;
    private User user;
    private List<OrderItem> items;
    private BigDecimal totalAmount;
    private OrderStatus status;
    private String shippingAddress;
    private PaymentMethod paymentMethod;
    private Date createdTime;
    // 省略getter/setter方法
}

技术架构优化特点

  1. MVC模式严格分离:Servlet作为控制器负责请求分发,JSP专注于视图呈现,JavaBean处理业务逻辑,实现了清晰的职责分离。

  2. 数据库连接池优化:采用连接池技术管理数据库连接,显著提升系统性能:

public class ConnectionPool {
    private static DataSource dataSource;
    
    static {
        try {
            Context context = new InitialContext();
            dataSource = (DataSource) context.lookup("java:comp/env/jdbc/bookstore");
        } catch (NamingException e) {
            throw new RuntimeException("数据库连接池初始化失败", e);
        }
    }
    
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
  1. 事务管理机制:关键业务操作采用事务保证数据一致性:
public class OrderService {
    public Order createOrder(User user, ShoppingCart cart, String address, String paymentMethod) 
            throws BusinessException {
        Connection conn = null;
        try {
            conn = ConnectionPool.getConnection();
            conn.setAutoCommit(false);
            
            // 执行订单创建逻辑
            Order order = generateOrder(user, cart, address, paymentMethod);
            updateInventory(conn, cart.getItems());
            recordPayment(conn, order);
            
            conn.commit();
            return order;
            
        } catch (SQLException e) {
            if (conn != null) {
                try { conn.rollback(); } catch (SQLException ex) {}
            }
            throw new BusinessException("订单创建失败: " + e.getMessage());
        } finally {
            if (conn != null) {
                try { conn.close(); } catch (SQLException e) {}
            }
        }
    }
}

系统安全机制

  1. SQL注入防护:全面使用PreparedStatement防止SQL注入攻击:
public class UserDAO {
    public User findByUsername(String username) {
        String sql = "SELECT * FROM t_user WHERE username = ? AND status = 'active'";
        try (Connection conn = ConnectionPool.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, username);
            ResultSet rs = pstmt.executeQuery();
            
            if (rs.next()) {
                return extractUserFromResultSet(rs);
            }
        } catch (SQLException e) {
            throw new DataAccessException("查询用户失败", e);
        }
        return null;
    }
}
  1. 密码安全存储:采用SHA-256加盐哈希算法保护用户密码:
public class PasswordUtil {
    private static final String SALT = "BookHubPro2024";
    
    public static String hashPassword(String password) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            String combined = password + SALT;
            byte[] hash = digest.digest(combined.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(hash);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("密码加密失败", e);
        }
    }
    
    public static boolean verifyPassword(String inputPassword, String storedHash) {
        return hashPassword(inputPassword).equals(storedHash);
    }
}

性能优化策略

  1. 页面静态化:对不常变动的页面内容实施静态化处理:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/common/header.jsp" %>
<c:if test="${not empty bookList}">
    <div class="book-grid">
        <c:forEach var="book" items="${bookList}">
            <div class="book-item">
                <img src="${pageContext.request.contextPath}/images/books/${book.coverImage}" 
                     alt="${book.title}">
                <h3>${book.title}</h3>
                <p class="author">${book.author}</p>
                <p class="price">¥${book.price}</p>
                <button onclick="addToCart(${book.bookId})">加入购物车</button>
            </div>
        </c:forEach>
    </div>
</c:if>
  1. 数据库查询优化:通过索引优化和查询重构提升性能:
-- 为常用查询字段创建复合索引
CREATE INDEX idx_book_search ON t_book(title, author, category_id);
CREATE INDEX idx_order_user_date ON t_order(user_id, created_time DESC);

-- 使用覆盖索引优化统计查询
SELECT COUNT(*) FROM t_book WHERE category_id = ? AND price BETWEEN ? AND ?;

未来优化方向

  1. 微服务架构迁移:将单体应用拆分为用户服务、商品服务、订单服务等独立微服务,提升系统可扩展性和维护性。采用Spring Cloud框架实现服务治理、配置管理和负载均衡。

  2. 前后端分离重构:使用Vue.js或React构建前端SPA应用,后端提供RESTful API接口。这种架构能够显著改善用户体验,支持移动端App开发。

  3. 搜索引擎集成:引入Elasticsearch实现更强大的图书搜索功能,支持全文检索、拼音搜索、同义词扩展和搜索词推荐等高级特性。

  4. 缓存策略优化:实施多级缓存架构,使用Redis缓存热点数据和会话信息,减少数据库访问压力。实现本地缓存与分布式缓存的协同工作。

  5. 大数据分析平台:构建用户行为分析系统,通过收集和分析用户浏览、搜索、购买等行为数据,为个性化推荐和精准营销提供数据支持。

  6. 云原生部署:采用Docker容器化部署,结合Kubernetes实现自动化运维,提升系统弹性和资源利用率。

BookHub Pro系统通过严谨的架构设计和深入的技术实现,为传统图书零售行业提供了完整的数字化转型解决方案。其模块化设计、安全机制和性能优化策略为后续的技术演进奠定了坚实基础,具备良好的可持续发展能力。

本文关键词
JSPServlet在线图书销售系统源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章